这是我在存储过程中的示例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'' '
请帮帮我
答案 0 :(得分:2)
您在@query
的作业中使用了@querySET @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和@Stageselect @Source = Source, @Stage = Stage from #Temp
答案 1 :(得分:1)
执行动态查询时,@ source不在范围内。 AKA的动态查询范围与存储过程范围不同。
您必须使用临时表将数据传回和动态查询。
虽然,我不知道为什么还需要@Source:你没有使用它
这个答案受到关于SQL注入等的常见警告的影响