是否有一个脚本可以让MSSQL查找包含多个表中具有相同数据的记录的列。
我想要做的是找到我们从另一个数据库生成的excel电子表格中导入的数据表的主键。
谢谢, 克里斯
答案 0 :(得分:0)
您将需要查找SysObjects和SysColumn系统表,非常方便。
这是一个查看整数值500的所有表的示例。请注意,如果要查找不同类型的列,则需要更改xtype。这不是一个完整的“比较我的数据库中的每一列与每个其他列”的例子,但它应该给你基本的想法,并希望让你开始。
另外我在这个例子中使用了一个内存表。如果您的数据库很大,则可能需要使用临时表和游标。
这将返回单个列记录集,其值为“Table - ColumnName = Search Value”
-- declare my search table
DECLARE @Columns TABLE (TableName varchar(50), ColumnName varchar(50))
DECLARE @Results TABLE (Results VARCHAR(255))
DECLARE @SearchData INT
SET @SearchData = 500
DECLARE @TableName VARCHAR(50)
DECLARE @ColumnName VARCHAR(50)
DECLARE @Command VARCHAR(1024)
-- Find all tables with an integer column
Insert INTO @Columns
Select sysobjects.[Name] as TableName, syscolumns.[Name] as ColumnName
from dbo.sysobjects INNER Join dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id
Where sysobjects.xtype = 'U' and syscolumns.xtype = 56 Order By TableName, ColumnName
--Loop!
WHILE NOT (Select TOP 1 TableName from @Columns) IS NULL
BEGIN
Select TOP 1 @TableName = TableName, @ColumnName = ColumnName from @Columns
SET @Command = 'Select ''' + @TableName + ' - ' + @ColumnName + ' = ' + CAST(@SearchData as varchar(32)) + ''' FROM ' + @TableName + ' WHERE ' + @ColumnName + ' = ' + CAST(@SearchData as VARCHAR(32))
Insert INTO @Results
exec(@Command)
Delete from @Columns where TableName = @TableName AND ColumnName = @ColumnName
END
-- Export all results
Select * from @Results