用static执行混合sql:dynamic

时间:2017-11-04 18:16:57

标签: sql-server stored-procedures

我尝试使用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。

我怎样才能让它发挥作用?提前谢谢。

1 个答案:

答案 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