2

次の例では、BEGIN ステートメントの後に印刷を配置しようとしても機能しません。BEGIN-END ステートメント内のすべてを削除して印刷を配置すると、機能します。

SET @SQL = 'IF (((SELECT fldLT FROM #zArray) = ''p'') OR ((SELECT fldMF FROM #zArray) <> -1))
            BEGIN
                SET @X = '+@Z+' * ((SELECT fldLF FROM #zArray) / 100))

                IF (CAST((SELECT fldMF FROM #zArray) AS FLOAT) > '+@X+')
                    BEGIN
                        SET @X = (CAST((SELECT fldMF FROM #zArray) AS FLOAT))
                    END                         
                END'   

EXEC sp_executesql @SQL, N'@X NVARCHAR(50),@Z NVARCHAR(50)', @X, @Z

print ステートメントが機能しない原因となる次のコードに何か問題がありますか?

    'SET @X = '+@Z+' * ((SELECT fldLF FROM #zArray) / 100))

                IF (CAST((SELECT fldMF FROM #zArray) AS FLOAT) > '+@X+')
                    BEGIN
                        SET @X = (CAST((SELECT fldMF FROM #zArray) AS FLOAT))
END'
4

2 に答える 2

2

手順 で、パラメーターを連結し、それらを再度使用している理由がわかりませんsp_executesql

クエリを少し変更し、パラメーターの連結を削除し、REPLACE関数を使用して、プレースホルダーをパラメーターに置き換えました。

DECLARE @X NVARCHAR(50) = '123'
DECLARE  @Z NVARCHAR(50) = '123'
DECLARE @SQL NVARCHAR(MAX)

SET @SQL = 'IF (((SELECT fldLT FROM #zArray) = ''p'') OR ((SELECT fldMF FROM #zArray) <> -1))
            BEGIN
                SET @paramX = @paramZ * ((SELECT fldLF FROM #zArray) / 100))

                IF (CAST((SELECT fldMF FROM #zArray) AS FLOAT) > @paramX)
                    BEGIN
                        SET @paramX = (CAST((SELECT fldMF FROM #zArray) AS FLOAT))
                    END                         
                END'   

SET @SQL = REPLACE(@SQL,'@paramX',@X)
SET @SQL = REPLACE(@SQL,'@paramZ',@Z)

PRINT @SQL

EXEC sp_executesql @SQL

私にとっては、PRINT ステートメントは正常に機能しています。

于 2013-11-07T17:00:34.163 に答える
0

動的SQLで使用されている変数ではなく、文字列として渡すSQLステートメントが必要です

DECLARE @Xr NVARCHAR(50) = '1000351' DECLARE  @Zr NVARCHAR(50) = '46546321'
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'IF (((SELECT fldLT FROM #zArray) = ''p'') OR ((SELECT fldMF FROM #zArray) <> -1))
            BEGIN
                SET @X = @Z * ((SELECT fldLF FROM #zArray) / 100))

                IF (CAST((SELECT fldMF FROM #zArray) AS FLOAT) > @X)
                    BEGIN
                        SET @X = (CAST((SELECT fldMF FROM #zArray) AS FLOAT))
                    END                         
                END '   
PRINT @SQL
EXEC sp_executesql @SQL, 
                    N'@X NVARCHAR(50),@Z NVARCHAR(50)', 
                    @X = @Xr, 
                    @Z = @Zr

印刷結果

IF (((SELECT fldLT FROM #zArray) = 'p') OR ((SELECT fldMF FROM #zArray) <> -1))
            BEGIN
                SET @X = 46546321 * ((SELECT fldLF FROM #zArray) / 100))

                IF (CAST((SELECT fldMF FROM #zArray) AS FLOAT) > 1000351)
                    BEGIN
                        SET @X = (CAST((SELECT fldMF FROM #zArray) AS FLOAT))
                    END                         
                END 
于 2013-11-07T14:14:07.130 に答える