2016-12-02 1 views
0

Ich möchte eine SQL Server gespeicherte Prozedur schreiben, aus dieser Abfrage abrufen geschwenkt ErgebnisStored Procedure Fehler Umwandlung 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 

aber ich diesen Fehler Ergebnis bekam:

Prozedur Ausführung fehlgeschlagen 22018 - [SQL Server] Konvertierung fehlgeschlagen, wenn der nvarchar-Wert 'SELECT tangal, [54], [11], [56], [53], [40], [21], [12] von ( ) SELECT cpo. Tanggal, dg.asal, (((((cpo - ongkos_ms)) * CAST (NULLIF (dg.minyak_efektif, 0) als Gleitkommazahl)/(NULLIF (dg.tbs_diolah, 0))) + ((pko - ongkos_is) * CAST (NULLIF (dg. inti_efektif, 0) als float)/(NULLIF (dg.tbs_diolah, 0)))) - (447.6 * ((NULLIF (dg.minyak_efektif, 0) als Gleitkommazahl)/(NULLIF (dg.tbs_diolah, 0))) + (CAST (NULLIF (dg.inti_efektif, 0) als Gleitkommazahl)/(NULLIF (dg.tbs_diolah, 0)))))) - (((((cpo - ongkos_ms) * CAST (NULLIF (dg.minyak_efektif, 0) als Gleitkomma)/(NULLIF (dg.tbs_diolah, 0))) + ((pko - ongkos_is) * CAST (NULLIF (dg.inti_efektif, 0) als Gleitkomma)/(NULLIF (dg.tbs_diolah, 0)))) - (447.6 * ((NULLIF (dg.minyak_efektif, 0) als float)/(NULLIF (dg.tbs_diolah, 0))) + (CAST (NULLIF (dg.inti_efektif, 0) als float)/(NULLIF (dg.tbs_diolah, 0)))))) * 0,02)) als harga_beli_tbs_bersih FROM cpopko CPO LEFT JOIN DAILY_GUU AS dg ON CONVERT (DATETIME dg.tglolah, 103) = cpo.tangg al LINKE VERBINDUNG PNL_TR_HARGA_KOMODITI AS ko EIN ko.tanggal = cpo.tanggal WHERE YEAR (cpo.tanggal)> = 'zum Datentyp int.

Ich bin total verwirrt über diesen Fehler. Ich recherchiere bereits bei Google, kann aber die Probleme nicht beheben. Hoffe ihr könnt mir helfen - danke im Voraus.

Antwort

2

Der Fehler ist aufgrund der Verkettung der Ganzzahl @tahun Variable mit Zeichenfolge. Da INT höhere Priorität hat als Varchar, wird die Zeichenfolge implizit in INT umgewandelt, so dass der Fehler auftritt. So müssen Sie die @tahun explizit varchar

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

konvertieren Außerdem müssen Sie das gleiche tun Variablen Umbenennung in der Abfrage verwendet. Aber ich will lieber SP_EXECUTESQL verwenden Wert Variablen übergeben

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

i werfen bereits alle params in ‚@query‘ string zu varchar, aber kein Ergebnis herauskommen. Muss ich die Params auch in '@cols' umwandeln? Was ist der Unterschied zwischen Ausführen und Sp_executesql thnks be4 sir – Jsnow

+0

@Jsnow - Übergeben Sie die Parameterwerte an statische Abfrage und überprüfen, ob es Datensätze zurückgibt. Mit 'SP_EXECUTESQL' können Sie Werte an Variablen innerhalb einer dynamischen Abfrage übergeben, wodurch SQL Injection vermieden wird. Sie können das Ergebnis auch aus dynamischer Abfrage in Variable erhalten. Überprüfen Sie hier für weitere Informationen https://msdn.microsoft.com/en-us/library/ms188001.aspx –

+0

diese schwenkbare Tabelle hat dynamische Spalte basierend auf Wert in der vorherigen Tabelle. Von dem, was ich lerne, etwas zurückzugeben, können wir Funktion verwenden, aber um Tabellenwert zurückzugeben, müssen wir die temporäre Tabelle zusammen mit ihrer Spalte vordefinieren. Wie können wir eine temporäre Tabelle in Funktion erstellen, deren Spalte basierend auf Abfrageergebnis dynamisch ist. Danke im Voraus, Sir. – Jsnow

Verwandte Themen