2017-07-17 5 views
0

ich meine DB von TSQL zu PostgreSQL bewegen, ich bin ganz neu mit Postgres und ich fand nicht, wie ich in Postgres diese gespeicherte Prozedur auf eine Funktion umwandeln kannConvert complexe TSQL Verfahren Postgresql

Diese mein TSQL ist Stored Procedure (I so viel vereinfachen, wie ich kann)

Erwartete Rendite Liste der Zeilen mit 2 Spalten Typ (dezimal, varchar)

CREATE PROCEDURE dbo.procSelectOpenDocument(
@ItemType_id decimal(38) 
) 
AS 
IF @ItemType_id = 1 
BEGIN 
SELECT d.ID, d.OrderNumber 
FROM dbo.Table1 d 
END 

IF @ItemType_id = 2 
BEGIN 
SELECT d.ID, d.OrderNumber2 
FROM dbo.Table2 d 
END 

Mein Problem?

, wenn Sie dies in TSQL Execute

execute dbo.procSelectOpenDocument(1) 

Ergebnis

ID | OrderNumber 
1 | Some String value 

execute dbo.procSelectOpenDocument(2) 

Ergebnis

ID | OrderNumber2 
1 | Some String value 

Wie Sie sehen können, in Abhängigkeit der Liste der Spaltennamensänderung des Parameters.

Aber das funktioniert nicht !!!!

CREATE OR REPLACE FUNCTION dbo.procSelectOpenDocument(IN p_ItemType_id bigint) 
RETURNS TABLE 
(
    ID bigint 
    ,Name varchar(150) 
) 
LANGUAGE 'plpgsql' 
AS $function$ 
begin 

if p_ItemType_id = 1 then 

    RETURN QUERY SELECT d.ID, d.OrderNumber FROM dbo.Table1 d; 


    end if; 


    if p_ItemType_id = 2 then 
     RETURN QUERY SELECT d.ID, d.OrderNumber2 FROM dbo.Table2 d; 
    end if; 

    end 
    $function$; 
+0

und Sie nicht die Spaltennamen ändern wollen wollen? – Magnus

+0

Das ist in Postgres nicht (einfach) möglich. Die Anzahl und Namen aller Spalten müssen beim Parsen einer SQL-Anweisung bekannt sein. –

+0

Ja Ich möchte Spalte Name ändern? –

Antwort

0

mit alias nicht den Spaltennamen für die zweite Abfrage?

IF @ItemType_id = 2  
    BEGIN 
    SELECT d.ID, d.OrderNumber2 as OrderNumber 
    FROM dbo.Table2 d 
    END 

EDIT nach Kommentare

IF @ItemType_id = 1 
BEGIN 
SELECT d.ID, d.OrderNumber, null as OrderNumber2 
FROM dbo.Table1 d 
END 

IF @ItemType_id = 2 
BEGIN 
SELECT d.ID, null as OrderNumber, d.OrderNumber2 
FROM dbo.Table2 d 
END 
+0

Ich sage, ich vereinfache das Beispiel, aber das Ziel ist nicht, Alias ​​zu setzen, wenn das möglich war. Ich weiß, wie es geht. Danke für Ihre Hilfe. –

+0

Können Sie PostgreSQL posten, damit ich es testen kann? Vielleicht einen minimalen Code in http://rextester.com vorbereiten? Du willst also einen anderen Namen, abhängig vom Parameter? –

+0

Im Backend benutze ich DataSet (.Net) und ich weise für einen bestimmten Spaltennamen –