2017-03-23 64 views
0

我正在使用臨時表和動態查詢以及。我的要求是在臨時表中我插入一些獨特的價值。之後,從臨時表中我得到唯一的密鑰和執行內部條件。SQL Server:在動態查詢中執行Temp表

這裏是代碼

臨時表:

Create Table #TempUniqueKeyTable 
(
    ID BIGINT IDENTITY PRIMARY KEY, 
    ukey uniqueidentifier 
) 

INSERT INTO #TempUniqueKeyTable (ukey) 
    SELECT followedTo 
    FROM tblFollowers 
    WHERE FollowedBy = @uniqueKey 

INSERT INTO #TempUniqueKeyTable (ukey) 
    SELECT connectionRequestTo 
    FROM tblConnection 
    WHERE connectRequestBY = @uniqueKey 

INSERT INTO #TempUniqueKeyTable (ukey) 
    SELECT connectRequestBY 
    FROM tblConnection 
    WHERE connectionRequestTo = @uniqueKey 

動態查詢:

SET @QueryHeader = 'SELECT * from XYZ B' 
SET @MainQuery = @QueryHeader 
SET @MainQuery += ' WHERE B.uniquekey in (SELECT distinct ukey FROM #TempUniqueKeyTable WHERE ukey='''+CONVERT(NVARCHAR(MAX),@UniqueKey)+''')) ' 

EXEC (@MainQuery) 

它不是在條件工作。這部分不返回任何值

SELECT distinct ukey 
FROM #TempUniqueKeyTable 
WHERE ukey = ''' + CONVERT(NVARCHAR(MAX), @UniqueKey) + ''') 

當我運行PRINT命令顯示它像

SELECT * 
FROM XYZ B 
WHERE B.uniquekey IN (SELECT DISTINCT ukey 
         FROM #TempUniqueKeyTable 
         WHERE ukey = '1EA8658C-F978-4DC7-9ABF-E4FF253A2284') 

生成的查詢應該是這樣

SELECT * from XYZ B 
    WHERE B.uniquekey in ('A5B6BC01-5FEB-4554-90A7-4B5ADCC00D36','F75C6303-40EB-4119-A45A-D122E8118FA4') 
+0

您必須在動態聲明中聲明/創建它。只需將您的字符串構建爲單個語句即可。 – scsimon

+0

@scsimon那麼代碼是什麼,我不知道該寫什麼。我嘗試了很多東西 – Anjyr

+0

不用擔心。我在我的手機上,但有人會在一分鐘內得到答案,我確定。 – scsimon

回答

1

您有一個額外的右括號:

SET @MainQuery+= ' WHERE B.uniquekey in (SELECT distinct ukey FROM #TempUniqueKeyTable WHERE ukey='''+CONVERT(NVARCHAR(MAX),@UniqueKey)+''') '

但我想這是你可以很容易識別你自己的東西。也許我不明白這個問題?

編輯 您可以使用此方法來建立你的IN條款。在臨時表沒有數據時,應特別注意確保@MainQuery返回正確的結果(即沒有)。

declare @QueryHeader NVarchar(max); 
declare @MainQuery NVarchar(max); 


SET @QueryHeader='SELECT * from XYZ B' 

if exists (select * from #TempUniqueKeyTable) 
begin 
    SET @MainQuery = @QueryHeader; 
    declare @WhereClause nvarchar(max); 
    set @WhereClause = ' WHERE B.uniquekey in ('; 

    declare @curr uniqueidentifier; 
    select @curr = min(ukey) from #TempUniqueKeyTable; 
    while @curr is not null 
    begin 
     set @WhereClause = @WhereClause + '''' + cast(@curr as nvarchar(40)) + ''','; 
     select @curr = min(ukey) from #TempUniqueKeyTable where ukey > @curr; 
    end 

    set @WhereClause = left(@WhereClause, len(@WhereClause) - 1) + ')'; 

    set @MainQuery = @QueryHeader + @WhereClause; 
end 
else 
-- make sure nothing is returned, for example: 
begin 
    set @MainQuery = @QueryHeader + ' WHERE 1 = 0'; 
end 

EXEC (@MainQuery); 
+0

我更新了我的問題,請檢查 – Anjyr

+0

while'循環逐步構建'IN'子句,直到臨時表中沒有更多記錄爲止。 –