1

我想查询包含信息列表的 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'.

办公室伙伴说将值存储在临时表中,查询它,然后删除它。恕我直言,效率不是很高,但它会完成工作。

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

4

1 回答 1

1

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

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

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

这是.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;
于 2012-04-27T16:51:33.023 回答