SQL Server:在EXEC中强制转换(动态SQL)

SQL Server:在EXEC中强制转换(动态SQL),sql,sql-server,Sql,Sql Server,我正在尝试动态计算列名,但是SQLServer不允许这种情况发生。有没有正确的方法 预期结果 SELECT Column_1 FROM Table 质疑 捕获:@Param需要是int,以便提供输入。请这样使用 DECLARE @param AS INT; SELECT @param=1; DECLARE @SQL AS VARCHAR(MAX) = 'SELECT Column_'+CAST(@param AS VARCHAR(5))+' FROM Table' EXEC(@SQL); 请

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

预期结果

SELECT Column_1
FROM Table
质疑

捕获:@Param需要是int,以便提供输入。

请这样使用

DECLARE @param AS INT;
SELECT @param=1;
DECLARE @SQL AS VARCHAR(MAX) = 'SELECT Column_'+CAST(@param AS VARCHAR(5))+' FROM Table'
EXEC(@SQL);
请像这样使用

DECLARE @param AS INT;
SELECT @param=1;
DECLARE @SQL AS VARCHAR(MAX) = 'SELECT Column_'+CAST(@param AS VARCHAR(5))+' FROM Table'
EXEC(@SQL);
如果您不进行计算,则不需要使用数值变量 算术运算

声明@param VARCHAR

如果您不进行计算,则不需要使用数值变量 算术运算

声明@param VARCHAR


这表明您的表违反了1NF,称为重复组。这是一种可怕的数据建模方法,会导致各种问题。如果要使用varchar,则必须指定大小。如果没有,则使用默认值。参数的默认值为1,但变量的默认值为30。要明确,避免混淆或错误。啊,我完全理解你的观点@SeanLange!没错,这可能只是违反了一个或所有的正常形式。然而,作为一个背景,这不是针对OLTP系统,而是对已知的有限数据集进行一次性分析。不管使用什么,设计就是问题所在。当你看到像Email_1、Email_2、Email_3这样的东西时,这表明一切都将是一场艰苦的战斗。如果正确设计表,则从表中检索数据很简单。不幸的是,您正在努力检索数据……没错,我是被糟糕的设计困住的分析师。这表明您的表违反了1NF,即所谓的重复组。这是一种可怕的数据建模方法,会导致各种问题。如果要使用varchar,则必须指定大小。如果没有,则使用默认值。参数的默认值为1,但变量的默认值为30。要明确,避免混淆或错误。啊,我完全理解你的观点@SeanLange!没错,这可能只是违反了一个或所有的正常形式。然而,作为一个背景,这不是针对OLTP系统,而是对已知的有限数据集进行一次性分析。不管使用什么,设计就是问题所在。当你看到像Email_1、Email_2、Email_3这样的东西时,这表明一切都将是一场艰苦的战斗。如果正确设计表,则从表中检索数据很简单。不幸的是,您正在努力检索数据……没错,我是一名被错误设计困扰的分析师。如果您指定强制转换中varchar的大小,这是处理错误设计的一个好方法。我已将大小更新为varchar5.:谢谢Sean。如果您在强制转换中指定varchar的大小,这是处理不良设计的好方法。我已将大小更新为varchar5.:谢谢你,肖恩您应该始终为您使用的任何varchar变量和参数提供长度-您应该始终为您使用的任何varchar变量和参数提供长度
DECLARE @param VARCHAR
DECLARE @sql VARCHAR(MAX)
SET @param = '1';
SET @sql = 'select ' + 'Column_' + @param + ' From Table';
EXEC(@sql)