使用UNION t-sql循环

时间:2013-05-28 21:53:31

标签: sql-server tsql loops union

我需要使用类似的数据查询几个表,但我不想写一个冗长的UNION语句。此外,表的数量可以变化。目前,我通过以下方式使用Coldfusion实现了这一目标:

  1. 循环显示表名
  2. 在循环中执行UNION
  3. 喜欢这个

    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

2 个答案:

答案 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