使用动态T-SQL将数据类型nvarchar转换为float时出错

时间:2013-11-06 16:34:58

标签: sql-server tsql dynamic-sql

为什么我收到转换错误?我甚至没有转换任何东西,即使在调试代码时我也无法弄清楚问题是什么。

DECLARE @pTbl NVARCHAR(20) = 'tblTPS'
DECLARE @sMD FLOAT = 3.3333333300000e-001
DECLARE @sIQ FLOAT = 000000000000.000e+000

SET @SQL ='UPDATE ' + @pTbl + ' SET fldND = (CASE WHEN fldND < ('+@sMD+' - (2 * 
          '+@sIQ+')) 
          THEN '+@sMD+' - (2 * '+@sIQ+') ELSE
          (CASE WHEN fldND > ('+@sMD+'+(2 * '+@sIQ+')) THEN '+@sMD+' + (2 *  
         '+@sIQ+')END)END)'

EXEC @SQL

2 个答案:

答案 0 :(得分:2)

将@sMD和@sIQ声明为NVARCHAR。您遇到转换错误,因为您在构建@SQL语句时尝试将它们添加到varchar变量中。

答案 1 :(得分:1)

DECLARE @pTbl NVARCHAR(20) = 'tblTPS'
DECLARE @sMD FLOAT = 3.3333333300000e-001
DECLARE @sIQ FLOAT = 000000000000.000e+000
DECLARE @Sql NVARCHAR(MAX)
SET @SQL ='UPDATE ' + CAST(@pTbl AS NVARCHAR) + ' SET fldND = (CASE WHEN fldND < ('+CAST(@sMD AS NVARCHAR)+' - (2 * 
          '+CAST(@sIQ  AS NVARCHAR)+')) 
          THEN '+CAST(@sMD AS NVARCHAR)+' - (2 * '+CAST(@sIQ AS NVARCHAR)+') ELSE
          (CASE WHEN fldND > ('+CAST(@sMD  AS NVARCHAR)+'+(2 * '+CAST(@sIQ  AS NVARCHAR)+')) THEN '+CAST(@sMD  AS NVARCHAR)+' + (2 *  
         '+CAST(@sIQ  AS NVARCHAR)+')END)END)'

PRINT @SQL

打印结果

UPDATE tblTPS SET fldND = (CASE WHEN fldND < (0.333333 - (2 * 
          0)) 
          THEN 0.333333 - (2 * 0) ELSE
          (CASE WHEN fldND > (0.333333+(2 * 0)) THEN 0.333333 + (2 *  
         0)END)END)

<强>释
在基本创建SQL Dynamic时,如果您尝试将intiger连接到字符串,则SQL语言会尝试将字符串转换为INT,因为INT具有更高的数据类型优先级。
当您尝试将String连接到Sql Dynamic并且您希望SQL Dynamic将其视为单独的字符串而不是动态字符串的一部分时,例如,yor传递字符串'John'然后您必须使用单引号传递给Dynamic Sql时有两次这样的

DECLARE @NAME NVARCHAR(20) = 'John'
DECLARE @Sql1 NVARCHAR(MAX)

SET @Sql1 = 'SELECT * FROM Table WHERE NAME IN ('''+ @NAME + ''')'
PRINT @Sql1

打印结果

SELECT * FROM Table WHERE NAME IN ('John')