繁体   English   中英

从存储过程T-SQL返回行数

Return rowcount from stored procedure T-SQL

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

您好,我得到了一个agentjob检查要调用的存储过程。 并将XMLData从表发送到存储过程。 一个例子

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
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;
1 T-SQL选择存储过程返回的值

我正在当前的存储过程中调用存储过程,它返回3条SELECT语句。 我只需要第一个SELECT 。 我该如何实现? 我是T-SQL的新手,在C#中,我只会获取这些变量,但SQL不能那样工作。 是否有可能获得它返回的值? ...

2 如何使用T-SQL从存储过程返回xml

我有一个存储过程,可以调用该过程在c#应用程序中返回数据。 我的问题是在此存储过程中有3个SELECT语句。 我需要从列中获取所有值。 从昨天的帖子中,我得出结论认为xml是行之有效的方法,这样我就可以得到我的结果。 我唯一的问题是,在我发现他只是声明@xml xml的示例中 ,我不确定 ...

3 如何从T-SQL存储过程返回表

SQL新手在这里,我有一段时间找到一个简单的代码示例来回答我认为是一个简单的问题。 我需要编写一个按顺序执行三项操作的存储过程:1)从一个表中选择行2)使用#1中结果表中的值更新另一个表中的行3)从#1返回结果表。 我找不到的是关于如何从存储过程返回这样的值的任何示例。 此外,如何 ...

5 从T-SQL存储过程返回布尔值

从T-SQL存储过程中返回布尔值(true / false)的最有效方法是什么? 我想让它做一个查询并返回它是否成功。 我是通过ASP打电话的。 让我对我正在做的事情稍微具体一点。 如果表中存在记录(表示文档已经保留且无法签出),我想在前端通知用户。 我将通过在T-SQL中检查 ...

7 从存储过程执行 T-SQL

我正在尝试在存储过程中构建 SQL 并使用 现在我定义了一个本地表并尝试将其传递给需要传递的 以下发生在我的存储过程中,我想要做的是返回EXEC sp_executesql产生的输出: 上面是说我不能用@OutPutTable传入OUTPUT 帮助!!! ...

9 T-SQL存储过程的构造

我正在尝试开发T-SQL存储过程并在其中执行一些逻辑和计算,但是由于某种原因而出现语法错误。 我将重点介绍一些不确定的地方,这些地方我不确定该怎么做。 您能否通过T-SQL语句验证并在这里指出我做错了什么。 谢谢! ...

10 T-SQL:执行存储过程

我有一个程序,它应该将数据保存到临时表中,最后删除旧记录并将新记录插入实际表中。 程序结束如下: 如果我选择所有过程直到begin try并 f5(执行它)它不会出错,并且我会在@NewTempTable上获得预期的数据; 但是当保存程序并尝试执行它时,我收到以下错误 虽然@NewTemp ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM