這是我的第一篇文章。希望得到我的代碼一些幫助。SQL Server存儲過程合併2個OpenQuery的輸出結果
我正在嘗試編寫一個存儲過程來合併來自每個指向不同鏈接服務器的2個打開查詢的結果。
存儲過程接受一個參數。
第一OPENQUERY
回報Col1, Col2, Col3, Col4
多行我想的Col1
結果傳遞給第二OPENQUERY
返回Col1,Col5,Col6
,然後將結果組合成一個表變量以從讀出。
我不能在這裏粘貼確切的查詢,但會粘貼結構。希望有助於理解我目前的做法。感謝我能否得到一些建議。
這適用於1輸入但顯然失敗時,我通過多個輸入。我如何處理第一個查詢的結果並傳遞給第二個查詢。
ALTER PROCEDURE [dbo].[MyStoredProc]
@Input AS NVARCHAR(MAX)
AS
BEGIN TRY
SET NOCOUNT ON;
DECLARE @TSQL1 NVARCHAR(MAX)
DECLARE @TSQL2 NVARCHAR(MAX)
DECLARE @Col1Results NVARCHAR(MAX)
/*** OpenQuery 1***/
SELECT @TSQL1 = 'SELECT Col1, Col2, Col3, Col4 FROM Table1
WHERE Input IN ('''+ @Input +''') '
DECLARE @tblTempTable1 AS TABLE
(
Col1 NVARCHAR(100),
Col2 NVARCHAR(100),
Col3 NVARCHAR(50),
Col4 NVARCHAR(50)
)
INSERT INTO @tblTempTable1
EXEC (@TSQL1) AT [LinkedServer1]
SELECT @Col1Results = Col1
FROM @tblTempTable1
/*** Open Query 2***/
SELECT @TSQL2 = 'SELECT Col1, Col5, Col6 FROM Table2
WHERE Input IN ('''+ @Col1Results +''') '
DECLARE @tblTempTable2 AS TABLE
(
Col1 NVARCHAR(100),
Col5 NVARCHAR(100),
Col6 NVARCHAR(50)
)
INSERT INTO @tblTempTable2
EXEC (@TSQL2) AT [LinkedServer2]
SELECT
t1.Col1, t1.Col2, t1.Col3, t2.Col2, t2.Col3
FROM
@tblTempTable1 t1
INNER JOIN
@tblTempTable2 t2 ON t1.Col1 = t2.Col1
END TRY
BEGIN CATCH
END CATCH
---------------------------Update---------------------------------
我能夠使用遊標來實現期望的結果。但注意到在很大程度上使用光標命中性能。下面的代碼可以進一步優化以提高性能。謝謝。
ALTER PROCEDURE [dbo].[MyStoredProc]
@Input AS NVARCHAR(MAX) AS
BEGIN TRY
SET NOCOUNT ON;
Declare @tblTempTable1 Table
(
Col1 Nvarchar(100),
Col2 Nvarchar(100),
Col3 nvarchar(50),
Col4 nvarchar(50)
)
SELECT @TSQL1 = 'Select Col1,Col2,Col3,Col4 From Table1
where Input in ('''[email protected]+''')'
Insert @tblTempTable1 EXEC (@TSQL1) at [LinkedServer1]
Declare @tblTempTable2 Table
(
Col1 Nvarchar(100),
Col2 Nvarchar(100),
Col3 nvarchar(50)
)
Declare db_cursor CURSOR for
Select Col1 from @tblTempVTErrors
Open db_cursor
fetch NEXT FROM db_cursor into @Column1
While @@FETCH_STATUS=0
Begin
SELECT @TSQL2 = 'Select Col1,Col5,Col6 From Table2
where Col1 in ('''[email protected]+''')'
Insert @tblTempTable2 EXEC (@TSQL2) at [LinkedServer2]
FETCH NEXT FROM db_cursor INTO @Column1
End
Close db_Cursor
Deallocate db_Cursor
Select t1.Col1,t1.Col2,t1.Col3,t2.Col2,t2.Col3
from @tblTempTable1 t1
inner join @tblTempTable2 t2 on t1.Col1=t2.Col1
END TRY
BEGIN CATCH
END CATCH
可以大家分享一下關於這部分的一些例子:'這適用於1輸入,但明顯當我通過多個輸入時失敗 – TheGameiswar
我們是否理解輸入是唯一標識符? –
感謝您檢查我的問題。我從使用VBA的Excel報告中調用此存儲過程。最初,2個公開查詢是2個獨立的存儲過程,它們工作正常。現在我正試圖將輸出結合到一個報告中。我通過逗號分隔的輸入從Excel中像輸入1,輸入2,輸入3 ...希望這可以幫助 – Singh99