Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando variável com SQL dinâmico


Você tem a linha AND ( @BG = ''''OR COM.BGName =''' + @BG +''' . `@BG' não está declarado em seu SQL dinâmico. Você precisa passá-lo como fez mais tarde na mesma linha:
AND   ( '' +  @BG + '' = '''' OR  COM.BGName =''' + @BG +'''

Essa consulta, no entanto, parece estar aberta à injeção de SQL; seria muito melhor parametrizá-lo:
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

Nota (como eu sei que as pessoas têm o hábito de não ler os comentários que as pessoas deixam para eles em seu código) eu não tenho ideia de qual é o tipo de dados para @BG e @Trans_date é, assim, eu calculei que eles são int e date respectivamente. Você precisará alterar isso, se eu tiver adivinhado incorretamente.

Você pode ver nos comentários que você precisa ver como você adiciona os valores das colunas à sua consulta também; do jeito que você fez pode também estar aberto à injeção, mas não vi a parte anterior da sua consulta.