C'è un modo per generare uno script di creazione da una tabella esistente puramente in T-SQL (ovvero senza usare SMO, poiché T-SQL non ha accesso a SMO). Diciamo una procedura memorizzata che riceve un nome di tabella e restituisce una stringa che contiene lo script di creazione per la tabella data?
Ora lasciami descrivere la situazione che sto affrontando, in quanto potrebbe esserci un modo diverso di affrontarlo. Ho un'istanza con diverse dozzine di database. Questi database hanno tutti lo stesso schema, tutte le stesse tabelle, indice e così via. Sono stati creati come parte di un'installazione software di terze parti. Devo avere un modo di lavorare con loro in modo da poter aggregare i dati da loro in maniera ad hoc. Le persone simpatiche su dba.se mi hanno già aiutato qui Come creare un trigger in un database diverso?
Attualmente ho bisogno di trovare un modo per effettuare una selezione da una tabella in tutti i database. Ho registrato tutti i nomi dei database in una tabella chiamata Databasees
e ho scritto il seguente script per eseguire un'istruzione select su tutti loro:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp
select * into #tmp from Database1.dbo.Table1 where 1=0
DECLARE @statement nvarchar(max) =
N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1'
DECLARE @LastDatabaseID INT
SET @LastDatabaseID = 0
DECLARE @DatabaseNameToHandle varchar(60)
DECLARE @DatabaseIDToHandle int
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
WHILE @DatabaseIDToHandle IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX) = QUOTENAME(@DatabaseNameToHandle) + '.dbo.sp_executesql'
EXEC @sql @statement
SET @LastDatabaseID = @DatabaseIDToHandle
SET @DatabaseIDToHandle = NULL
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
END
select * from #tmp
DROP TABLE #tmp
Tuttavia lo script precedente non riesce con il seguente messaggio:
Un valore esplicito per la colonna identità nella tabella '#tmp' può essere specificato solo quando viene utilizzato un elenco di colonne e IDENTITY_INSERT è ON.
Aggiungendo questo:
SET IDENTITY_INSERT #tmp ON
non aiuta, poiché non posso specificare l'elenco di colonne e mantenerlo generico.
In SQL non è possibile disattivare l'identità su una determinata tabella. Puoi solo rilasciare una colonna e aggiungere una colonna, che ovviamente cambia l'ordine delle colonne. E se l'ordine delle colonne cambia, è necessario, ancora una volta, specificare l'elenco delle colonne, che sarebbe diverso a seconda della tabella in cui si esegue la query.
Quindi pensavo che se avessi potuto ottenere lo script di creazione della tabella nel mio codice T-SQL, avrei potuto manipolarlo con espressioni di manipolazione delle stringhe per rimuovere la colonna di identità e anche aggiungere una colonna per il nome del database al set di risultati.
Qualcuno può pensare a un modo relativamente semplice per ottenere ciò che voglio?