问候,我有一个问题如下: 我声明了一个SQL变量:
DECLARE @myVariable nvarchar(max)
第三方库为此变量设置值。为简化起见,假设值如下:
SET @myVariable = 'Select ROWGUID from MySampleTable'
现在,我想执行以下查询:
SELECT ROWGUID FROM myTable WHERE ROWGUID in (exec sp_executesql @myVariable )
但是,上述语句不起作用,因为它返回一个错误,告诉我不能以这种方式执行存储过程。我做了一个解决方法,这就是我写的:
create table #temptable (ID uniqueidentifier null)
if(@myVariable is not null AND @myVariable !='') insert into #temptable exec sp_executesql @myVariable
SELECT ROWGUID FROM myTable WHERE ROWGUID in (select * from #temptable)
DROP TABLE #temptable
这很好用。但是我不认为使用临时表是个好主意。如何在不创建临时表的情况下实现相同的结果?
我正在使用SQL SERVER 2005
UPDATE 请阅读我写的问题:
但是,上述语句不起作用,因为它返回一个错误,告诉我不能以这种方式执行存储过程。我做了一个解决方法,这就是我写的:
答案 0 :(得分:1)
也许您可以使用User Defined Functions而不是存储过程?
答案 1 :(得分:1)
保持简单
-- Your original declaration
declare @myVariable nvarchar(max)
set @myVariable = 'Select ROWGUID from MySampleTable'
-- Additional code
declare @myQuery nvarchar(max) = 'SELECT ROWGUID FROM myTable WHERE ROWGUID in (' + @myVariable + ')'
exec (@myQuery)
答案 2 :(得分:0)
如果您使用的是SQL Server 2005或2008,则可以使用公用表表达式而不是创建临时表。
你的CTE应该是这样的:
WITH Records (ROWGUID) AS (
SELECT ROWGUID
FROM MySimpleTable
)
然后你可以简单地使用:
SELECT ROWGUID
FROM myTable
WHERE ROWGUID IN (SELECT ROWGUID
FROM Records);
这可能意味着您可以放弃变量。
修改强>
好的,所以CTE是不可能的。但是,如何使用Table变量而不是创建临时表。
DECLARE @myVar nvarchar(max);
DECLARE @table TABLE
(
ROWGUID uniqueidentifier
)
SET @myVar = 'SELECT ROWGUID FROM MySampleTable';
INSERT INTO @table
EXEC sp_executesql @myVar;
SELECT ClientID
FROM myTable
WHERE EXISTS (SELECT ClientID FROM @table);