2015-03-31 70 views
0

你好,我有一个agentjob检查什么存储过程调用。并将XMLData从表中发送到存储过程。此从存储过程返回行数T-SQL

ELSE IF(@Entity = 'Payment') 
BEGIN 
EXEC dbo.Payment @output output, @XmlDocument 
END 

的的XmlDocument的为例工作正确,但我想从存储过程检查的行数。但是,正如你所看到的,它不是以这种方式工作的,它说“过程指定了太多的参数”。 我需要帮助从存储过程中获取此变量。提前致谢!

create procedure dbo.Payment (@output int output, @XmlDocument XML) 
as 
begin 
Create Table #TempTable(IntComp VARCHAR(10), PaymentCode VARCHAR(10), PaymentDays int, [Text] VARCHAR(30), FreeMonth tinyint, PaymentCode2 VARCHAR(10)) 
Declare @Identity as INT 
SET @Identity = (SELECT max ((etPayment.ID) + 1) from dbo.etPayment) 
IF @Identity IS NULL 
    SET @Identity = 1 

BEGIN TRY 
WITH XMLNAMESPACES('http://bla.bla.Payment' AS ns0) 
INSERT INTO #TempTable (IntComp, PaymentCode, PaymentDays, [Text], FreeMonth, PaymentCode2)  
      SELECT 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/IntComp[1]', 'VARCHAR(10)') IntComp, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/PaymentCode[1]', 'VARCHAR(10)') PaymentCode, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/PaymentDays[1]', 'int') PaymentDays, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/Text[1]', 'VARCHAR(30)') [Text], 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/FreeMonth[1]', 'tinyint') FreeMonth, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/PaymentCode2[1]', 'VARCHAR(10)') PaymentCode2 


MERGE dbo.etPayment AS Target 
USING 
(

SELECT 
IntComp, 
PaymentCode, 
PaymentDays, 
[Text], 
FreeMonth, 
PaymentCode2 
FROM #TempTable) AS Source 
ON (Target.IntComp = Source.IntComp and Target.PaymentCode = Source.PaymentCode) 
WHEN MATCHED 
THEN UPDATE SET 
Target.PaymentDays = Source.PaymentDays, 
Target.[Text] = Source.[Text], 
Target.FreeMonth = Source.FreeMonth, 
Target.PaymentCode2 = Source.PaymentCode2 

WHEN NOT MATCHED BY TARGET 
THEN INSERT(
ID, 
IntComp, 
PaymentCode, 
PaymentDays, 
[Text], 
FreeMonth, 
PaymentCode2 
) 

VALUES(
@Identity, 
Source.IntComp, 
Source.Paymentcode, 
Source.PaymentDays, 
Source.Text, 
Source.FreeMonth, 
Source.PaymentCode2 
); 
END TRY 
BEGIN CATCH 
SET @output = @@ROWCOUNT 
SELECT @output 
END CATCH 
DROP TABLE #TempTable; 
SET @output = @@ROWCOUNT 
SELECT @output 


end 
+0

什么是你传递XML? – ughai 2015-03-31 11:15:58

回答

1

我需要从存储过程获得这个变量回来帮忙。

你只需要在MERGE语句后移动SET @output = @@ROWCOUNT并删除其他的语句设置变量@output。像这样的东西。

http://sqlfiddle.com/#!6/99e0b/5

create procedure dbo.Payment (@output int output, @XmlDocument XML) 
as 
begin 
Create Table #TempTable(IntComp VARCHAR(10), PaymentCode VARCHAR(10), PaymentDays int, [Text] VARCHAR(30), FreeMonth tinyint, PaymentCode2 VARCHAR(10)) 
Declare @Identity as INT 
SET @Identity = (SELECT max ((etPayment.ID) + 1) from dbo.etPayment) 
IF @Identity IS NULL 
    SET @Identity = 1 

BEGIN TRY 
WITH XMLNAMESPACES('http://bla.bla.Payment' AS ns0) 
INSERT INTO #TempTable (IntComp, PaymentCode, PaymentDays, [Text], FreeMonth, PaymentCode2)  
      SELECT 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/IntComp[1]', 'VARCHAR(10)') IntComp, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/PaymentCode[1]', 'VARCHAR(10)') PaymentCode, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/PaymentDays[1]', 'int') PaymentDays, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/Text[1]', 'VARCHAR(30)') [Text], 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/FreeMonth[1]', 'tinyint') FreeMonth, 
        @xmldocument.value('/ns0:Payment[1]/Payment[1]/PaymentCode2[1]', 'VARCHAR(10)') PaymentCode2; 


MERGE dbo.etPayment AS Target 
USING 
(

SELECT 
IntComp, 
PaymentCode, 
PaymentDays, 
[Text], 
FreeMonth, 
PaymentCode2 
FROM #TempTable) AS Source 
ON (Target.IntComp = Source.IntComp and Target.PaymentCode = Source.PaymentCode) 
WHEN MATCHED 
THEN UPDATE SET 
Target.PaymentDays = Source.PaymentDays, 
Target.[Text] = Source.[Text], 
Target.FreeMonth = Source.FreeMonth, 
Target.PaymentCode2 = Source.PaymentCode2 

WHEN NOT MATCHED BY TARGET 
THEN INSERT(
ID, 
IntComp, 
PaymentCode, 
PaymentDays, 
[Text], 
FreeMonth, 
PaymentCode2 
) 

VALUES(
@Identity, 
Source.IntComp, 
Source.Paymentcode, 
Source.PaymentDays, 
Source.Text, 
Source.FreeMonth, 
Source.PaymentCode2 
); 
SET @output = @@ROWCOUNT; 
END TRY 
BEGIN CATCH 
SET @output = 0; 
SELECT @output 
END CATCH 
DROP TABLE #TempTable; 
end 

可以调用的程序是这样,并获得@output

DECLARE @output int,@XmlDocument XML= '<?xml version="1.0" encoding="UTF-8"?> 
<ns0:Payment xmlns:ns0="http://bla.bla.Payment"> 
    <Payment> 
     <IntComp>asasc</IntComp> 
     <PaymentCode>P</PaymentCode> 
     <PaymentDays>20</PaymentDays> 
     <FreeMonth>1</FreeMonth> 
     <PaymentCode2>P</PaymentCode2> 
     <Text>TEXT</Text> 
     </Payment> 
    </ns0:Payment>' 

EXEC dbo.Payment @output output,@XmlDocument 

SELECT @output as output,* FROM etPayment;