我有一个带有 3195 个存储过程的 SQL Server 数据库。大多数(大约 90%)的存储过程是加密的(它是一个 3rd 方应用程序),但也有很多没有加密(后来由顾问添加)。
我需要了解顾问创建的未加密存储过程的概述,然后应用修复程序,以便他们可以使用 UTC 时间。
我只使用Generate Scripts
和选择存储过程,但失败了。我认为这是因为它尝试写出的第一个存储过程是加密的。有没有办法写出大约 300 个未加密的存储过程?
我有一个带有 3195 个存储过程的 SQL Server 数据库。大多数(大约 90%)的存储过程是加密的(它是一个 3rd 方应用程序),但也有很多没有加密(后来由顾问添加)。
我需要了解顾问创建的未加密存储过程的概述,然后应用修复程序,以便他们可以使用 UTC 时间。
我只使用Generate Scripts
和选择存储过程,但失败了。我认为这是因为它尝试写出的第一个存储过程是加密的。有没有办法写出大约 300 个未加密的存储过程?
编辑:怎么样:
SELECT
sp.NAME,
ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
WHERE
sp.type = 'P'
AND SCHEMA_NAME(sp.schema_id)='dbo'
AND ISNULL(smsp.definition, ssmsp.definition) IS NOT NULL
加密的存储过程将具有 NULL 定义。
似乎使用 INFORMATION_SCHEMA 将返回的数据限制为 4000 个字符。请参阅 Mark Brittingham 对此问题的回答: 如何以编程方式检索与 SQL Server Management Studio gui 返回的源相同的 SQL Server 存储过程源?
我用他的建议写出存储过程: EXEC sp_HelpText 'your procedure name'
从 James S 的建议开始,并使用 Mark Brittingham 对另一个问题的回答,我将下面的 t-sql 放在一起。然后我将查询分析器设置为将结果输出为文本。下面的 SQL 不一定漂亮,但它可以完成工作。它生成所有未加密存储过程的列表,然后循环它们并将它们打印出来。
DECLARE @routineName nvarchar(255)
DECLARE cursorbob CURSOR FOR
SELECT ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_DEFINITION IS NOT NULL
OPEN cursorbob
FETCH NEXT FROM cursorbob INTO @routineName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC sp_HelpText @routineName
FETCH NEXT FROM cursorbob INTO @routineName
END
CLOSE cursorbob
DEALLOCATE cursorbob