C# SQL Server multiple EXEC存储过程和带XML的C

C# SQL Server multiple EXEC存储过程和带XML的C,c#,sql-server,C#,Sql Server,我有几个存储过程,我正试图从另一个存储过程调用这些存储过程,如下所示: SET NOCOUNT ON; DECLARE @x1 XML; DECLARE @x2 XML; DECLARE @x3 XML; EXEC p1 0, 2, @x1 OUTPUT EXEC p2 0, 0, @x2 OUTPUT EXEC p3 1, @x3 OUTPUT DECLARE @x XML; SET @x = (SELECT @x1, @x2, @x3) FROM XML PATH('root')

我有几个存储过程,我正试图从另一个存储过程调用这些存储过程,如下所示:

SET NOCOUNT ON;

DECLARE @x1 XML;
DECLARE @x2 XML;
DECLARE @x3 XML;

EXEC p1 0, 2, @x1 OUTPUT
EXEC p2 0, 0, @x2 OUTPUT
EXEC p3 1, @x3 OUTPUT

DECLARE @x XML;

SET @x = (SELECT @x1, @x2, @x3) FROM XML PATH('root')
当我在ManagementStudio中执行该过程时,它会在结果窗口中返回4个输出@分别为x1、@x2、@x3和@x

但是当尝试在.NET C xmlReader=cmd.ExecuteXmlReader;中读取此输出时;,它只从@x1读取第一个xml

我不知道如何限制存储过程只返回@x的输出。或者我还需要别的什么

任何帮助都将不胜感激

编辑:

以下是第一个步骤:

@VersionID AS INT,
@xml AS XML = NULL OUTPUT

SET NOCOUNT ON;

SET @xml = (
SELECT
    COALESCE(VersionID, 0) AS VersionID,
    COALESCE(VersionName, '') AS VersionName
FROM
    Versions v
WHERE
    v.VersionID = @VersionID
FOR XML PATH ('Version')
);

SELECT @xml;
其余部分在不同的表中看起来完全相同

SELECT@xml;在存储过程结束时,将作为多个结果集中的第一个结果集返回。在通过输出参数返回值时,应删除该选择

如果选择@xml;如果此过程的其他调用者需要,则可以为@SelectOutput BIT=1添加另一个输入参数,并在末尾将SELECT环绕新输入参数的测试,例如:

IF (@SelectOutput = 1)
BEGIN
    SELECT @xml;
END
然后在问题顶部所示的外部过程中,为新的输入参数传递一个0。不需要更新proc的其他调用者,因为默认值是按当前操作

EXEC p1 0, 2, @x1 OUTPUT, 0
重复上述步骤,即移除最终选择或至少基于所有子过程调用(即p1、p2和p3)的新可选输入参数在IF条件中换行

最后:

请确保正确设置@x的值。问题中发布的内容不起作用,甚至可能导致程序出错,应该是:SET@x=SELECT@x1、@x2、@x3代表XML路径“root” 确保在该外部过程中实际执行SELECT@x,因为只要设置@x,就可以假定它是一个输出参数,而不是结果集,因此不是XmlReader所要查找的。
请发布整个SP定义以及调用示例和结果示例。可能与设置NOCOUNT ON有关;这对xmlReader.NextResult有帮助吗?我认为xmlReader没有NextResult方法。与SQLDataReader不同。您可以发布嵌套存储过程的内容吗?例如,至少p1?不需要选择@xml。我已经从内部过程中删除了SELECT语句,它只返回@xml的输出。但现在在C代码中,我得到了这个错误:发送到ExecuteXmlReader的命令无效。命令必须返回一个Xml结果。@huber.duber:我已经更新了我的答案,以便更清楚地说明需要对所有子进程调用执行此操作,而不仅仅是p1。我怀疑p2、p3或两者都存在问题。另外,仅供参考,内联代码格式是回引号`.@huber.duber:我注意到最后一个集合@xYep中有语法错误,需要再做一些编辑。这就是我问nexted存储过程的内容时的意思。@Karlkienger:是的,这是肯定需要的,但缺少信息,这就是为什么我+1你的评论:-。