MSSQL:如何使用代码编写存储过程创建脚本?

时间:2009-02-04 20:31:06

标签: sql sql-server tsql stored-procedures information-schema

我正在尝试使用存在于一个数据库中而不存在于另一个数据库中的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。

如何使用正确的换行符解析它?
要么
有没有更好的方法来获取这些脚本(使用代码)?

3 个答案:

答案 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中内置的导入/导出实用程序。从那里,您可以将存储过程对象导出到代码窗口或可以立即运行的文件中。