sql >> データベース >  >> RDS >> Sqlserver

動的 SQL での変数の使用

    AND ( @BG = ''''OR COM.BGName =''' + @BG +''' という行があります . `@BG' が動的 SQL で宣言されていません。後で同じ行で行ったように、これを渡す必要があります:

    AND   ( '' +  @BG + '' = '''' OR  COM.BGName =''' + @BG +'''
    

    ただし、このクエリは SQL インジェクションに対してオープンであるように見えます。パラメータ化する方がはるかに良いでしょう:

    SET @query = N'
    SELECT ComponentName,
            '+ @cols + N'  --This might need to be changed as well, but i don''t know how you''re generating this and I''m not guessing
    FROM (SELECT SUM(('+ @Sum_cols + N') AS Comp_stock, --This might need to be changed as well, but i don''t know how you''re generating this and I''m not guessing
                 Com.ComponentName,
                 BB.BB_Name  
          FROM Z_DM_DR_CM_STOCK COM
               INNER JOIN BLOOD_BANK_MASTER BB ON COM.BB_srno =BB.BB_SRNO
          WHERE Com.Trans_date = @sTrans_date
            AND (@sBG = '''' OR COM.BGName = @sBG )
          GROUP BY Com.ComponentName,
                   BB.BB_Name) AS sourcetable 
    PIVOT (
        --This might need to be changed as well, but i don''t know how you''re generating this and I''m not guessing
        SUM([Comp_stock]) FOR [BB_Name] IN ('+ @cols + N')) AS PIVOTTABLE
    ORDER BY ComponentName';
    
    EXEC sp_executesql @query, N'@sBG int, @sTrans_date date', @sBG = @BG, @sTrans_Date = @trans_date; --I have guessed your data types
    

    注 (人々がコードに残したコメントを読まない習慣があることは知っているので) @BG のデータ型がわかりません および @Trans_date です、したがって、私はそれらが int であると推測しました および date それぞれ。私の推測が間違っていた場合は、これを変更する必要があります。

    コメントから、列の値をクエリに追加する方法も確認する必要があることがわかります。あなたのやり方はかもしれません インジェクションの可能性もありますが、クエリの前半部分は見ていません。




    1. 上位10レコードを選択するSQL

    2. 最も難しい質問のヘルプのための最高のSQLServerパフォーマンスフォーラム

    3. Oracleクエリで条件付きで列を選択する方法

    4. MySQL IF()関数の説明