无法使用动态查询重命名列

时间:2015-05-18 15:50:48

标签: sql sql-server sql-server-2012 dynamic-queries

对于任何sql admin / developer,重命名查询中的列是一项非常基本且常见的任务。但今天我遇到了这个问题,我需要选择数百个表的表名,并将其与之前选择的每个表中的最新条目相匹配。

最后我想要这样的事情:

event_id | date       | tbl_name
==================================
68       | 31-12-1998 | tb_x
56       | 31-11-2001 | tb_y

使用动态查询来获取event_id和日期非常简单,但是当我尝试添加 tbl_name 列时,它会失败。

程序很简单:

SELECT @sql = @sql + 'SELECT event_id, date, '+QUOTENAME(TABLE_NAME)+' as tbl_name FROM ' + TABLE_NAME + ' UNION ' 
FROM (SELECT TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME not like 'event_%') AS t
...
exec (@sql)

最后,查询应该如下所示:

SELECT event_id, date, 'event_b559453b' as tbl_name
FROM event_b559453b
UNION
...
SELECT event_id, date, 'event_b03c4520' as tbl_name
FROM event_b559453b

奇怪的是(对我来说)如果你运行最后一个查询它将按预期执行但如果你使用 exec @sql 它会失败,并显示无效的列名称错误'事件_ ????'即可。谁能告诉我为什么列重命名没有发生,如果有办法绕过这个?

提前致谢。

注意:我正在使用SQL Server 2012而且我对此比较陌生!

2 个答案:

答案 0 :(得分:0)

使用此查询:

DECLARE @sql nvarchar(max) = ''

SELECT @sql = @sql + CASE WHEN @sql <> '' THEN ' UNION ' ELSE '' END +
      'SELECT event_id, date, '''+TABLE_NAME+''' as tbl_name FROM [' + TABLE_NAME + '] ' 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME not like 'event_%'
...
EXEC(@sql)

答案 1 :(得分:0)

摆脱双重报价。并尝试使用这样的合并:

DECLARE @sql VARCHAR(MAX);

SELECT @sql = COALESCE(@sql + ' UNION ','') + 'SELECT event_id, date, ''' + TABLE_NAME + ''' as tbl_name FROM ' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME not like 'event_%'

SELECT @sql --look at what your executing
--EXEC(@sql)
相关问题