2013-05-07 26 views
0

我在一個維護(大)傳統C#應用程序的開發團隊中工作。在過去幾個月中,我們遇到了幾個實例,其中數據庫中的列沒有在CRUD存儲過程中引用,從該表中選擇/更新/插入/刪除,因此它們實際上是「孤立」列和它們的值總是爲NULL(顯然它們不是業務關鍵的或者現在有人會抱怨,但是我們想知道這些孤兒列在哪裏,因爲我們正在進行總平臺遷移)查找未被CRUD存儲過程觸及的數據庫列

例如,表「產品」有以下欄目:

的ProductID
產品名稱
ProductDesc
EFFECTIVEDATE
結束日期
的IsEnabled

的Product_INSERT存儲過程插入用於以下各列數據:

的ProductID
產品名稱
ProductDesc
EFFECTIVEDATE
結束日期

正如你可以看到,的IsEnabled沒有包含在存儲過程中,所以它會插入爲NULL(假設列是可空的,否則我們會在插入時遇到錯誤並意識到差異)。

有沒有什麼辦法來運行SQL查詢來識別這些?我們有許多屏幕,其中有很多CRUD sprocs。

+0

您想識別僅包含'NULL'值的列的名稱,是嗎? – Matthew 2013-05-07 23:05:12

回答

1
SELECT * 
FROM sys.[columns] AS c 
INNER JOIN sys.[tables] AS t ON [c].[object_id] = [t].[object_id] 
WHERE 1=1 
--AND c.[object_id] = 60579304 
AND NOT EXISTS (
SELECT TOP(1) 1 
FROM dbo.sysobjects so 
INNER JOIN dbo.syscomments sc ON so.id = sc.id 
WHERE 
    (so.xtype = 'P') 
    and OBJECTPROPERTY(so.id, N'IsMSShipped')=0 
    AND sc.[text] LIKE '%' + c.[name] + '%' 
) 

不優雅,但工程。查找未使用的列Stored Procs

+0

剛剛嘗試過,效果很棒! – Ryan 2013-05-08 00:19:18

0

我認爲你想知道一個不包含任何非NULL值的表/列的列表。

您可以使用遊標和systables來完成此操作。遍歷所有的表,然後遍歷所有的列,看看他們都是NULL

這也將返回完全空表,但可以解決這個問題,如果你想通過添加另一個EXISTS子句看到有記錄。

declare @tab varchar(255) 

declare @col varchar(255), @cmd varchar(max) 

DECLARE gettab cursor for 
SELECT t.name FROM sys.tables t 
OPEN gettab 

FETCH NEXT FROM gettab into @tab 

WHILE @@FETCH_STATUS = 0 
BEGIN 

DECLARE getinfo cursor for 
SELECT c.name FROM sys.tables t JOIN sys.columns c ON t.Object_ID = c.Object_ID 
WHERE t.Name = @tab 
OPEN getinfo 

FETCH NEXT FROM getinfo into @col 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @cmd = 'IF NOT EXISTS (SELECT top 1 * FROM ' + @tab + ' WHERE [' + @col + '] IS NOT NULL) BEGIN print ''' + @tab + '.' + @col + ''' end' 
    EXEC(@cmd) 

    FETCH NEXT FROM getinfo into @col 
END 

CLOSE getinfo 
DEALLOCATE getinfo 

FETCH NEXT FROM gettab into @tab 
END 
CLOSE gettab 
DEALLOCATE gettab 

從這裏答案稍加修改:

SQL: Select columns with NULL values only