Ad Hoc查询将结果分配给局部变量

时间:2009-10-05 14:41:46

标签: sql sql-server-2005 tsql

嗨我有可能以某种方式这样做吗?当我运行语句时我得到一个异常,@ Price_Plan不会被延迟,所以很明显,adhoc查询没有访问@Price_Plan的范围。是否有解决方法或更好的方法来查询每次执行此查询时名称更改的表。

DECLARE @Price_Plan varchar(3), @MNP_Network varchar(3), @GSM_Code varchar(3), @GEO_Dist varchar(6),
        @Call_ProdNo varchar(7), @Call_Time datetime, @CallId int, @dtl_call_dur int,
        @Volume varchar(10), @Call_Cost int

--Assume CallId has a value

SET @Sql =
    'SELECT
        @Price_Plan = Price_Plan, @MNP_Network = MNP_Network, @GSM_Code = GSM_Code, @GEO_Dist = GEO_Dist,
        @Call_ProdNo = Call_ProdNo, @Call_Time = Call_Time, @dtl_call_dur = dtl_call_dur,
        @Volume = Volume
     FROM ' + @TableName + ' 
     WHERE CallId = ' + CONVERT(varchar(10),@CallId) + ''
    PRINT  @SQL
    EXEC (@Sql)

1 个答案:

答案 0 :(得分:3)

你确定这是这个错误吗?我测试了该查询,它返回了两个错误:

- Not declared @TableName
- Not declared @Sql

当您声明这些变量时,它应该可以正常工作。

但更好的方法是使用sp_executesql

一个例子:

EXEC sp_executesql 
      N'SELECT * FROM AdventureWorks.HumanResources.Employee 
      WHERE ManagerID = @level',
      N'@level tinyint',
      @level = 109;

第一个参数是带参数的查询,第二个参数 - 带有逗号分隔的类型的参数名称,然后是参数的实际值。

编辑:

以下是使用 OUTPUT 参数的另一个示例:

DECLARE @retCnt INT

EXEC sp_executesql 
    N'SELECT @retCnt = COUNT(*) FROM sys.tables',
    N'@retCnt INT OUTPUT',
    @retCnt = @retCnt OUTPUT

SELECT @retCnt

SELECT在我的电脑上返回5.