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 行代码需要处理,因此如果缺少任何内容,对我来说并不明显。我想确保在编辑器中浪费一天之前我已经正确地开始了这个过程。
因此,我正在联系您的专业人士,询问这是否是这种方法的真正缺点,或者是否有替代方法而不是一个一个?
MSDN上提到的问题与sys.sql_modules
or无关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 中的脚本功能,您将获得完整的定义而不必担心截断:
modify
或script as > alter to >
tasks > generate scripts >
(但这确实CREATE
,而不是ALTER
,因此您仍然需要执行替换) 顺便说一句,当您在各处添加分号时,我还建议确保您的所有过程都使用模式前缀(例如dbo.procedurename
,不只是procedurename
)以及过程中的所有对象引用创建。在没有分号之前很久,这些很可能会引起问题。还有一些在执行更改时要记住的一般事项。
归档时间: |
|
查看次数: |
11744 次 |
最近记录: |