2009-02-04 43 views
4

我想查询存储过程定义的列表,使用information_schema.routines存在于一个数据库中,但不存在于另一个数据库中。MSSQL:你如何使用代码脚本创建存储过程?

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

正在为您编程一个选项,还是必须基于T-SQL?例如,它可能是一个在后台运行并吐出脚本的VB.NET程序,或者它甚至会自己创建丢失的对象? – SqlRyan 2009-02-04 20:45:24

回答

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

确实如此,除非您的存储过程长于8000个字符。 – SqlRyan 2009-02-04 20:44:38

-1

我认为获取存储过程最简单的方法是使用内置于SQL Server Management Studio中的导入/导出实用程序。从那里,您可以将您的存储过程对象导出到代码窗口或可以立即运行的文件。

+2

我不是在寻找最简单的方法。我想用它来创建一个动态脚本,它将创建我的脚本而不使用GUI并选择要编写脚本的SP。 – ctrlShiftBryan 2009-02-04 20:35:58

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)你会想要手动或其他方式编写脚本。