2013-10-08 23 views
0

我有以下查詢,這從Oracle數據庫中提取數據到SQL Server 2005:傳遞多個值到變量鏈接服務器連接字符串

SELECT * 
FROM (
    SELECT * 
    FROM OPENQUERY(LINKEDSERVERNAME, 'SELECT FOO, BAR, FROM TABLE 
    WHERE ID IN(' + @IDs + ' 
    ')) AS TMP 
WHERE SOME_ID IN 
    (SELECT DISTINCT ID 
    FROM LOCALTABLE); 

運行時,但是,很長,因爲查詢從鏈接的服務器導致大量的行。我只對少數這些行感興趣,但限制查詢的條件保存在目標數據庫中。

通過對SO另一篇文章,我看我可能會使用動態SQL,看起來像一個變量:

DECLARE @IDs AS NVARCHAR(100); 

SET @IDs = (SELECT ID FROM LOCALTABLE) 

DECLARE @sql AS NVARCHAR(3000); 

SET @sql = 'SELECT * FROM OPENQUERY(LINKEDSERVERNAME, ''SELECT FOO, BAR, FROM TABLE 
WHERE ID IN(' + @IDs + '))' 

EXEC sp_executesql @sql 

不過,我顯然不能超過一個值賦給變量,所以結果設置僅包含放置在@IDs中的最終ID的結果。

對於本地表中的所有不同ID完成此任務的最佳策略是什麼?

+0

您不能爲變量指定多個值,因爲該@ID變量的select查詢顯示它只有一個值。您已經將變量正確地定義爲字符串,但是您不認爲您需要在該查詢中進行更多操作以將所有值選擇爲逗號分隔值嗎?簡單的普通選擇將覆蓋之前存儲在變量中的值,並且只會將最後一個值作爲變量的最終結果。 –

+0

我知道這個策略是有缺陷的,但這是我得到的最好的。任何指針歡迎。 – user1893148

回答

1

Anup Shah已經指出他評論中的錯誤。您的SELECT分配只會將一個值放入您的變量中。您需要一種方法將表格結果轉換爲IN語句的CSV樣式。 Pinal Dave有一篇很好的文章,它展示了一種用XML PATH做這件事的熟知技術。

http://blog.sqlauthority.com/2009/11/25/sql-server-comma-separated-values-csv-from-table-column/

值得關注的是SELECT @var = @var + VAR FROM表是不是這樣做的有效方式,但它可能會出現在某些情況下工作。

James

+0

謝謝。你能否建議將變量設置爲博客文章中概述的'SELECT SUBSTRING'查詢的最佳方式? – user1893148

+0

SET @var = ( \t SELECT SUBSTRING( \t(SELECT '' + s.Name \t FROM HumanResources.Shift小號 \t ORDER BY s.Name \t FOR XML PATH( '')); 2, 200000)AS CSV ) –

+0

我喜歡這種策略,但是因爲它使得變量爲一個字符串(例如'ID1,ID2,ID3'),它在查詢字符串中沒有正確傳遞,並且錯誤消息102,Level 15 ,狀態1 ..在','附近。 – user1893148

相關問題