从光标到视图的结果

时间:2016-01-18 14:54:21

标签: sql-server tsql

有没有办法从光标中获取值到视图中?

我必须创建过程,计算数据库中所有过程的哈希值,并将其放入视图中。

到目前为止我的代码:

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中,然后创建视图,但它不会像那样工作。

我能在不创建桌子的情况下做到这一点吗?如果可能的话,我想避免使用固定表格。

1 个答案:

答案 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 =加密