将postgres函数的结果作为参数返回给SQL存储过程

时间:2012-04-27 16:35:56

标签: sql sql-server sql-server-2008 postgresql

我想查询PostgreSQL数据库,其中包含信息列表,用于简单计算MSSQL中的当前记录。 PG服务器是MSSQL中的链接服务器。

我对Postgre知之甚少但却足够危险。我创建了一个简单的查询驻留在函数内部,如下所示:

CREATE FUNCTION get_count(id text, division text, company integer, INOUT recCount integer) AS $$
BEGIN
recCount := (SELECT COUNT(0)
               FROM test.inventory
               WHERE inv_id = $1 AND div_code = $2 AND cmpy_no = $3);
END;
$$ LANGUAGE plpgsql;

我可以整天查询它:

SET @Query = 'SELECT test.get_count(''' + @Id+ ''', ''' + @Div + ''', ' + CAST(@Company AS VARCHAR) +', ?);'
EXEC (@Query) AT POSTGRESQLTEST;

但我无法将其分配给这样的变量:

SET @i = EXEC (@Query) AT POSTGRESQLPROD;
-- Error: Incorrect syntax near the keyword 'EXEC'.

Office配合说,将值存储在临时表中,查询它,然后删除它。不是很高效恕我直言,但它会完成工作。

那我还能做什么?如何利用PG服务器的INOUT参数recCount?

1 个答案:

答案 0 :(得分:1)

根据以下评论的反馈进行编辑。
我认为这应该适用于OpenQuery

SELECT * FROM OpenQuery(POSTGRESQLTEST,
                'SELECT test.get_count(''some_inv_id'', ''some_div_code'', 123')

正如@Andriy所指出的,OpenQuery不接受变量。对于准动态SQL,您必须先组装整个查询字符串,然后才能执行它。你必须加倍围绕字符串的单引号 - 两次!

这是example on .databasejournal.com如何做到的 @sighlent在下面提供了他的解决方案。


另外,关于plpgsql函数:

您似乎不需要recCount的输入值。为了简化一些事情,可以使OUT参数而不是INOUT,并且您将减少一个输入参数:

CREATE OR REPLACE FUNCTION x.get_count(id text, division text, company integer
                                                       , OUT recCount integer) AS
$BODY$
BEGIN
    recCount := (
       SELECT COUNT(*)
       FROM   test.inventory
       WHERE  inv_id   = $1
       AND    div_code = $2
       AND    cmpy_no  = $3);
END;
$BODY$ LANGUAGE plpgsql;