سؤال

Why am I getting a conversion error? I'm not even converting anything and even when debugging the code I can't figure out what the issue is.

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
هل كانت مفيدة؟

المحلول

Declare @sMD and @sIQ as NVARCHAR as well. You're getting conversion error because you're trying to add them to varchar variables while building your @SQL statement.

نصائح أخرى

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

PRINT RESULT

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)

Explaination
When creating SQL Dynamic basicly you are concatinating Multiple Strings if you try to concatinate an intiger to a string SQL Server tries to convert the string into INT, because INT has a higher data type precedence.
When you are trying to concatinate a String into Sql Dynamic and you want SQL Dynamic to consider it as a Separate string but not a part of the Dynamic String, for instance yor are passing a String 'John' Then you have to to use Single Quotes Twice when passing to Dynamic Sql something like this

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

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

PRINT RESULT

SELECT * FROM Table WHERE NAME IN ('John')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top