我尝试使用static执行混合sql:dynamic。我有一个stored proc
,包含许多查询和select-into-temp-table
个结构。它的一部分需要是动态的。以下是我尝试做的一些摘录片段:
@DynamicPrefix = '0001' -- this is passed in by caller
@EngineCd = '070123456' -- this is passed in by caller
DECLARE @DynamicSQL VARCHAR(1000)
DECLARE @EngineKey INT
SET @DynamicSQL = 'set @EngineKey = (select optionnumber from lookup_' + @DynamicPrefix + '_option_001
where salescode = ' + @EngineCd + ')'
EXEC (@DynamicSQL)
然后再往下走:
Select MyCol
into #Eng
from myTable
where EngineKey = @EngineKey
在上面的代码块之前,之间和之后都有很多静态sql。
我烦扰动态sql的全部原因是因为我不知道某些表名,直到运行时。所以@DynamicPrefix
使我能够在执行时构造正确的表名。
我可以创建没有错误的proc,但是当我运行它时,我得到错误必须声明标量变量" @ EngineKey" 。我很清楚,因为@EngineKey位于动态sql中,所以它在静态sql中是不可见的。
我怀疑我需要使用exec sp_executesql
,但我无法弄清楚用法,所以我刚刚开始使用EXEC。
我怎样才能让它发挥作用?提前谢谢。
答案 0 :(得分:2)
这应该做的工作:
@DynamicPrefix = '0001'; -- this is passed in by caller
@EngineCd = '070123456'; -- this is passed in by caller
DECLARE @EngineKey INT;
DECLARE @SQL NVARCHAR (MAX);
SET @SQL =N'set @EngineKey = (select optionnumber from lookup_'+
@DynamicPrefix +
'_option_001 where salescode = '+
@EngineCd +')';
EXECUTE sp_executesql
@SQL,
N'@EngineKey INT OUTPUT, @EngineCd VARCHAR(10)',
@EngineKey OUTPUT, @EngineCd;
您必须使用OUTPUT
关键字指定输出参数,并设置变量及其数据类型,如代码所示。
如果您不使用OUTPUT
关键字,则您的变量将始终返回NULL
。
文档中提供了示例,请参阅 sp_executesql 。