代码之家  ›  专栏  ›  技术社区  ›  Neil

即席查询将结果分配给局部变量

  •  0
  • Neil  · 技术社区  · 15 年前

    嗨,我能做这个吗?当我运行语句时,我得到一个异常,@price_plan没有延迟,因此显然,临时查询没有访问@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 回复  |  直到 15 年前
        1
  •  3
  •   Lukasz Lysik    15 年前

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

    - 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;
    

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

    编辑:

    下面是另一个使用 输出 参数:

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

    在“我的电脑”上选择“返回5”。