MSSQL在没有定义关系的表中查找匹配列

时间:2010-11-17 21:32:12

标签: sql-server

是否有一个脚本可以让MSSQL查找包含多个表中具有相同数据的记录的列。

我想要做的是找到我们从另一个数据库生成的excel电子表格中导入的数据表的主键。

谢谢, 克里斯

1 个答案:

答案 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