0

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

例如,表“产品”具有以下列:

ProductID
ProductName
ProductDesc
EffectiveDate
EndDate
IsEnabled

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

ProductID
ProductName
ProductDesc
EffectiveDate
EndDate

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

有没有办法运行 SQL 查询来识别这些?我们有许多具有大量底层 CRUD sproc 的屏幕。

4

2 回答 2

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

于 2013-05-07T23:40:14.837 回答
0

我认为您想知道不包含任何非 NULL 值的表/列的列表。

您可以使用游标和系统表来完成此操作。遍历所有表,然后遍历所有列以查看它们是否全部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:仅选择具有 NULL 值的列

于 2013-05-07T23:08:35.073 回答