5

我知道 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)
4

1 回答 1

6

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

想法:

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

那么为什么sp_xml_preparedocument要把 ntext 作为数据类型呢?

于 2009-04-09T18:59:26.237 回答