在动态查询中使用过程中的变量

时间:2012-02-22 12:51:43

标签: sql sql-server-2008 tsql

DECLARE @a NVARCHAR(10) ,
    @b NVARCHAR(100)

SET @a = 'value'
SET @b = ' PRINT @a '

EXEC sp_executesql @b

我想结果:'价值'
但我收到错误必须声明标量变量“@a”

我需要从SQL中记录名为SP的参数

我需要这个,因为在SP中我创建了来自INFORMATION_SCHEMA.PARAMETERS的dinamic查询

我的程序:

ALTER PROCEDURE marianTest
@a INT,
@b NVARCHAR(121)
AS
BEGIN
DECLARE @query NVARCHAR(max)
SET @query = dbo.ufn_admin_Ex(cast(OBJECT_NAME(@@PROCID) AS nvarchar(100)))
EXECUTE sp_executesql  @query

其中@query是这样的:

declare @callSP nvarchar(max) = 
'DECLARE @a int = ' + CASE  WHEN @a IS NULL THEN 'NULL' ELSE    convert(nvarchar(15),@a)     END + CHAR(13)
+', @b nvarchar(121) = ' + CASE  WHEN @b IS NULL THEN 'NULL' ELSE + '''' + @b+   ''''     END + CHAR(13)

EXECUTE [dbo].[usp_admin_traceError] @callSp

感谢
玛丽安

4 个答案:

答案 0 :(得分:3)

我相信这就是你要找的东西:

DECLARE @a NVARCHAR(10) , @b NVARCHAR(100)  
SET @a = 'value' 
SET @b = ' PRINT @a '  
EXEC sp_executesql @b, N'@a nvarchar(10)', @a

结果:

value

答案 1 :(得分:2)

除非你以某种方式介绍它们,否则

@b无法神奇地看到@a

在exec之前尝试:

SET @b = 'PRINT ''' + @a + ''';

或者您可以这样使用sp_executesql

DECLARE @b NVARCHAR(100);

SET @b = N'PRINT @a';

EXEC sp_executesql @b, N'@a NVARCHAR(10)', @a;

答案 2 :(得分:2)

您没有在

上指定参数
exec sp_executesql

请参阅http://msdn.microsoft.com/en-us/library/ms188001.aspx

答案 3 :(得分:1)

如果要在动态SQL中使用参数/变量,则应使用带参数的sp_executesql。有关动态SQL的精彩介绍,请参阅The Curse and Blessings of Dynamic SQL