2

変換エラーが発生するのはなぜですか? 私は何も変換していませんし、コードをデバッグしても問題が何であるかわかりません。

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
4

2 に答える 2

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 を作成する場合、整数を文字列に連結しようとすると、基本的に複数の文字列を連結します。SQL Server は文字列を INT に変換しようとします。これは、INT の方がデータ型の優先順位が高いためです。
文字列を Sql Dynamic に連結しようとしていて、SQL Dynamic にそれを別の文字列として認識させ、動的文字列の一部ではないと見なさせたい場合、たとえば、文字列 'John' を渡している場合は、一重引用符を使用する必要があります。このようなDynamic Sqlに渡すときに2回

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')
于 2013-11-06T17:17:15.490 に答える