2017-08-12 114 views
0

這是我的第一篇文章。希望得到我的代碼一些幫助。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 
+0

可以大家分享一下關於這部分的一些例子:'這適用於1輸入,但明顯當我通過多個輸入時失敗 – TheGameiswar

+0

我們是否理解輸入是唯一標識符? –

+0

感謝您檢查我的問題。我從使用VBA的Excel報告中調用此存儲過程。最初,2個公開查詢是2個獨立的存儲過程,它們工作正常。現在我正試圖將輸出結合到一個報告中。我通過逗號分隔的輸入從Excel中像輸入1,輸入2,輸入3 ...希望這可以幫助 – Singh99

回答

1

如果我理解正確的話,當輸入一個值,說「測試」,那麼它的工作原理,因爲只選擇了一個紀錄 - 輸入是某種形式的唯一標識符。但只要您通過「測試」,「測試2」,「測試3」,它就會失敗,因爲它將多個記錄放入@ tblTempTable1中,然後SELECT @ Col1Results將失敗,因爲選擇了多個記錄?

如果是這樣,那麼你需要做這樣的事情:

創建一個功能,讓您拆分這種輸入參數。我使用:

create FUNCTION [dbo].[fnSplit](
    @sInputList VARCHAR(max) -- List of delimited items 
    , @sDelimiter VARCHAR(5) -- delimiter that separates items 
) RETURNS @List TABLE (item VARCHAR(max)) 

BEGIN 
DECLARE @sItem VARCHAR(max) 
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 
BEGIN 
SELECT 
    @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), 
    @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) 

IF LEN(@sItem) > 0 
    INSERT INTO @List SELECT @sItem 
END 

IF LEN(@sInputList) > 0 
INSERT INTO @List SELECT @sInputList -- Put the last item in 
RETURN 
END 

現在你可以擺脫所有的動態SQL和改變的過程簡稱爲:

ALTER PROCEDURE 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) 

    ) 

    insert INTO @tblTempTable1 
    Select Col1,Col2,Col3,Col4 From Table1 
    where Input in (SELECT Item FROM dbo.fnSplit(@Input, ',')) 

    Declare @tblTempTable2 Table 
    (
    Col1 Nvarchar(100), 
    Col2 Nvarchar(100), 
    Col3 nvarchar(50) 
    ) 

    insert INTO @tblTempTable2 
    Select Col1,Col5,Col6 From Table2 
    where Input in (SELECT Col1 FROM @tblTempTable1) 

    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 
+0

謝謝喬納森。我會嘗試你的建議,看看那是怎麼回事。欣賞快速反應。 – Singh99

+0

沒問題。如果您需要任何幫助,請隨時聯繫我。 –

+0

您可以編輯您的查詢以包括使用鏈接服務器時的外觀。我嘗試了幾次,但可能會使用錯誤的語法。我使用的查詢不是SQL服務器,而是使用鏈接服務器的外部系統,正如我在上面的代碼中使用的。 – Singh99

相關問題