2017-07-17 31 views
0

我必须从TSQL移动我的数据库向PostgreSQL,我与Postgres的很新,我不发现我怎么能这个存储过程转换为功能的Postgres转换配合物TSQL程序到PostgreSQL

这我的T-SQL存储过程(我简化,就像我可以)2列式排

预期回报列表(十进制,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 

我的问题?

,如果你在TSQL

execute dbo.procSelectOpenDocument(1) 

结果

ID | OrderNumber 
1 | Some String value 

execute dbo.procSelectOpenDocument(2) 

结果

ID | OrderNumber2 
1 | Some String value 

至于你可以看到执行此,根据参数的列名更改的列表。

但这是行不通的!

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

你想不想的列名更改后编辑? – Magnus

+0

这在Postgres中不是(很容易)。解析SQL语句时,必须知道所有列的数量和名称。 –

+0

是的,我想列名更改? –

回答

0

与你不要别名为第二个查询的列名?

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

评论

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

我说我简化了样本,但是如果可能的话,我的目标不是放置别名,我知道该怎么做谢谢你的帮助。 –

+0

你可以发布你的postgresql,所以我可以测试它吗?也许准备在http://rextester.com最小的代码?所以你需要不同的名字取决于参数? –

+0

在后端我使用DataSet(.Net)和我的方式来获取我现在看到的特定列名称 –