Existe uma maneira de gerar um script de criação a partir de uma tabela existente puramente no T-SQL (ou seja, sem usar o SMO, pois o T-SQL não tem acesso ao SMO). Digamos que um procedimento armazenado que recebe um nome de tabela e retorne uma string que contém o script de criação para a tabela especificada?
Agora, deixe-me descrever a situação que estou enfrentando, pois pode haver uma maneira diferente de abordar isso. Eu tenho uma instância com várias dezenas de bancos de dados. Todos esses bancos de dados têm o mesmo esquema, as mesmas tabelas, índices e assim por diante. Eles foram criados como parte de uma instalação de software de terceiros. Preciso ter uma maneira de trabalhar com eles para poder agregar dados deles de maneira ad-hoc. Pessoas legais do dba.se já me ajudaram aqui Como criar um gatilho em um banco de dados diferente?
Atualmente, preciso encontrar uma maneira de fazer uma seleção em uma tabela em todos os bancos de dados. Gravei todos os nomes de banco de dados em uma tabela chamada Databasees
e escrevi o seguinte script para executar uma instrução select em todos eles:
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
No entanto, o script acima falha com a seguinte mensagem:
Um valor explícito para a coluna de identidade na tabela '#tmp' só pode ser especificado quando uma lista de colunas é usada e IDENTITY_INSERT está ativado.
Adicionando isso:
SET IDENTITY_INSERT #tmp ON
não ajuda, pois não consigo especificar a lista de colunas e mantê-la genérica.
No SQL, não há como desativar a identidade em uma determinada tabela. Você só pode soltar uma coluna e adicionar uma coluna, o que obviamente altera a ordem das colunas. E se a ordem das colunas mudar, você precisará especificar novamente a lista de colunas, que seria diferente dependendo da tabela que você consultar.
Então, eu estava pensando que se eu pudesse obter o script create table no meu código T-SQL, poderia manipulá-lo com expressões de manipulação de string para remover a coluna de identidade e também adicionar uma coluna para o nome do banco de dados ao conjunto de resultados.
Alguém pode pensar em uma maneira relativamente fácil de conseguir o que eu quero?