我正在尝试使用存在于一个数据库中而不存在于另一个数据库中的information_schema.routines来查询存储过程定义列表。
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
这给了我一行中的查询定义,所以当我有这样的评论时
--Some comment
SELECT Column
FROM Somewhere
SQL被注释掉了,我无法使用该定义来创建SP。
如何使用正确的换行符解析它?
要么
有没有更好的方法来获取这些脚本(使用代码)?
答案 0 :(得分:9)
存储过程仅显示在Management Studio中的一行上。如果您将带有结果的查询运行到文本,或,请使用以下内容,您将获得正确的换行符:
declare @sql varchar(8000) -- varchar(max) in SQL 2005+
SELECT
@sql = t1.Routine_Definition
FROM
INFORMATION_SCHEMA.Routines t1
print @sql
答案 1 :(得分:1)
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
以下是我实施ck解决方案的方法......
INFORMATION_SCHEMA视图仅返回定义中的前4000个字符。 (理想情况下,你不会有那么长的SP)你会想要手动或其他方式编写脚本。
答案 2 :(得分:-1)
我认为获取存储过程的最简单方法是使用SQL Server Management Studio中内置的导入/导出实用程序。从那里,您可以将存储过程对象导出到代码窗口或可以立即运行的文件中。