存储过程中的错误

时间:2011-01-28 10:30:56

标签: sql-server stored-procedures

这是我在存储过程中的示例sql查询,它工作正常。  但我想传递特许权的价值,这里是'TH-003853199'和表名动态..

SELECT @source = source,@stage = stage  
       FROM BABMwork8_22_1210_0012.dbo.concessions   
       WHERE concession = 'TH-003853199' 

并且存储过程是, 在查询中编辑

    ALTER PROCEDURE status_in_other_db
                    @other_db VARCHAR(50),
                    @concession VARCHAR(30)
        AS
    BEGIN
            SET NOCOUNT ON

        DECLARE @query VARCHAR(8000),
                @other_db_con VARCHAR(80),
                @source VARCHAR(10),
                @stage VARCHAR(50),
                @status_in_other_db  VARCHAR(50)

        SET @other_db_con = @other_db + '.dbo.concessions' ;
        SET @query = ('SELECT @source = source,@stage = stage FROM ' + @other_db_con + ' WHERE concession = '''+@concession+''' ')
            EXEC(@query)
        IF(@source!='PARK')
    BEGIN
        SET @status_in_other_db = 
        CASE @stage
            WHEN 'Open' THEN 'Open'
            WHEN 'Archive' THEN 'Archived'
            WHEN 'R4invoicing' THEN 'Ready for invoicing'
            WHEN 'N2Bdetermined' THEN'SplitBA'
            WHEN 'Invoiced' THEN 'Invoiced'
            WHEN 'Exclusion' THEN'Exclusion'
        END
    END
ELSE IF(@source='PARK')
    SET @status_in_other_db = 'PARK'
ELSE IF(@source='')
    SET @status_in_other_db = 'Not present'

SELECT @status_in_other_db as status_in_other_db
END

这里我希望返回@status_in_other_db的值,这应该是我的输出参数。

执行此存储过程时,我收到错误: - 必须声明@source标量变量。

虽然我已经修改了,但现在我没有收到任何错误信息,也没有收到结果......

SET @query  = 'DECLARE @source VARCHAR(10),  @stage VARCHAR(50) '

SET @query  = @query  + 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' '

请帮帮我

2 个答案:

答案 0 :(得分:2)

您在@query

的作业中使用了@query
SET @query  = @query  + 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' '

由于@query未初始化,因此@query为null,并且在将select语句添加到@query后将为null。改为改为。

SET @query = 'SELECT @source = source,@stage = stage 
    FROM BABMwork8_22_1210_0012.dbo.concessions 
    WHERE concession = ''TH-003853199'' '

当您尝试时,您将收到错误消息

  

必须声明标量变量   “@Source”

您不能在动态SQL中使用变量,因为它们不在EXEC的范围内。 正如gbn所说,你需要使用临时表。使动态SQL插入到先前在存储过程中创建的临时表。

create table #Temp (Source varchar(10), Stage varchar(50))

执行动态SQL后,您可以从#Temp

分配@Source和@Stage
select @Source = Source, @Stage = Stage from #Temp

答案 1 :(得分:1)

执行动态查询时,@ source不在范围内。 AKA的动态查询范围与存储过程范围不同。

您必须使用临时表将数据传回和动态查询。

虽然,我不知道为什么还需要@Source:你没有使用它

这个答案受到关于SQL注入等的常见警告的影响