显示所有存储过程定义(内容)以供编辑

Evi*_*lDr 7 sql-server stored-procedures t-sql sql-server-2012

抱歉,如果之前有人问过这个问题,建议的“相关”问题不相关,而且我自己的搜索结果很少。

我需要列出所有存储过程的定义(代码),以便我可以开始处理所有 450 个并添加分号以实现 v2014 标准。

我在这里找到了以下代码并稍微修改了它:

SELECT
    obj.Name AS SPName,
    REPLACE(modu.definition, 'CREATE PROC', 'ALTER PROC') + 'GO' AS SPDefinition
FROM
    sys.sql_modules modu INNER JOIN
    sys.objects obj ON modu.object_id = obj.object_id
WHERE
    (obj.type = 'P')
ORDER BY
    obj.name;
Run Code Online (Sandbox Code Playgroud)

上面的代码是使用 SA 帐户运行的。

认为这正是我需要的,但是,我刚刚注意到 MSDN 上有人声称它没有按预期显示全文

将结果粘贴到 SSMS 编辑器中时,我有 46,000 行代码需要处理,因此如果缺少任何内容,对我来说并不明显。我想确保在编辑器中浪费一天之前我已经正确地开始了这个过程。

因此,我正在联系您的专业人士,询问这是否是这种方法的真正缺点,或者是否有替代方法而不是一个一个?

Aar*_*and 7

MSDN上提到的问题与sys.sql_modulesor无关OBJECT_DEFINITION();他们误解了这个问题。实际发生的情况是,Management Studio 中的输出限制阻碍了它们,默认情况下,在结果转文本的任何输出元组中,该限制仅显示 255 个字符,最多 8192 个字符。

所以首先,请确保将其更改为 8192:

工具 > 选项 > 查询结果 > SQL Server > 结果转文本 >
每列中显示的最大字符数

现在您可以为所有小于 4K 的程序制作一个脚本:

SELECT REPLACE(m.definition, N'CREATE PROC', N'ALTER PROC') 
  + CHAR(13) + CHAR(10) + N'GO'
FROM sys.sql_modules AS m
INNER JOIN sys.procedures AS p
ON m.[object_id] = p.[object_id]
WHERE LEN(m.definition) <= 4000
ORDER BY p.name;
Run Code Online (Sandbox Code Playgroud)

(当然,您的替换是幼稚的 - 如果他们有create procedure(多个空格)或者您使用区分大小写的排序规则怎么办?您可能需要手动修复其中的一些。)

现在,您只需担心为较大的过程手动派生脚本。首先,看看你有没有:

SELECT name 
  FROM sys.procedures 
  WHERE LEN(OBJECT_DEFINITION([object_id])) > 4000; 
Run Code Online (Sandbox Code Playgroud)

在这里谈了一些变通方法(在动态 SQL 的上下文中,但如果分配OBJECT_DEFINITION()给变量也是如此)。

Magoo 先生是对的,如果您使用 Management Studio 中的脚本功能,您将获得完整的定义而不必担心截断:

  • 右键单击程序,modifyscript as > alter to >
  • 在对象资源管理器详细信息中,执行与上述相同的操作,但对于多个
  • 右键单击数据库,tasks > generate scripts >(但这确实CREATE,而不是ALTER,因此您仍然需要执行替换)

顺便说一句,当您在各处添加分号时,我还建议确保您的所有过程都使用模式前缀(例如dbo.procedurename,不只是procedurename)以及过程中的所有对象引用创建。在没有分号之前很久,这些很可能会引起问题。还有一些在执行更改时要记住的一般事项