【问题标题】:Can't rename columns with dynamic query无法使用动态查询重命名列
【发布时间】:2015-05-18 15:50:48
【问题描述】:

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

最后我想要这样的东西:

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

使用动态查询很容易获得 event_id 和 date,但是当我尝试添加列 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 它将失败并显示错误提示 Invalid column name '事件_????'。谁能告诉我为什么没有发生列重命名,如果有办法解决这个问题?

提前致谢。

注意:我使用的是 SQL Server 2012,对此我比较陌生!

【问题讨论】:

  • 是否:"SELECT event_id, date, "+QUOTENAME(TABLE_NAME)+" 作为 tbl_name 工作?我假设 quotename 是一个 UDF(用户定义的函数)或者可能是.."SELECT event_id, date, '"+QUOTENAME(TABLE_NAME)+"' as tbl_name
  • @xQbert QUOTENAME()vendor function
  • 您的代码中有一个双引号:SELECT @sql = @sql + "。这是否存在于您的实际代码中?双引号是字段名称标识符,而不是字符串文字标识符。它应该是一个单引号。

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


【解决方案1】:

去掉双引号。并尝试像这样使用合并:

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)

【讨论】:

  • 你能告诉我为什么它以前不起作用吗?我在实际查询中使用了双引号(:P 错别字)。是三引号吗?
  • 好吧,我还使用合并将 UNION 添加到所有查询中,并且没有尾随的 UNION(最后多了一个)。至于“三引号”(三个单引号),如果要在两个外部单引号之间添加1个单引号,则需要2个单引号。所以 SELECT ' '' ' 将返回 1 个单引号。
【解决方案2】:

使用这个查询:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2023-01-30
    • 2022-11-03
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多