2013-05-07 28 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