在动态sql查询中将varchar转换为数值时出错

在动态sql查询中将varchar转换为数值时出错,sql,sql-server-2012,Sql,Sql Server 2012,我有这样一个要求,即传递给SP的输入参数是数值类型(18,6)。这个参数被传递给动态sql查询(类型varchar),结果将存储到临时表中。在临时表I中,hv将上述列类型定义为仅数字。但是在执行SP时,我得到“将数据类型varchar转换为数值时出错” 使用动态Sql有限制吗?谁来帮我一下 示例查询: ------------- Input Parameter: @DataItem numeric(18,6) = ABC054356 (column name) CREATE TABLE #

我有这样一个要求,即传递给SP的输入参数是数值类型(18,6)。这个参数被传递给动态sql查询(类型varchar),结果将存储到临时表中。在临时表I中,hv将上述列类型定义为仅数字。但是在执行SP时,我得到“将数据类型varchar转换为数值时出错” 使用动态Sql有限制吗?谁来帮我一下

示例查询:

-------------
Input Parameter: @DataItem numeric(18,6) = ABC054356  (column name) 

CREATE TABLE #Temp1(RowNum int, 
                    CompanyID int, 
                    ABCColumn numeric(18,2), 
                    FiscalYear varchar(100))

DECLARE @QUERY varchar(max)

SET @QUERY = N'select row_number() over (partition by fy.keyinstn order by fy.fiscalyear desc) as RowNum, fy.Keyinstn, '
                        + Convert(@DataItem as numeric(18,2)))+
                        ', period.fiscalyear from ABCTable
................
................


INSERT into #Mnemonic
EXEC(@query)

在连接之前,应将数值转换为字符串

SET @QUERY = N'select row_number() over (partition by fy.keyinstn order by fy.fiscalyear desc) as RowNum, fy.Keyinstn, '
                        + CONVERT(VARCHAR(20), @DataItem)+
                        ', period.fiscalyear from ABCTable ....... '

显然,您正在表中传入一个列名,然后要转换该列名

如果是这样的话,这看起来就像

declare @sql nvarchar(max);

set @sql = N'
select row_number() over (partition by fy.keyinstn order by fy.fiscalyear desc) as RowNum,
       fy.Keyinstn,
       convert(decimal(18, 2), [DataItem]) as [DataItem], 
       period.fiscalyear
from ABCTable
. . .
';

set @sql = replace(@sql, '[DataItem]', @DataItem);

insert into #Mnemonic
    exec(@query);

您的示例输入值是什么?将数值类型param转换为字符串以进行字符串连接,然后在@DataItem=ABC054356和ABC054356之间转换为数值“选择转换('+Convert(@DataItem as varchar)+',numeric(18,2)”,ABC054356是数值(18,6)data type.ABC054356将是列名,值将是1435.87654356.8879,0.0000…您的语法使用错误。您应该与参数一起使用。以防止攻击。(不确定为什么您只需要为order by使用强制转换)我需要定义[DataItem]吗?@Tim…否。
replace()
将其替换为列名。