EXEC命令后的环境不同

时间:2013-05-29 14:10:01

标签: sql tsql

我正在准备像这样的SQL批处理脚本

DECLARE @DateRateizzazionePerSA nvarchar(2000)
DECLARE @query nvarchar(3000)

SET @query = 'SELECT @DateRateizzazionePerSA = COALESCE(@DateRateizzazionePerSA+ '', '', '''') + a.RataStr FROM (SELECT DISTINCT RataStr =' 
            +' . . . '

EXEC(@query)

正如您所看到的,我已声明变量DateRateizzazionePerSA,但此步骤不可见EXEC命令,因为我收到错误:

  

必须声明标量变量“@DateRateizzazionePerSA”。

我该怎么办?似乎EXEC环境不了解外部环境。 Isnt'it?

2 个答案:

答案 0 :(得分:1)

sp_executeSQL可用于在范围之间共享数据;

DECLARE @DateRateizzazionePerSA nvarchar(2000) = 'Foo'
DECLARE @query nvarchar(3000)

SET @query = 'SELECT @DateRateizzazionePerSA += ''Bar''' 

EXEC sp_executeSQL @query,   
    N'@DateRateizzazionePerSA nvarchar(2000) OUTPUT',
    @DateRateizzazionePerSA OUTPUT

SELECT @DateRateizzazionePerSA

 == 'FooBar'

答案 1 :(得分:0)

您需要从文本字符串中转义以将变量传递给查询。 'SELECT'+ @ DateRateizzazionePerSA +

DECLARE @DateRateizzazionePerSA nvarchar(2000)
DECLARE @query nvarchar(3000)

SET @query = 'SELECT '+@DateRateizzazionePerSA+ '= COALESCE('+@DateRateizzazionePerSA+ '+ '', '', '''') + a.RataStr FROM (SELECT DISTINCT RataStr =' 
            +' . . . '

EXEC(@query)

实际上,变量没有被评估,而是要执行的字符串似乎只有一个新的变量。

我喜欢帮助解决动态sql问题的一件事是将EXEC(@query)更改为PRINT(@query),这样可以查看查询变量的运行方式。