【问题标题】:Is there any size limit for the values returned from a Stored Procedure in SQL 2005?从 SQL 2005 中的存储过程返回的值是否有大小限制?
【发布时间】:2009-02-28 11:26:55
【问题描述】:

我正在尝试使用 For Xml 从 SQL Server 2005 返回 Xml 值。 SQL Server 返回的 xml 大小是否有限制?

我将使用 ExecuteXmlReader 来获取我的 C# 代码中的值。

另外,XmlReader 中可以保存的数据是否有任何限制?

任何想法...

【问题讨论】:

    标签: c# sql-server sql-server-2005


    【解决方案1】:

    没有实际限制,但您通常返回 nvarchar(MAX) 的等价物,因此您可能会遇到约 20 亿个字符的限制(而且可能要少得多)因为可用地址空间有限)。

    但是,您需要担心的限制并不小,例如 32KB 的 SQL 语句限制。

    【讨论】:

      【解决方案2】:

      技术上存在 1 Gig 的限制,因为 XML 数据类型基于 NVARCHAR(MAX) 数据类型。但如果您有一个 1 Gig XML 文档,则需要考虑将其缩小。

      【讨论】:

      • 好奇为什么是 1GB 而不是 ~2GB?
      • XML 是 unicode,因此它支持 10 亿个字符,即 2 Gigs 的数据,因为每个 unicode 字符需要两个字节的存储空间。
      【解决方案3】:

      确保使用以下代码:

      while(xmlReader.Read()){ 
      ...
      }
      

      否则,如果您的 XML 文档太大而无法放入一条记录,您最终可能会得到无效的 XML。到目前为止,SQL Server 会将其分布在多条记录中,...

      【讨论】:

      • 是不是说,如果SQL Server不能一次性加载全部数据,就会多次返回?
      • 它将返回多行。连接这些行将为您提供有效的 XML。
      【解决方案4】:

      不,没有限制。但应该很明显,如果返回数兆字节的数据,数据检索的速度就会受到影响。

      【讨论】:

        【解决方案5】:

        对于 SQL 2005 和 .Net 2.0,Microsoft 没有发布限制,但实际上大型结果集可能会因“内存不足”错误等而失败

        由于 XML 给 DB 服务器带来了额外的负载,您确定在应用服务器或客户端上将原始数据处理成 XML 不是更好吗?

        【讨论】:

        • SQL 2000 有一个客户端 xml 提供程序库,它将 For Xml 结果的处理卸载到客户端计算机。这是作为功能包的一部分发布的。
        【解决方案6】:

        如果您在 SQL Server Management Studio 中查看结果,则可以选择设置它可以显示多少数据,默认情况下仅为 2MB。

        要更改它,请遵循以下路径:
        工具 > 选项 > 查询结果 > SQL Server > 网格结果 > 检索的最大字符数

        【讨论】:

          【解决方案7】:

          SQL Server -> XML,然后 C# 将文本转换为 XML。那里效率不高。

          正常拉回数据。使用数据阅读器。然后你可以把它变成可翻译的格式。这些数据的消费者是什么?他们真的需要 XML 吗?他们需要定期转储数据吗?

          或者,您可以使用数据集。您可能在这里有一个很好的数据集案例。您可以将其保存为 XML 并保存或发送。一个 DataSet 被设计用来保存一堆表数据。

          【讨论】:

            【解决方案8】:

            如果您返回的字符数超过该字符数,您将收到异常“发生意外的文件结尾”,为了防止您可以使用以下代码:

                        using(XmlReader reader = command.ExecuteXmlReader())
                        {
                            XmlDocument xmlDocument = new XmlDocument();
            
                            while (reader.Read())
                            {
                                xmlDocument.Load(reader);
                            }
            
                            return xmlDocument;
                        }
            

            【讨论】:

              猜你喜欢
              • 2010-09-30
              • 1970-01-01
              • 2011-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多