2016-12-02 16 views
0

我想寫一個SQL Server存儲過程從該查詢存儲過程誤差轉換的SQL Server

ALTER procedure [dbo].[sp_get_list_penerimaan_pks] 
    (@tahun int, 
    @bulan int, 
    @pks int) 
as 
begin 
    SET NOCOUNT ON; 

    declare @cols AS NVARCHAR(MAX); 
    declare @query AS NVARCHAR(MAX); 

    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 
       cpopko cpo 
       LEFT JOIN DAILY_GUU 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 
        cpopko cpo 
       LEFT JOIN DAILY_GUU 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] +' and [email protected] and month(cpo.tanggal)[email protected] 
      ) x 
      pivot 
      (
       max(harga_beli_tbs_bersih) 
       for asal in (' + @cols + ') 
      ) p ' 

    execute(@query) 
end 

檢索轉動的結果,但我得到這個錯誤結果:

程序執行失敗22018 - 當轉換nvarchar值'SELECT tanggal,[54],[11],[56],[53],[40],[21] [12]時,[0121]唐加爾, dg.asal,(((cpo-ongkos_ms)* CAST(NULLIF(dg.minyak_efektif,0)as float)/(NULLIF(dg.tbs_diolah,0)))+((pko-ongkos_is)* CAST(NULLIF(dg。 ((NULLIF(dg.minb_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)/ (dg.tbs_diolah,0))))))* 0.02)) 作爲harga_beli_tbs_bersih FROM cpopko CPO LEFT JOIN DAILY_GUU AS DG ON CONVERT(日期時間,dg.tglolah,103)= cpo.tangg al LEFT JOIN PNL_TR_HARGA_KOMODITI AS ko ON ko.tanggal = cpo.tanggal WHERE YEAR(cpo.tanggal)> ='爲數據類型int。

我完全對這個錯誤感到困惑。我已經從谷歌做了一些研究,但仍然無法解決問題。希望你們能幫助我 - 事先感謝。

回答

2

錯誤是由於串聯整數@tahun變量與字符串。由於INT的優先級高於Varchar,因此該字符串將隱式轉換爲INT以便發生錯誤。所以,你需要的@tahun顯式轉換爲varchar

YEAR (cpo.tanggal) >= '+cast(@tahun as varchar(50))+' 

你也需要做同樣的重命名查詢中使用的變量。但是,我會更喜歡使用SP_EXECUTESQL價值傳遞給變量

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 
        cpopko cpo 
       LEFT JOIN DAILY_GUU 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] 
      ) x 
      pivot 
      (
       max(harga_beli_tbs_bersih) 
       for asal in (' + @cols 
      + ') 
      ) p ' 

EXEC Sp_executesql 
    @query, 
    N'@tahun int,@pks int,@bulan int', 
    @tahun = @tahun, 
    @pks = @pks, 
    @bulan = @bulan 
+0

我已經全部投在PARAMS「@查詢」字符串爲varchar,但沒有結果出來。我是否需要在'@cols'中輸入參數太先生?執行和Sp_executesql thnks之間的區別是什麼be4 sir – Jsnow

+0

@Jsnow - 將參數值傳遞給靜態查詢並檢查它是否返回任何記錄。 'SP_EXECUTESQL'允許您在動態查詢中將值傳遞給變量,以避免SQL注入。你也可以從動態查詢結果中獲得結果。點擊此處查看更多信息https://msdn.microsoft.com/en-us/library/ms188001.aspx –

+0

此旋轉表根據上表中的值獲取了動態列。從我學會返回的東西我們可以使用函數,但要返回表值,我們必須預定義臨時表及其列。我們如何根據查詢結果在其列動態的函數中創建一個臨時表。先謝謝先生。 – Jsnow