我在一个维护(大型)遗留C#应用程序的开发团队工作。在过去几个月中,我们遇到了几个实例,其中数据库中的列在CRUD存储过程中没有任何引用,从该表中选择/更新/插入/删除,因此它们实际上是“孤立”列“和它们的值总是为NULL(显然它们不是关键业务,或者有人会抱怨现在,但我们想知道这些孤立列的位置,因为我们正在进行整个平台迁移)。
例如,表“产品”包含以下列:
的ProductID
产品名称
ProductDesc
EFFECTIVEDATE
结束日期
的IsEnabled
Product_INSERT存储过程插入以下列的数据:
的ProductID
产品名称
ProductDesc
EFFECTIVEDATE
结束日期
如您所见,IsEnabled未包含在存储过程中,因此它将作为NULL插入(假设列可以为空,否则我们在插入时会遇到错误并意识到差异)。
有没有办法运行SQL查询来识别这些?我们有很多屏幕都有很多潜在的CRUD sprocs。
答案 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
从答案略微修改: