如何在 SQL 2000 中对 NTEXT 查询的结果使用 sp_xml_preparedocument?

发布于 2024-07-16 15:15:42 字数 898 浏览 6 评论 0原文

我知道 NTEXT 即将消失,并且这里存在更大的最佳实践问题(例如将 XML 存储在 NTEXT 列中),但我有一个包含 XML 的表,我需要从中提取属性值。 使用 sp_xml_preparedocument 应该很容易做到这一点,但由于您无法声明 NTEXT 类型的局部变量,而且我无法弄清楚如何使用表达式来指定传递给函数的 XML 文本,因此变得更加棘手。 由于 XML 或 VARCHAR(MAX) 数据类型,我可以在 SQL 2005 中这样做,但是对于 SQL 2000 我能做什么呢?

DECLARE @XmlHandle int
DECLARE @ProfileXml xml
SELECT @ProfileXml = ProfileXml FROM ImportProfile WHERE ProfileId = 1

EXEC sp_xml_preparedocument @XmlHandle output, @ProfileXml

-- Pluck the Folder TemplateId out of the FldTemplateId XML attribute.
SELECT FolderTemplateId
FROM OPENXML( @XmlHandle, '/ImportProfile', 1)
WITH( 
FolderTemplateId int '@FldTemplateId' )

EXEC sp_xml_removedocument @XmlHandle

对于 SQL 2000,我唯一能想到的就是使用 varchar(8000)。 难道真的没有办法使用像下面这样的表达式吗?

EXEC sp_xml_preparedocument @XmlHandle output, (SELECT ProfileXml FROM ImportProfile WHERE ProfileId = 1)

I know NTEXT is going away and that there are larger best-practices issues here (like storing XML in an NTEXT column), but I have a table containing XML from which I need to pluck a attribute value. This should be easy to do using sp_xml_preparedocument but is made more tricky by the fact that you cannot declare a local variable of type NTEXT and I cannot figure out how to use an expression to specify the XML text passed to the function. I can do it like this in SQL 2005 because of the XML or VARCHAR(MAX) datatypes, but what can I do for SQL 2000?

DECLARE @XmlHandle int
DECLARE @ProfileXml xml
SELECT @ProfileXml = ProfileXml FROM ImportProfile WHERE ProfileId = 1

EXEC sp_xml_preparedocument @XmlHandle output, @ProfileXml

-- Pluck the Folder TemplateId out of the FldTemplateId XML attribute.
SELECT FolderTemplateId
FROM OPENXML( @XmlHandle, '/ImportProfile', 1)
WITH( 
FolderTemplateId int '@FldTemplateId' )

EXEC sp_xml_removedocument @XmlHandle

The only thing I can come up with for SQL 2000 is to use varchar(8000). Is there really no way to use an expression like the following?

EXEC sp_xml_preparedocument @XmlHandle output, (SELECT ProfileXml FROM ImportProfile WHERE ProfileId = 1)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夏见 2024-07-23 15:15:42

很好的问题..但没有解决方案

想法:

  • 您不能将 SELECT 调用包装在 UDF 中(以创建一种虚拟的 ntext 本地变量)
  • 您不能将 sp_xml_preparedocument 调用包装在标量 UDF 中(在 SELECT 中使用)因为您无法调用扩展存储过程
  • 您无法连接动态运行的调用,因为您将达到字符串限制和范围问题
  • 同上使用 OPENQUERY textptr + READTEXT 的自我调用
  • 无法添加为sp_xml_preparedocument 的参数

那么为什么 sp_xml_preparedocument 采用 ntext 作为数据类型呢?

Great question.. but no solution

Thoughts:

  • You can't wrap the SELECT call in a UDF (to create a kind of dummy ntext local var)
  • You can't wrap the sp_xml_preparedocument call in a scalar UDF (to use in SELECT) because you can't call extended stored procs
  • You can't concatenate a call to run dynamically because you'll hit string limits and scop issues
  • Ditto a self call using OPENQUERY
  • textptr + READTEXT can't be added as a parameter to sp_xml_preparedocument

So why does sp_xml_preparedocument take ntext as a datatype?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文