2012-01-06 259 views
0

我有一个存储过程,为了这个问题的目的我大大缩小了,但实质上我需要帮助的是这个问题。SQL Server存储过程参数输出

如果表xyz中的一行已更新,我需要将ID附加到对方并输出回调用应用程序。更新按预期工作,问题在于我构建输出@IPV_ID_Found的方式(请参阅代码底部的注释部分)。

@IPV_Status varchar (50), 
@IPV_ID_Found varchar(500) = 'A' OUTPUT 

IF (@IPV_Status ='closed') 
BEGIN 
UPDATE TEST_TBL 
SET 
    Status = 'xyz',   
WHERE     
    ID  = @IPV_ID 

    -- this works for one ID 
    SELECT @IPV_ID_Found = (CAST(@IPV_ID AS VARCHAR(500)))  

    -- this does not work for multiple IDs 
    SELECT @IPV_ID_Found = @IPV_ID_Found + (CAST(@IPV_ID AS VARCHAR(500))) + ',' 

    -- neither does this 
    SET @IPV_ID_Found = @IPV_ID_Found + (CAST(@IPV_ID AS VARCHAR(500))) + ',' 

    SELECT @IPV_ID_Found     
END 
+0

对不起格式化,我把代码放在代码块中,但它没有占用...... – RonanC 2012-01-06 10:45:01

+0

嗯......你正在用'ID = @ IPV_ID'更新你的表格 - 这怎么能导致多个ID是回报?你想报告什么ID? – 2012-01-06 10:51:52

+1

不存在多个ID:如果您有'UPDATE ... ID = @ IPV_ID','='表示一行。所以给更好的代码,示例数据 – gbn 2012-01-06 10:59:49

回答

1

看到的变化:

-- this does not work for multiple IDs 
    SELECT @IPV_ID_Found = @IPV_ID_Found + ',' + (CAST(@IPV_ID AS VARCHAR(500))) 

那么你将得到的值的连续清单,像1,2,3,4,5

如果需要返回记录,那么你需要不输出参数,请改用表格变量:

declare @IPV_ID_Found table(Item varchar(500)) 

IF (@IPV_Status ='closed') 
BEGIN 
UPDATE TEST_TBL 
SET 
    Status = 'xyz',   
WHERE     
    ID  = @IPV_ID 

    -- this works for one ID 
    insert @IPV_ID_Found 
    VALUES (CAST(@IPV_ID AS VARCHAR(500)))  

    -- this does not work for multiple IDs 
    INSERT @IPV_ID_Found 
    VALUES (CAST(@IPV_ID AS VARCHAR(500))) 

    SELECT Item FROM @IPV_ID_Found     
END 
+0

好人!我去了记录集,忘记了OUTPUT参数的欢呼声。 – RonanC 2012-01-06 11:29:41

+0

@RananC最好的感谢 - 接受答案8-) – 2012-01-06 11:36:03