35 messaggi dal 06 ottobre 2004
Ciao a tutti,
dovrei eseguire una query, la stessa, per tutte le tabelle presenti in un database. Più precisamente:

ALTER TABLE nometabella NOCHECK CONSTRAINT ALL

Dato che il database (MS SQL 2000) contiene parecchie tabelle, mi chiedevo se c'era un metodo per evitare di scrivere una riga per ogni tabella.

rv
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
robertovecchi ha scritto:
Ciao a tutti,
dovrei eseguire una query, la stessa, per tutte le tabelle presenti in un database. Più precisamente:

ALTER TABLE nometabella NOCHECK CONSTRAINT ALL

Dato che il database (MS SQL 2000) contiene parecchie tabelle, mi chiedevo se c'era un metodo per evitare di scrivere una riga per ogni tabella.


puoi interrogare INFORMATION_SCHEMA, definendoti lo script di outupt ad esempio similarmente a
SET NOCOUNT ON;
USE Pubs;
GO
SELECT 'ALTER TABLE ' + QUOTENAME(i.TABLE_SCHEMA) + '.' + QUOTENAME(i.TABLE_NAME) + CHAR(10) + CHAR(9) + 'NOCHECK CONSTRAINT ALL;'
FROM INFORMATION_SCHEMA.TABLES i
WHERE i.TABLE_TYPE = 'BASE TABLE';
--<------
ALTER TABLE [dbo].[publishers]
NOCHECK CONSTRAINT ALL;
ALTER TABLE [dbo].[titles]
NOCHECK CONSTRAINT ALL;
etc....

il risultato restituito puo' quindi essere verificato ed editato prima di essere esguito...

puoi anche utilizzare un sistema non documentato, basato su una stored procedure NON DOCUMENTATA, che cicla tutte le tabelle eseguendo il comando provvisto, similarmente a
SET NOCOUNT ON;
USE Pubs;
GO
EXEC sp_MSforeachtable @command1="ALTER TABLE '?' NOCHECK CONSTRAINT ALL;"

personalmente preferisco la prima soluzione, se da eseguirsi sporadicamente, visto che restituisce uno script editabile ed eventualmente customizzabile..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
194 messaggi dal 13 dicembre 2005
Stored Procedure:

DECLARE @NameTable as nvarchar(400)
DECLARE AllTables CURSOR FOR
select [NAME] from sysobjects where type = 'U'
OPEN AllTables
FETCH NEXT FROM AllTables INTO @NameTable
WHILE @@FETCH_STATUS = 0
BEGIN
   print  @Nametable
   FETCH NEXT FROM AllTables
END
CLOSE AllTables
DEALLOCATE AllTables



al posto di
print  @Nametable


scrivi

ALTER TABLE @Nametable NOCHECK CONSTRAINT ALL 


al posto dell'altro metodo.
lo fa per tutte le tabelle utente
35 messaggi dal 06 ottobre 2004
Grazie ragazzi.

C'è solo un piccolo problema nella query:

DECLARE @NameTable as nvarchar(400) 
DECLARE AllTables CURSOR FOR 
select [NAME] from sysobjects where type = 'U' 
OPEN AllTables 
FETCH NEXT FROM AllTables INTO @NameTable 
WHILE @@FETCH_STATUS = 0 
BEGIN 
  ALTER TABLE @NameTable NOCHECK CONSTRAINT ALLFETCH NEXT FROM AllTables 
END 
CLOSE AllTables 
DEALLOCATE AllTables 


che mi restituisce il seguente errore:
Server: messaggio 170, livello 15, stato 1, riga 8
Riga 8: sintassi non corretta in prossimità di '@NameTable'.


Dove sbaglio ?

rv
194 messaggi dal 13 dicembre 2005
Prova in questo modo:

DECLARE @SQL as nvarchar(400)
DECLARE AllTables CURSOR FOR 
select [NAME] from sysobjects where type = 'U' 
OPEN AllTables 
FETCH NEXT FROM AllTables INTO @NameTable 
WHILE @@FETCH_STATUS = 0 
BEGIN 
set @SQL=ALTER TABLE ' + @NameTable + ' NOCHECK CONSTRAINT ALL'
exec (@SQL)

FETCH NEXT FROM AllTables 
END 
CLOSE AllTables 
DEALLOCATE AllTables 

35 messaggi dal 06 ottobre 2004
..... bellissimo.

Ho solo dovuto modificare la 2° FETCH aggiungendovi ...into @nametable altrimenti lavorava solo sulla prima tabella trovata.

Il codice completo che utilizzo è:

DECLARE @SQL as nvarchar(400) 
DECLARE @NameTable as nvarchar(400) 
DECLARE AllTables CURSOR FOR 
  select [NAME] from sysobjects where type = 'U' 
OPEN AllTables 
FETCH NEXT FROM AllTables INTO @NameTable 
WHILE @@FETCH_STATUS = 0 
BEGIN 
  set @SQL='ALTER TABLE ' + @NameTable + ' NOCHECK CONSTRAINT ALL' 
  exec (@SQL) 
  FETCH NEXT FROM AllTables into @NameTable
END 
CLOSE AllTables 
DEALLOCATE AllTables 


Grazie a tutti.

rv
194 messaggi dal 13 dicembre 2005
Perfetto!!!
Avevo scordato l'ultima parte.

Sono contenta perchè era all'incirca un anno che non scrivevo script SQL e vedo che comunque non ho perso la mano del tutto.

Ciao
Laura

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.