1

我需要查询几个具有相似数据的表,但我不想编写冗长的 UNION 语句。此外,表的数量可能会有所不同。目前,我通过以下方式使用 Coldfusion 完成此操作:

  1. 循环遍历表名列表
  2. 在循环内执行 UNION

像这样

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

4

2 回答 2

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)
于 2013-05-29T01:47:50.667 回答
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
于 2013-05-29T05:57:46.397 回答