如果列名存在,则选择数据库中每个表的每一行(columnName = value)

Ray*_*nos 2 sql t-sql sql-server-2005

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

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

以下解决方案(链接文本)将遍历每个表和每列以在单元格中查找特定值.这与在单元格IF中查找该列是某个columnName的特定值不同.

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

伪代码如果有帮助:

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

[编辑]

而不是只有一个结果集,我希望每个表只有一个结果,只要select返回至少一行.这应该会产生大量不同的结果,因为期望加入或联合工作是不现实的.

如果可能的话,我想将tablename附加到每个结果的开头.

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

[进一步编辑]

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

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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 7

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
Run Code Online (Sandbox Code Playgroud)

  • `foo`和`bar`只是演示表.很抱歉不知道你为什么会得到不同的结果.你必须自己解决这个问题. (2认同)