2010-09-01 48 views
4

我正在從我的數據庫中的一個常用表中刪除一列。 上次我做了這個錯誤,開始從我早已遺忘的各種存儲過程中爬出來;抱怨失蹤的專欄。 (只有當存儲過程被稱爲)如何停止存儲過程中抱怨我將要在SQL Server 2008中刪除的缺失列?

所以,我不想讓這些事情再次囉嗦,我想確保所有存儲過程在我實際刪除它之前是免費的。

什麼是最好的方式來搜索所有存儲過程(我有相當多的),並刪除對該列的引用?

我試圖在菜單中找到一個選項來做到這一點,但我沒有發現任何非常明顯的做到這一點。

任何幫助,(除了告訴我逐一通過他們)讚賞。
ps:當然,如果你確實告訴我,這並不意味着我會貶低你的評論。我只會贊成:P
(沒錯,只是在開玩笑!)

回答

2

使用此腳本。它也會返回觸發器。如果許多表具有相同名稱的列,則可以將故事名稱添加到其中。這個腳本適用於2005年的MSSQL 2000。我在2008年沒有測試過它,但它也應該可以正常工作。

SELECT o.name 
FROM sysobjects o 
    INNER JOIN syscomments c ON o.id = c.id 
WHERE c.text like '%column_name%' 

編輯:如果您想將它僅過濾存儲過程添加AND type ='P' where子句

+0

+1唯一需要注意的是,你們希望你不要有疑問漂浮在你的代碼:-) – InSane 2010-09-01 08:51:18

+0

這是完美的感謝!它列出了所有存儲的過程,(我沒有使用任何觸發器..但是!)謝謝! – iamserious 2010-09-01 08:54:11

+0

@In薩:不,我沒有在我的C#ANY querries,我做的工作100%的存儲特效(或至少儘可能地),然後我在項目中單獨的東西有數據訪問層..所以我我曾經是一位快樂的編碼員! – iamserious 2010-09-01 08:56:28

1

編輯:對不起,是我不好。這裏是存儲過程的代碼中搜索

下面的存儲過程應該能夠列出所有其文本包含所需的字符串存儲過程的代碼(所以,把你的列名,並離火):

CREATE PROCEDURE Find_Text_In_SP 
@StringToSearch varchar(100) 
AS 
    SET @StringToSearch = '%' [email protected] + '%' 
    SELECT Distinct SO.Name 
    FROM sysobjects SO (NOLOCK) 
    INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID 
    AND SO.Type = 'P' 
    AND SC.Text LIKE @stringtosearch 
    ORDER BY SO.Name 
GO 

用法:

exec Find_Text_In_SP 'desired_column_name' 

來源here

+0

這隻會搜索程序名稱 – devio 2010-09-01 08:52:05

+0

這將創建一個新的存儲過程在數據庫中,我將不得不刪除每次我完成運行它的權利? – iamserious 2010-09-01 08:54:49

+0

我會將存儲過程留在那裏以備將來使用;如果你不想,那麼簡單地使用SELECT命令本身的代碼(從「SELECT Distinct SO.Name」到「Order by SO.Name」的所有內容) - 不要忘了用「@stringtosearch」替換「@stringtosearch」 %desired_column_name%') – 2010-09-01 09:26:51

3

要添加到各種TSQL的解決方案,有一個自由從紅門集成到SSMS中的OL:SQL Search

+0

哇! +1這個工具..我使用紅門的數據比較和SQL比較(7),他們是驚人的..這個工具是免費的,哇。謝謝 ! – iamserious 2010-09-01 08:59:15

+0

+1爲真棒工具。 – 2010-09-01 09:01:45

1

您可以使用該表的依賴選項來查找依賴對象或依賴於此表的過程或函數列表。 使用下面的腳本

sp_depends 'TableName' 

另一個選擇是創建腳本包含列,但會在過濾過程或函數的所有文本。

0

如果您使用MS SQL不遲於2000年的版本,這是更好地搜索sys.sql_modules而非sys.syscomments,因爲syscomments中只持有爲nvarchar(4000)的記錄,你正在尋找的文本可以被分成兩個記錄。

因此,儘管你可以使用這樣的查詢從MSDN

SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_desc, sm.definition 
FROM sys.sql_modules AS sm 
JOIN sys.objects AS o ON sm.object_id = o.object_id 
WHERE sm.definition like '%' + @ColumnName + '%' 
ORDER BY o.type; 

你應該知道,這個搜索發現包含文本,任何程序,無論它是實際的列名和表該列屬於。

2

紅門軟件的SQL Prompt 5有幾個新功能,可能在這種情況下是有用的:

  • 列依賴性:列名懸停在腳本中突然冒出包含列表的窗口所有使用該列的對象
  • 查找無效對象:橫跨不能使用的數據庫顯示的對象,往往是因爲他們使用的是已被刪除

您可以下載14天免費試用版,查看該工具是否對您有用。

保羅·斯蒂芬森
SQL提示項目經理
紅門軟件

相關問題