MSSQL: Como você script de procedimento armazenado criação com código?
-
21-08-2019 - |
Pergunta
Eu estou tentando consulta para uma lista de definições procedimento armazenado usando information_schema.routines que existem em um banco de dados, mas não em outro.
SELECT
t1.Routine_Definition
FROM
[server1].MyDatabase.INFORMATION_SCHEMA.Routines t1
LEFT JOIN
[server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
t2.Routine_Name is null
Isso me dá as definições de consulta em uma única linha, então quando eu tiver um comentário como este
--Some comment
SELECT Column
FROM Somewhere
O SQL fica comentada e eu não posso usar a definição para criar o SP.
Como eu analisar esta de volta com as quebras de linha apropriada?
ou
Existe uma maneira melhor para obter esses scripts (usando o código)?
Solução
O procedimento armazenado só é exibido em uma única linha no Management Studio. Se você executar a consulta com os resultados de texto, ou usar o seguinte, você vai ter as quebras de linha correta:
declare @sql varchar(8000) -- varchar(max) in SQL 2005+
SELECT
@sql = t1.Routine_Definition
FROM
INFORMATION_SCHEMA.Routines t1
print @sql
Outras dicas
DECLARE MY_CURSOR Cursor
FOR
SELECT
t1.Routine_Definition
FROM
[server1].MyDatabase.INFORMATION_SCHEMA.Routines t1
LEFT JOIN
[server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
t2.Routine_Name is null AND
LEN(t1.Routine_Definition) < 4000
Open My_Cursor
DECLARE @sql VARCHAR(MAX)
FETCH NEXT FROM MY_Cursor INTO @sql
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
Print @sql
FETCH NEXT FROM MY_CURSOR INTO @sql
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO
Aqui está como eu implementou a solução de ck ...
o ponto de vista INFORMATION_SCHEMA retorna apenas os primeiros 4000 caracteres na definição. (Idealmente, você não terá SP que são tanto tempo) Você vai querer roteiro aqueles manualmente ou alguma outra forma.
Eu acho que a maneira mais fácil de obter os procedimentos armazenados é usar o utilitário de importação / exportação que está embutido no SQL Server Management Studio. De lá você pode exportar o seu procedimento armazenado objetos na janela de código ou para um arquivo que você pode imediatamente rodar.