有没有办法从光标中获取值到视图中?
我必须创建过程,计算数据库中所有过程的哈希值,并将其放入视图中。
到目前为止我的代码:
DECLARE Cur_Procedures CURSOR LOCAL FAST_FORWARD FOR
SELECT name
FROM sys.procedures
OPEN Cur_Procedures
FETCH NEXT FROM Cur_Procedures INTO @SpName
WHILE @@fetch_status = 0
BEGIN
SET @SpDefinition = (SELECT OBJECT_DEFINITION (OBJECT_ID(@SpName )))
SET @HashedVal = dbo.fnHashBytes('SHA1', CAST(ISNULL(@SpDefinition,'') AS VARBINARY(MAX)))
--now I should store @HashedVal somewhere
FETCH NEXT FROM Cur_Procedures INTO @SpName
END
CLOSE Cur_Procedures
DEALLOCATE Cur_Procedures
--and now I should put it into view.
我尝试将其存储在#TempTable
中,然后创建视图,但它不会像那样工作。
我能在不创建桌子的情况下做到这一点吗?如果可能的话,我想避免使用固定表格。
答案 0 :(得分:1)
没有光标(应尽可能避免逐行处理):
SELECT [name] = OBJECT_NAME(object_id),
[hash] = HASHBYTES('SHA1' ,[definition])
FROM sys.sql_modules;
的 LiveDemo
强>
您可以使用VIEW
对其进行换行,并在需要时将HASHBYTES
更改为dbo.fnHashBytes
。
使用系统视图:
SELECT name, HASHBYTES('SHA1', sm.[definition] )
FROM sys.procedures sp
JOIN sys.sql_modules sm
ON sp.object_id = sm.object_id;
的 LiveDemo2
强>
请注意sql_modules
:
目录视图中元数据的可见性仅限于 用户拥有或用户所拥有的安全性 授予一些权限。有关更多信息,请参阅元数据可见性 配置。
NULL =加密