2011-04-14 60 views
2

我需要在表中添加一個字段。該字段需要填入不同的值。如何獲取將數據插入給定表的存儲過程的列表?

我已經知道在這個表中插入新記錄的主存儲過程,這些存儲過程需要修改。爲了保持安全,有一種方法可以獲得在有問題的表中插入記錄的存儲過程的完整列表?

sys.dm_sql_referencing_entities給了我依賴於這個表的存儲過程的列表,但我只想要插入記錄的存儲過程而不是簡單地查詢它的存儲過程。

謝謝。

回答

2

您可以嘗試查看存儲過程本身的代碼,但它可能不會100%匹配。一些線上的:

SELECT OBJECT_NAME(S.object_id) StoredProcedure 
FROM sys.sql_modules S 
JOIN sys.procedures P 
ON S.object_id = P.object_id 
WHERE Definition LIKE '%INSERT INTO myTable%' 
OR Definition LIKE '%INSERT myTable%' 
+0

尼斯答案但不完整。當使用模式前綴時,這不起作用,不搜索整個單詞,而且忽略方括號。 – 2013-12-30 07:49:56

0

一個低技術的策略,比你想象的更好。 。 。

將模式轉儲爲文本。然後在命令提示符下。 。 。

$ grep -i 'insert into your-table-name' dumped-schema-file 

我不知道搜索文本字符串的Windows實用程序。

這可能會找到大部分插入。您也可以嘗試

$ grep -i -B2 'your-table-name' dumped-schema-file 

,將打印每個匹配「你的表名」,同三線之前立即沿線,這樣你就可以看的東西像

insert into 
your-table-name 
0

SQL Server雜誌發表了題爲Stored Procedure Searches for Strings幾年前的文章,提供了

接受一個輸入字符串和搜索 了syscomments,系統對象,和01存儲過程syscolumns系統表在本地的 數據庫中有任何的參考,即 的字符串。輸出結果集顯示包含 指定輸入字符串的所有表,程序,視圖和 其他元素。

它基本上是您的數據庫的grep。這非常有用。

2

我不知道,我們有辦法基於DML語句(插入VS刪除),以獲得一個艱難的比賽,但你可以嘗試比較參考實體的數據集對一個字符串匹配,如下所示:

declare @ObjectName nvarchar(517) = 'dbo.Person'; 

declare @match table (sName nvarchar(500), oName nvarchar(500)) 
insert into @Match (sName, oName) 
    select distinct 
      object_schema_name([object_id], db_id()), 
      object_name([object_id], db_id()) 
    from sys.sql_modules 
    where [definition] like '%'[email protected]+'%' and 
      ( -- match "insert into dbo.Person" or "insert into Person" 
       [definition] like '%insert into ' + @ObjectName + '%' or 
       [definition] like '%insert into ' + replace(@ObjectName, 'dbo.', '') + '%' or 
       -- match "insert dbo.Person" or "insert Person" 
       [definition] like '%insert ' + @ObjectName + '%' or 
       [definition] like '%insert ' + replace(@ObjectName, 'dbo.', '') + '%' 
      ) 

select * 
from sys.dm_sql_referencing_entities(@ObjectName, 'OBJECT') re 
left 
join @Match d on 
     re.referencing_schema_name = d.sName and 
     re.referencing_entity_name = d.oName 
where d.sName is not null -- comment this line to compare all possible ref entities 
return 
相關問題