2016-12-03 46 views
0

我有這樣的查詢:可變標申報錯誤

declare @cols AS NVARCHAR(MAX); 
declare @query AS NVARCHAR(MAX); 
declare @tahun AS VARCHAR(4); 
declare @pks AS VARCHAR(2); 
declare @bulan AS VARCHAR(2); 

set @tahun = '2016'; 
set @pks = '40'; 
set @bulan = '11'; 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.asal) 
      FROM (
       SELECT 
       cpo.tanggal, 
       dg.asal, 
       (((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))))-(((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))))) * 0.02)) 
       as harga_beli_tbs_bersih 
       FROM 
          PROD.dbo.[TBSP3.HargaCPOPKO] cpo 
         LEFT JOIN PROD.dbo.daily_GUUXX AS dg ON CONVERT (datetime, dg.tglolah, 103) = cpo.tanggal 
         LEFT JOIN PNL_TR_HARGA_KOMODITI AS ko ON ko.tanggal = cpo.tanggal 
         WHERE 
       YEAR (cpo.tanggal) >= @tahun and [email protected] and month(cpo.tanggal)[email protected] 
      ) c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 


set @query = 'SELECT tanggal, ' + @cols + ' from 
      (
        SELECT 
        cpo.tanggal, 
        dg.asal, 
        (((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))))-(((((cpo - ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))) +((pko - ongkos_is)* CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0))))-(447.6 * ((CAST(NULLIF(dg.minyak_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))+(CAST(NULLIF(dg.inti_efektif,0) as float)/(NULLIF(dg.tbs_diolah, 0)))))) * 0.02)) 
        as harga_beli_tbs_bersih 
       FROM 
            PROD.dbo.[TBSP3.HargaCPOPKO] cpo 
           LEFT JOIN PROD.dbo.daily_GUUXX AS dg ON CONVERT (datetime, dg.tglolah, 103) = cpo.tanggal 
           LEFT JOIN PNL_TR_HARGA_KOMODITI AS ko ON ko.tanggal = cpo.tanggal 
           WHERE 
        YEAR (cpo.tanggal) >= '[email protected]tahun +' and pks='+ @pks +' and month(cpo.tanggal)='[email protected]+' 
      ) x 
      pivot 
      (
       max(harga_beli_tbs_bersih) 
       for asal in (' + @cols + ') 
      ) p '; 

exec (@query); 
end 

當我運行它,我得到一個錯誤:

[Err] 42000 - [SQL Server] Must declare the scalar variable "@tahun"

我已經嘗試過所有類型的變量聲明,但我仍然得到那個錯誤。我仍然是SQL查詢的新手。提前致謝!

回答

0

您正在比較字符串與整數。

你可以嘗試:

declare @tahun AS INT; 
set @tahun = 2016; 

而且

YEAR (cpo.tanggal) >= '+ CONVERT(varchar(4), @tahun) +' and pks='