2009-04-09 73 views
4

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

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) 

回答

6

大问题..但是没有解决

思考:

  • 不能包裹SELECT调用的UDF(创造一种虚拟的NTEXT局部变量)
  • 由于无法调用扩展存储过程,您无法将sp_xml_preparedocument调用换成标量UDF(在SELECT中使用)
  • 您无法将调用连接为动态运行,因为使用你击弦的限制和SCOP发出
  • 同上一个自己的呼叫使用OPENQUERY
  • TEXTPTR + READTEXT不能被添加作为参数传递给sp_xml_preparedocument

那么,为什么sp_xml_preparedocument采取NTEXT为数据类型?

+0

你也可以通过varchar,char,text等,所以我不会责怪sp_xml_preparedocument。我试图在另一个存储过程中包装sp_xml_preparedocument,但我遇到了不能使用表达式将ntext参数传递给包装过程的相同问题。 – flipdoubt 2009-04-09 19:09:13

相关问题