2012-04-27 130 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

相關問題