我有一个包含3195个存储过程的SQL Server数据库。大多数(大约90%)存储过程都是加密的(它是第三方应用程序),但有许多未加密(稍后由顾问添加)。
我需要概述顾问创建的未加密存储过程,然后应用修复程序,以便它们可以使用UTC时间。
我使用Generate Scripts
并仅选择存储过程,但失败了。我认为这是因为它尝试写出的第一个存储过程是加密的。有没有办法写出大约300个未加密的存储过程?
答案 0 :(得分:2)
编辑:怎么样:
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定义。
答案 1 :(得分:1)
似乎使用INFORMATION_SCHEMA限制返回的数据为4000个字符。请参阅Mark Brittingham的回答这个问题: How do I programmatically retrieve SQL Server stored procedure source that is identical to the source returned by the SQL Server Management Studio gui?
我用他建议写出的存储过程: EXEC sp_HelpText'您的程序名'
从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
答案 2 :(得分:0)
获取脚本,然后再次加密存储过程,如Encrypt Stored Procedure