2017-03-23 12 views
0

私はテンポラリテーブルとダイナミッククエリの両方で作業しています。私の要件は、私はいくつかのユニークな値を挿入しています一時テーブルです。その後、一時テーブルから私はユニークなキーを取得し、どこに条件を実装します。これは、条件でを働いていないSQL Server:動的クエリ内でテンポラリテーブルを実行

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) 

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 

ダイナミッククエリ:ここ

はコード

一時テーブルです。この部分は、あなたが余分な右括弧を持って、私はそれが

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

のような生成されたクエリを表示PRINTコマンドを実行すると、それは

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

動的ステートメント内で宣言/作成する必要があります。文字列を1つのステートメントにまとめるだけです。 – scsimon

+0

@scsimonどのようなコードになりますか、私は何を書くのか考えていません。私はたくさんのことを試しました – Anjyr

+0

心配はありません。私は携帯電話に乗っていますが、誰かが私が確信している分に答えがあります。 – scsimon

答えて

1

ようにする必要があり

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

任意の値を返しません。

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

しかし、これはあなたが簡単に自分自身を特定できたものだと思います。おそらく私はその質問を理解していませんでしたか?

EDIT この方法を使用して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句を作成します。 –

関連する問題