SQL 服务器:在动态查询中执行 Temp table
SQL Server: execute Temp table inside dynamic query
我正在使用临时 table 和动态查询。我的要求是临时 table 我正在插入一些独特的价值。在那之后,从 temp table 我得到唯一的密钥并在 where 条件内实现。
这是代码
温度table:
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')
你多了一个右括号:
SET @MainQuery+= ' WHERE B.uniquekey in (SELECT distinct ukey FROM #TempUniqueKeyTable WHERE ukey='''+CONVERT(NVARCHAR(MAX),@UniqueKey)+''') '
但我想这是您自己可以轻松识别的内容。可能是我没看懂问题?
编辑
您可以使用这种方法来构建 IN
子句。应格外小心,以确保 @MainQuery
returns 在 temp table 没有数据时得到正确的结果(即什么都没有)。
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);
我正在使用临时 table 和动态查询。我的要求是临时 table 我正在插入一些独特的价值。在那之后,从 temp table 我得到唯一的密钥并在 where 条件内实现。
这是代码
温度table:
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')
你多了一个右括号:
SET @MainQuery+= ' WHERE B.uniquekey in (SELECT distinct ukey FROM #TempUniqueKeyTable WHERE ukey='''+CONVERT(NVARCHAR(MAX),@UniqueKey)+''') '
但我想这是您自己可以轻松识别的内容。可能是我没看懂问题?
编辑
您可以使用这种方法来构建 IN
子句。应格外小心,以确保 @MainQuery
returns 在 temp table 没有数据时得到正确的结果(即什么都没有)。
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);