无法使用动态查询重命名列
Can't rename columns with dynamic query
重命名查询中的列对于 sql admin/developer 来说是一项非常基本且常见的任务。但是今天我遇到了这个问题,我需要 select 数百个 table 的 table 名称并将其与每个 table 中的最新条目匹配 select之前编辑过。
最后我想要这样的东西:
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它会失败并显示错误 无效的列名称 'event_????'。谁能告诉我为什么列重命名没有发生,是否有办法解决这个问题?
提前致谢。
注意:我使用的是 SQL Server 2012,我对此比较陌生!
使用这个查询:
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)
去掉双引号。并尝试像这样使用合并:
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)
重命名查询中的列对于 sql admin/developer 来说是一项非常基本且常见的任务。但是今天我遇到了这个问题,我需要 select 数百个 table 的 table 名称并将其与每个 table 中的最新条目匹配 select之前编辑过。
最后我想要这样的东西:
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它会失败并显示错误 无效的列名称 'event_????'。谁能告诉我为什么列重命名没有发生,是否有办法解决这个问题?
提前致谢。
注意:我使用的是 SQL Server 2012,我对此比较陌生!
使用这个查询:
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)
去掉双引号。并尝试像这样使用合并:
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)