2012-04-27 129 views
1

我想查询包含信息列表的PostgreSQL数据库,以便从MSSQL中简单计数当前记录。 PG服务器是MSSQL中的链接服务器。将postgres函数的结果返回为SQL存储过程作为参数

我对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?

回答

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; 
+1

'OPENQUERY'的第二个参数必须是只是一个字符串,它不可能是一个表达式。 (这意味着你不能直接参数化,如果你想参数化,你需要使它成为一个动态查询。) – 2012-04-27 17:49:13

+1

解决了这个问题。 'SET \t @Query = N'SELECT test.get_count('''+ @Id +''','''+ @Div +''','+ CAST(@Company AS VARCHAR)+',0) ;” SET \t @Query = N'SELECT @RecCount = get_count FROM OPENQUERY(PostgreSQLPROD,'''+ REPLACE(@Query,'''',''''')+''')' --PRINT @查询 \t EXECUTE sp_executesql的 \t \t @Query \t \t,N '@ RECCOUNT INT输出' \t \t,@ RECCOUNT = @i输出; \t SELECT @i' 就是这么做的。谢谢你们! – sighlent 2012-04-27 19:44:47

相关问题