2012-03-04 78 views
3

我有一个问题,一直在困扰着我一段时间,但是我一直无法找到任何适合我的具体情况的答案。可选地用于SQL Server中的XML

目前我正在使用一组存储过程,这些存储过程有一个名为AsXML的参数,它告诉proc将结果作为XML文档返回。现在这很好,运作良好,但我们实现这一目标的方式并不是非常好。整个查询以字符串形式构建,并使用EXEC命令执行。就我个人而言,我觉得这很糟糕,因为它使得更复杂的程序难以调试,而且真的是一个难题。向很少或没有SQL经验的新员工解释也很困难。必须有更好的方法来做到这一点。

我已经想过使用两个单独的存储过程,或者让调用代码将表结果转换为XML文档,但这些都不会与具有最后发言权的高层代表一起飞行。我希望有人能够提出另一个解决方案,可以勾选所有正确的框。

解决方案需要:在一个单一的存储过程

  • 工作
  • 生成XML或基于参数的标准表的结果集
  • 不能使用动态SQL
  • 美国没有写查询输出两次(一次使用FOR XML,一次没有)

任何想法,建议或解决方案?

回答

4

一个想法是构建结果并将其填充到#temp表中。

CREATE PROCEDURE dbo.foo 
    @AsXML BIT = 0 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * INTO #blat FROM <complicated query>; 

    IF @AsXML = 1 
    BEGIN 
     SELECT * FROM #blat FOR XML PATH ...; 
    END 
    ELSE 
    BEGIN 
     SELECT * FROM #blat; 
    END 
END 
GO 
+0

啊,这是一个解决方案,我没有想到这一点。会有点担心选择所有记录到临时表中然后再次选择它们的性能,但是我想我们当前的解决方案并不是那么快。我将有一个测试,看看。谢谢。 – djstamp 2012-03-05 08:56:45

+0

不幸的是你的其他要求胜过了速度。如果你想专注于性能,你将不得不放弃至少一个其他项目符号(重复查询两次,使用单独的过程,使用动态SQL等)。 – 2012-03-05 12:52:36

+0

我想这可能会是这样。这看起来对于我们所做的较小查询来说是很好的。我们必须使用其他解决方案之一来处理更大,更密集的查询。谢谢你的帮助。 – djstamp 2012-03-05 16:02:57