3
declare @var varchar(max),@course varchar(max)
set @var='ABC'
set @Query=''
set @Query='  
select @course=PARAM from TABLE where PARAM='''+@var+''''
print @Query
exec (@Query)

由于上述查询返回错误为

必须声明标量变量“@course”

这里的查询是我现在正在遵循的使查询成功的替代方法。

declare @var varchar(max),@course varchar(max),@Query varchar(max)
Create table #temp(param1 varchar(max))
set @var='ABC'
set @Query=''
set @Query='insert #temp(param1)
select PARAM from TABLE where PARAM='''+@var+''''
print @Query
exec (@Query)
select @course=param1 from #temp
drop table #temp

除了我上面提到的解决方案之外,还有其他更好的选择吗?

4

3 回答 3

24

好吧,我不确定您是否真的需要在这里使用动态 SQL,但我怀疑您为我们简化了一个更复杂的示例。(提示:您不需要这样做。)

如果这就是你正在做的一切,那么为什么不只是:

SELECT @course = PARAM FROM dbo.Table WHERE PARAM = @var;

(这甚至没有意义——根据定义@course@var要么相等,要么行不存在。)

如果您的 SQL 实际上更复杂,那么您需要停止使用EXEC()并拥抱sp_executesql. 这允许的一件事是使用强类型参数(包括 )具有更大的灵活性OUTPUT。这是一个简单的例子:

DECLARE @table_name SYSNAME;

DECLARE @var VARCHAR(MAX), @course VARCHAR(MAX), @sql NVARCHAR(MAX);

SELECT @var = 'ABC', @table_name = N'TABLE_2012';

SET @sql = N'SELECT @course = PARAM FROM ' + @table_name 
  + ' WHERE PARAM = @var;'

EXEC sp_executesql @sql,
  N'@var VARCHAR(MAX),@course VARCHAR(MAX) OUTPUT',
  @var, @course OUTPUT;

PRINT @course;
于 2013-04-03T11:45:46.437 回答
4

你可以试试这个

declare @var varchar(max),@course varchar(max),@paramdef varchar(100)

set @var='ABC'
set @Query=''
set @Query=N'  
select @result=PARAM from TABLE where PARAM='''+@var+''''
set @paramdef=N'@result varhcar(20) OUTPUT'

execute sp_executesql @Query,@paramdef,@result=@course Output

SELECT @course
于 2013-04-03T11:54:38.850 回答
-1

您可以在动态查询本身上声明变量

declare @var varchar(max)
set @var='ABC'
set @Query=''
set @Query='  
DECLARE @course varchar(max)
select @course=PARAM from TABLE where PARAM='''+@var+'''

SELECT @course
'
print @Query
exec (@Query)

--Reusing variable
    CREATE TABLE #temp
    (
        VALUE VARCHAR(MAX)
    )
    INSERT INTO #temp
    EXEC (@Query)
    SELECT * FROM #temp
于 2013-04-03T11:45:31.940 回答