我正在使用 SQL Server 2005 并以 sa 身份登录。我想查询数据库中的每个表是否有特定的列名。如果是这样,将 (columnNameValue = someValue) 的每一行附加到结果表。然后返回所述结果表。

有一些类似的问题的解决方案。值得注意的是,我可以为此使用 sp_MSForeachTable,但它缺少任何类型的文档。我可以使用 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 来获取所有表的列表。

以下解决方案 ( link text ) 将遍历每个表格和每一列以在单元格中查找特定值。这与在单元格中查找某个值(如果该列是某个列名)不同。

编写嵌套的 while 语句应该是可能的,但是是否有任何内置命令可以运行这样的查询?

如果有帮助,伪代码:

foreach(table in tableList) { 
    if (table.hasColumnName(SOME_COLUMN) { 
       EXEC ('SELECT * FROM table WHERE (SOME_COLUMN = SOME_VALUE)') 
    } 
} 

[编辑]

我希望每个表只有一个结果,而不是只有一个结果集,只要选择返回至少一行。这应该会产生大量不同的结果,因为期望连接或联合起作用是不现实的。

如果可能,我想将表名附加到每个结果的开头。

我在下面有一个简单的查询,可以获取所有结果,但它会显示空表,并且不会在单个结果中给出任何关于它属于哪个表的视觉指示:

[进一步编辑]

感谢@Martin,更新了下面的查询以包括删除 NULL 结果的 IF EXIST 检查和选择名称 AS 源列以将表源添加到结果中

DECLARE @COLUMN_VALUE nvarchar(512), @VALUE nvarchar(10); 
 
SET @COLUMN_VALUE = 'id' 
SET @VALUE = '0'; 
 
DECLARE @TABLE_NAME nvarchar(512), @COLUMN_NAME nvarchar(512), @QUERY nvarchar(512); 
 
SET @TABLE_NAME = ''; 
 
WHILE @TABLE_NAME IS NOT NULL 
BEGIN 
    SET @TABLE_NAME = 
    ( 
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TABLE_NAME 
    ); 
    PRINT 'Table name : ' + @TABLE_NAME; 
    SET @COLUMN_NAME =  
    ( 
        SELECT MIN(QUOTENAME(COLUMN_NAME)) 
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE (TABLE_NAME = PARSENAME(@TABLE_NAME, 1)) 
            AND (COLUMN_NAME = @COLUMN_VALUE) 
 
    ); 
    PRINT 'Column name : ' + @COLUMN_NAME; 
    IF @COLUMN_NAME IS NOT NULL  
    BEGIN 
        SET @QUERY =  
            'SELECT ''' + @TABLE_NAME + ''' AS Source, * ' + 
            'FROM ' + @TABLE_NAME + ' ' + 
            'WHERE (' + @COLUMN_NAME + ' = ' + @VALUE + ')' 
        EXEC 
        ( 
            'IF EXISTS(' + @QUERY + ') ' + @QUERY 
        ) 
    END      
END 

请您参考如下方法:

CREATE TABLE foo 
( 
SOME_COLUMN VARCHAR(10) 
) 
 
CREATE TABLE bar 
( 
SOME_COLUMN VARCHAR(10) 
) 
 
INSERT INTO bar VALUES ('SOME_VALUE') 
 
 
DECLARE @Query nvarchar(max) 
 
SELECT  
      @Query = isnull(@Query + ';','') +  
      'IF EXISTS(SELECT * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' +  
      QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE'') 
      SELECT ''' + o.name +''' AS Source, * FROM ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' +  
      QUOTENAME(o.name) + ' WHERE SOME_COLUMN=''SOME_VALUE''' 
FROM sys.columns c  
JOIN sys.objects o 
ON o.object_id = c.object_id 
WHERE o.type IN ('U','V') AND c.name = 'SOME_COLUMN' 
 
EXEC sp_executesql @Query 


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!