我想查询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?
答案 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;