【问题标题】:SQL Server Assign XML Variable from Row Data with NamespacesSQL Server 使用命名空间从行数据中分配 XML 变量
【发布时间】:2012-07-27 13:57:05
【问题描述】:

所以我将整个 XML 文件存储在表的单行/列中。我需要将它分配给一个变量并指定 WITH NAMESPACES。我想不出任何有效的语法。

DECLARE @xmlText xml

 set  @xmlText = (select rowdata    
 FROM dbo.Staging with (nolock)    
 WHERE     
  FileId = @FileID AND    
  ClientID = @ClientID) 

我会以某种方式设计一个 sql 语句来执行吗?但是,如果我这样做,我不确定如何将其分配回局部变量,因为它将位于另一个 spid 上。我被难住了!


我将使用 xquery :)

这通过了语法检查...

;WITH XMLNAMESPACES('http://xxx' AS p) 
(select @xmlText = rowdata    
 FROM dbo.Staging with (nolock)    
 WHERE     
  FileId = @FileID AND    
  ClientID = @ClientID) 


SELECT      
MFRRequestID = Y.i.value('(@id)[1]', 'int'),     
RequestStatus = Y.i.value('Status[1]', 'varchar(10)') ,     
AccountNumber = Y.i.value('p:AccountNumber[1]', 'varchar(10)'),    
ReferralDate = CIF.value('(ReferralDate)[1]', 'datetime'),     
SuspenseBalance = CIF.value('(SuspenseBalance)[1]', 'varchar(25)') 
FROM      @xmltext.nodes('/p:OrderRequest/p:RequestItems/p:MFRRequest') 
AS Y(i) CROSS APPLY     i.nodes('p:CaseInformation') AS Tbl(CIF) 

但我得到了错误...

XQuery [nodes()]:名称“p”不表示命名空间。

这与我昨天提出的一个问题有关。我基本上得到了这个确切的东西,但我没有从表中分配@xmltext变量(这是我需要为最终生产代码做的),我复制并粘贴了xml并将其分配为硬编码字符串,这样我就可以制定 xquery 语法。很抱歉造成混乱,这对我来说都是新事物。

【问题讨论】:

  • 您没有在查询中使用nodes(),因此它必须是另一个给您错误的查询。可能那个查询需要with namespaces( ...

标签: sql sql-server xml variables namespaces


【解决方案1】:

第二个查询需要WITH XMLNAMESPACES

DECLARE @xmlText xml;

SELECT @xmlText = rowdata    
FROM dbo.Staging
WHERE     
  FileId = @FileID AND    
  ClientID = @ClientID; 


WITH XMLNAMESPACES('http://xxx' AS p)
SELECT      
MFRRequestID = Y.i.value('(@id)[1]', 'int'),     
RequestStatus = Y.i.value('Status[1]', 'varchar(10)') ,     
AccountNumber = Y.i.value('p:AccountNumber[1]', 'varchar(10)'),    
ReferralDate = CIF.value('(ReferralDate)[1]', 'datetime'),     
SuspenseBalance = CIF.value('(SuspenseBalance)[1]', 'varchar(25)') 
FROM      @xmltext.nodes('/p:OrderRequest/p:RequestItems/p:MFRRequest') 
AS Y(i) CROSS APPLY     i.nodes('p:CaseInformation') AS Tbl(CIF);

【讨论】:

  • 哦lawd,大声笑,非常感谢您的帮助,先生! :) 现在看起来不错。
  • 不客气。请注意我如何将语句分隔符 ; 移动到它所属的位置:)。它必须在with 语句之前存在,但它属于前一个语句。
  • 我确实注意到了!我花了一秒钟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
相关资源
最近更新 更多