【问题标题】:How to parse xml data in sql server dynamically如何动态解析sql server中的xml数据
【发布时间】:2019-04-01 13:00:37
【问题描述】:

我正在尝试获取“客户”的节点值,但我需要动态选择此节点并获取它的值,因为我正在尝试获取主键节点值,并且我将从其他表中获取该主键现在我已经设置了变量 @primary ='CUSTOMER' 但我收到了类似的错误

数据类型 varchar 和 xml 在 add 运算符中不兼容。

我尝试使用 cast 但没有用。谁能帮我解决这个问题

    declare @var xml,
@var1 varchar(max),
@var2 varchar(max),
@var3 varchar(max),
@var4 varchar(max),
@var5 varchar(max),
@primary  varchar(max);
set @primary='CUSTOMER';
set @var='<RequestData>
   <CREATED_BY>nachagon</CREATED_BY>
   <CUSTOMER_TYPE />
   <modalid>editmodgrid_iBase_VW_Customers</modalid>
   <Input_Date_From>31-Dec-2007 07:30:00 PM</Input_Date_From>
   <Timestamp>26-Mar-2019 04:02:01 PM</Timestamp>
   <UPDATED_ON />
   <USER_SELECTED_TIMEZONE>Venezuela Standard Time</USER_SELECTED_TIMEZONE>
   <NAME>Kevin Good</NAME>
   <CITY>Stewartsville</CITY>
   <COUNTRY>US</COUNTRY>
   <Input_Date_To>29-Jun-2008 07:30:00 PM</Input_Date_To>
   <UPDATED_BY>nachagon</UPDATED_BY>
   <CREATED_ON>28-Mar-2019 11:57:46 AM</CREATED_ON>
   <CUSTOMER>0000000233</CUSTOMER>
   <oper>edit</oper>
   <id>jqg1</id>
   <tablename>iBase_VW_Customers</tablename>
   <moduleId>Customers</moduleId>
   <LOGGED_IN_USER_ID>11</LOGGED_IN_USER_ID>
</RequestData>'
select  @var1=coalesce(@var1 + ',','')+NodeName , @var2=coalesce(@var2 +',','')+NodeValue 
from (select NodeName,NodeValue from(SELECT  NodeName = C.value('local-name(.)', 'varchar(50)'),
NodeValue = C.value('(.)[1]', 'varchar(50)')  FROM @var.nodes('/RequestData/*') AS T(C))t2  WHERE t2.NodeName NOT IN ('CREATED_BY', 'CREATED_ON', 'id','LOGGED_IN_USER_ID','modalid', 'moduleId','oper','tablename','UPDATED_BY','UPDATED_ON','USER_SELECTED_TIMEZONE'))t
select @var1,@var2 

SET @var5= 'select '+@var+'.value(''(RequestData/'+@primary+')[1]'',''varchar(max)'')'
exec (@var5)
print(@var5)

【问题讨论】:

  • 回到错误本身,当您设置 var 5 时,您将 XML 和 varchar 组合在一起... @var 是 XML,而您将其添加到 varchar
  • 是的,我遇到了这个问题,因为我在寻求帮助方面表现不佳

标签: sql-server xml-parsing


【解决方案1】:

这个例子可能会有所帮助

declare @primary nvarchar(max) = 'CUSTOMER';
declare @var xml =
'<RequestData>
   <CREATED_BY>nachagon</CREATED_BY>
   <CUSTOMER_TYPE />
   <modalid>editmodgrid_iBase_VW_Customers</modalid>
   <Input_Date_From>31-Dec-2007 07:30:00 PM</Input_Date_From>
   <Timestamp>26-Mar-2019 04:02:01 PM</Timestamp>
   <UPDATED_ON />
   <USER_SELECTED_TIMEZONE>Venezuela Standard Time</USER_SELECTED_TIMEZONE>
   <NAME>Kevin Good</NAME>
   <CITY>Stewartsville</CITY>
   <COUNTRY>US</COUNTRY>
   <Input_Date_To>29-Jun-2008 07:30:00 PM</Input_Date_To>
   <UPDATED_BY>nachagon</UPDATED_BY>
   <CREATED_ON>28-Mar-2019 11:57:46 AM</CREATED_ON>
   <CUSTOMER>0000000233</CUSTOMER>
   <oper>edit</oper>
   <id>jqg1</id>
   <tablename>iBase_VW_Customers</tablename>
   <moduleId>Customers</moduleId>
   <LOGGED_IN_USER_ID>11</LOGGED_IN_USER_ID>
</RequestData>'


DECLARE @cmd NVARCHAR(MAX) = 'SELECT @xml.value(''(/RequestData/'+@primary+')[1]'', ''nvarchar(max)'' )'
EXECUTE sp_executesql @cmd, N'@xml XML', @xml =  @var

这不是 100% 防弹,但它可能会帮助您实现目标。 此外,如果您知道数据类型,我建议您也将其传递给动态查询。

【讨论】:

    猜你喜欢
    • 2013-02-21
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多