Sql server SQL Server:在动态查询中执行临时表

Sql server SQL Server:在动态查询中执行临时表,sql-server,dynamicquery,Sql Server,Dynamicquery,我正在使用临时表和动态查询以及。我的要求在临时表中,我正在插入一些唯一的值。在这之后,我从temp表中得到惟一的键,并在where条件中实现 这是代码 临时表: Create Table #TempUniqueKeyTable ( ID BIGINT IDENTITY PRIMARY KEY, ukey uniqueidentifier ) INSERT INTO #TempUniqueKeyTable (ukey) SELECT followedTo

我正在使用临时表和动态查询以及。我的要求在临时表中,我正在插入一些唯一的值。在这之后,我从temp表中得到惟一的键,并在where条件中实现

这是代码

临时表:

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')

您有一个额外的右括号:

设置@MainQuery+='其中B.uniquekey在选择不同于TempUniqueKeyTable的ukey时,其中ukey='+CONVERTNVARCHARMAX,@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);

您必须在动态语句中声明/创建它。只需将字符串构建到一个语句中即可。@scsimon那么代码将是什么,我不知道该写什么。我试了很多,不用担心。我在手机上,但我肯定有人会在一分钟内得到答案。我认为可以从动态查询中访问临时表。因此,我想问题在于语法中有一个额外的括号-虽然没有一些示例数据(包括XYZ),但无法确定。编辑后:将打印的命令复制粘贴到查询窗口并执行时会发生什么?while循环会逐步生成IN子句,直到temp表中没有更多记录为止。