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
除了上面提到的解决方案之外,还有其他更好的选择吗?
答案 0 :(得分:16)
嗯,我不确定你真的需要在这里使用动态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;
答案 1 :(得分:3)
你可以试试这个
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
答案 2 :(得分:-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