【问题标题】:SQL Server : CAST within EXEC (Dynamic SQL)SQL Server:EXEC 中的 CAST(动态 SQL)
【发布时间】:2018-02-22 12:47:26
【问题描述】:

我正在尝试动态计算列名,但是 SQL Server 不允许这种情况发生。有正确的方法吗?

预期结果

SELECT Column_1
FROM Table

查询

DECLARE @param AS INT;
SELECT @param = 1;

EXEC('SELECT Column_' + CAST(@param AS VARCHAR) + ' FROM Table');

Catch:@Param 需要为 int,以便于提供输入。

【问题讨论】:

  • 这表明您的桌子违反了 1NF,即所谓的重复组。这是一种可怕的数据建模方式,会导致各种问题。如果你要使用 varchar 你必须指定大小。如果您不这样做,则使用默认值。参数的默认值为 1,但变量的默认值为 30。要明确,避免混淆或错误。
  • 啊,我完全明白你的意思@SeanLange!的确,这可能只是违反了一种或所有范式。但是,作为背景,这不是针对 OLTP 系统的,而是针对已知且有限的数据集的一次性分析。
  • 不管用途是什么,设计才是问题所在。当您看到诸如 Email_1、Email_2、Email_3 之类的内容时,这表明一切都将是一场艰苦的战斗。如果您正确地设计表格,则可以很容易地从中检索数据。可悲的是,您正在努力检索数据...
  • 没错,我是被糟糕设计困住的分析师。

标签: sql sql-server


【解决方案1】:

请这样使用

DECLARE @param AS INT;
SELECT @param=1;
DECLARE @SQL AS VARCHAR(MAX) = 'SELECT Column_'+CAST(@param AS VARCHAR(5))+' FROM Table'
EXEC(@SQL);

【讨论】:

  • 如果您在演员表中指定 varchar 的大小,这是处理不良设计的好方法。
  • 我已将大小更新为 varchar(5)。 :) 谢谢肖恩。
【解决方案2】:

如果你不做一个数字变量,你不需要使用 算术运算。

DECLARE @param VARCHAR

DECLARE @param VARCHAR
DECLARE @sql VARCHAR(MAX)
SET @param = '1';
SET @sql = 'select ' + 'Column_' + @param + ' From Table';
EXEC(@sql)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
相关资源
最近更新 更多