以非常特定的方式执行存储在变量中的查询

时间:2010-05-21 08:21:07

标签: sql sql-server-2005

问候,我有一个问题如下: 我声明了一个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 请阅读我写的问题:

  

但是,上述语句不起作用,因为它返回一个错误,告诉我不能以这种方式执行存储过程。我做了一个解决方法,这就是我写的:

3 个答案:

答案 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,则可以使用公用表表达式而不是创建临时表。

Common Table Expressions

你的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);