我正在使用SQL Server 2005并以sa
身份登录。我想查询我的数据库中的每个表是否有一个特定的列名。如果是这样,将每一行(columnNameValue = someValue)附加到结果表中。然后返回结果表。
解决方案存在一些类似的问题。值得注意的是,我可以使用sp_MSForeachTable
,但它没有任何文档。我可以使用SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
来获取所有表的列表。
以下解决方案(link text)将适用于每个表格和每列在单元格中找到一定值。这与在单元格IF中查找该列是某个columnName的特定值不同。
应该可以编写嵌套的while语句,但是有没有内置命令来运行这样的查询?
伪代码如果有帮助:
foreach(table in tableList) {
if (table.hasColumnName(SOME_COLUMN) {
EXEC ('SELECT * FROM table WHERE (SOME_COLUMN = SOME_VALUE)')
}
}
[编辑]
而不是只有一个结果集我希望每个表只有一个结果,只要select返回至少一行。这应该会产生大量不同的结果,因为期望加入或联合起作用是不现实的。
如果可能的话,我想在每个结果的开头附加表名。
我在下面有一个简单的查询,可以获得所有结果,但它会显示空表,并且不会在各个结果中给出任何关于它属于哪个表的可视指示:
[进一步编辑]
更新了下面的查询,以包含删除NULL结果和放大器的IF EXIST检查。由于@Martin
,选择名称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
答案 0 :(得分: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