1

我有一个带有 3195 个存储过程的 SQL Server 数据库。大多数(大约 90%)的存储过程是加密的(它是一个 3rd 方应用程序),但也有很多没有加密(后来由顾问添加)。

我需要了解顾问创建的未加密存储过程的概述,然后应用修复程序,以便他们可以使用 UTC 时间。

我只使用Generate Scripts和选择存储过程,但失败了。我认为这是因为它尝试写出的第一个存储过程是加密的。有没有办法写出大约 300 个未加密的存储过程?

4

3 回答 3

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 定义。

于 2013-10-30T09:57:53.507 回答
1

似乎使用 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
于 2013-10-31T10:42:52.473 回答
0

试试这个解密存储过程

获取脚本,然后再次加密存储过程,如加密存储过程

于 2013-10-30T09:58:38.330 回答