查找CRUD存储过程未触及的数据库列

时间:2013-05-07 22:49:58

标签: c# sql

我在一个维护(大型)遗留C#应用程序的开发团队工作。在过去几个月中,我们遇到了几个实例,其中数据库中的列在CRUD存储过程中没有任何引用,从该表中选择/更新/插入/删除,因此它们实际上是“孤立”列“和它们的值总是为NULL(显然它们不是关键业务,或者有人会抱怨现在,但我们想知道这些孤立列的位置,因为我们正在进行整个平台迁移)。

例如,表“产品”包含以下列:

的ProductID
产品名称
ProductDesc
EFFECTIVEDATE
结束日期
的IsEnabled

Product_INSERT存储过程插入以下列的数据:

的ProductID
产品名称
ProductDesc
EFFECTIVEDATE
结束日期

如您所见,IsEnabled未包含在存储过程中,因此它将作为NULL插入(假设列可以为空,否则我们在插入时会遇到错误并意识到差异)。

有没有办法运行SQL查询来识别这些?我们有很多屏幕都有很多潜在的CRUD sprocs。

2 个答案:

答案 0 :(得分: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

中未使用的列

答案 1 :(得分: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