【问题标题】:MSSQL: How do you script Stored Procedure creation with code?MSSQL:您如何使用代码编写存储过程创建脚本?
【发布时间】:2010-10-05 12:25:14
【问题描述】:

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

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

【问题讨论】:

  • 您可以选择编程方式,还是必须基于 T-SQL?例如,它可能是一个在后台运行并吐出脚本的 VB.NET 程序,还是它自己创建丢失的对象?

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


【解决方案1】:

存储过程在 Management Studio 中仅显示在一行中。如果您运行带有文本结果的查询,使用以下内容,您将获得正确的换行符:

declare @sql varchar(8000) -- varchar(max) in SQL 2005+

SELECT 
        @sql = t1.Routine_Definition
FROM
        INFORMATION_SCHEMA.Routines t1 

print @sql

【讨论】:

  • 没错,除非您的存储过程超过 8000 个字符。
  • 你总是可以做 varchar(max),这样可以容纳所有的人
  • 虽然这个答案通常是正确的,但请注意重要的警告 - 如http://msdn.microsoft.com/en-us/library/ms188757.aspx 所述 - ROUTINE_DEFINITION 包含“函数或存储过程的定义文本的前 4000 个字符”。为确保获得完整的定义,请查询OBJECT_DEFINITION函数或sys.sql_modules目录视图中的定义列
【解决方案2】:
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)你会想要手动或其他方式编写脚本。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我不是在寻找最简单的方法。我想用它来创建一个动态脚本,该脚本将在不使用 GUI 和选择要编写脚本的 SP 的情况下创建我的脚本。
    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 2021-01-08
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多