我需要使用类似的数据查询几个表,但我不想写一个冗长的UNION语句。此外,表的数量可以变化。目前,我通过以下方式使用Coldfusion实现了这一目标:
喜欢这个
set i = 0
set table_suffixes = "blue,green,red,yellow"
loop list="table_suffixes" index="idx_suffix"
set tName = "table_" & idx_suffix
if i > 0
UNION
end if
select *
FROM tName
end loop
这可以在T-SQL中完成吗?我找不到任何关于使用列表来控制循环的文章。我能找到的最接近的是在循环中放置一个查询。喜欢这个
While (SELECT table_suffix FROM vendor_name WHERE discipline = 'electrical')
BEGIN
*union query...*
END
非常感谢任何指导我正确方向的帮助。我正在使用SQL-Server 2008
答案 0 :(得分:1)
虽然一般也不推荐,但这里是一个在T-SQL中生成和执行动态SQL的例子。
注意我使用了UNION ALL
。您应该了解这与UNION
完成此工作后,您可以将其包装在一个存储过程中,该存储过程接受用于DISCIPLINE
的参数
另请注意,您必须这样做的事实意味着您的数据库中存在一些严重的设计缺陷。
DECLARE @TableName VARCHAR(100)
DECLARE @DSQL VARCHAR(4000)
SET @DSQL = ''
DECLARE cTableList CURSOR FOR
SELECT table_suffix FROM vendor_name WHERE discipline = 'electrical'
OPEN cTableList
FETCH NEXT FROM cTableList INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DSQL = @DSQL + 'SELECT * FROM ' + @TableName + ' UNION ALL '
END
CLOSE cTableList
DEALLOCATE cTableList
-- Remove the last UNION ALL
IF LEN(@DSQL) > 11 SET @DSQL = LEFT(@DSQL,LEN(@DSQL) - 11)
-- Print it out for debugging purposes
PRINT (@DSQL)
-- Execute it
EXEC (@DSQL)
答案 1 :(得分:1)
试试这个 -
<强>查询:强>
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
SELECT CHAR(13) + 'UNION ALL' + CHAR(13) + 'SELECT * FROM [' + s.name + '].[' + o.name + ']'
FROM sys.objects o
JOIN sys.schemas s ON o.[schema_id] = s.[schema_id]
WHERE o.[type] = 'U'
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 11, '')
PRINT @SQL
<强>输出:强>
SELECT * FROM [dbo].[test1]
UNION ALL
SELECT * FROM [dbo].[MyTable]
UNION ALL
...
在您的情况下,请看到类似的内容 -
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
SELECT CHAR(13) + 'UNION ALL' + CHAR(13) + 'SELECT * FROM ' + table_suffix
FROM vendor_name
WHERE discipline = 'electrical'
WHERE o.[type] = 'U'
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 11, '')
PRINT @SQL