【问题标题】:insert int into xml column sql将 int 插入 xml 列 sql
【发布时间】:2009-07-28 09:53:08
【问题描述】:

我如何将 int 参数插入到 xml 修改插入语句中,这是一个示例:

DECLARE @holdxml xml
DECLARE @myInt xml

set @myInt = 10

SET @holdxml = (SELECT CAST(VehicleManufacturerXML as xml) FROM VehicleManufacturers WHERE VehicleManufacturerID = 496);

SET @holdxml.modify('insert <VehicleManufacturerID>cast(@myInt, varchar(max))</VehicleManufacturerID> into (/VehicleManufacturers)[1]')

select @holdxml as x

我尝试过转换,甚至发现 sql:variable 但似乎没有任何效果? :(

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?

标签: sql-server xml


【解决方案1】:

在 SQL Server 2008 中(我相信这是极少数与 XML 相关的新功能之一),您可以编写如下代码:

DECLARE @holdxml xml
DECLARE @myInt xml

set @myInt = '<VehicleManufacturerID>abc</VehicleManufacturerID>'

SET @holdxml = (SELECT CAST(VehicleManufacturerXML as xml) FROM VehicleManufacturers WHERE VehicleManufacturerID = 496);

SET @holdxml.modify('insert sql:variable("@myInt") into (/VehicleManufacturers)[1]')

select @holdxml as x

但恐怕在 2005 年,这(还)行不通,AFAIK。在“插入”XML DML 语句中使用 sql:variable 是 SQL Server 2008 中的新功能。您可以在 SQL Server 2005 及更高版本的其他地方(例如replace value of 等)使用 sql:variable。

马克

PS:好的,所以在 2005 年,我不能 100% 确定这是否可行(手头没有 2005 年来测试它),但你可以尝试:

DECLARE @holdxml xml
DECLARE @myInt VARCHAR(MAX)

set @myInt = '<VehicleManufacturerID>abc</VehicleManufacturerID>'

SET @holdxml = (SELECT CAST(VehicleManufacturerXML as xml) FROM VehicleManufacturers WHERE VehicleManufacturerID = 496);

SET @holdxml.modify('insert ' + @myInt + ' into (/VehicleManufacturers)[1]')

select @holdxml as x

只需将您的 @myInt 变量设为 VARCHAR(MAX) 并在 .modify 语句中将字符串连接在一起。

【讨论】:

  • 对不起,marc_s 我没有意识到我没有将示例代码 @myInt 更新为 123 。不幸的是,这不起作用我收到以下错误:Msg 8172, Level 16, State 1, Line 8 xml 数据类型方法“修改”的参数 1 必须是字符串文字。
  • 我想动态地指定“ into (//node)[1] ”部分。有谁能告诉我该怎么做。
【解决方案2】:

我最后使用了替换,tbh 该列实际上是一个带有 XML 的 NTEXT(以前站点的旧设计)。我想转换为 XML 并使用所有可爱的 @XMLPARAM.modify 功能,然后再转换回来,但这就是我最后所做的。

--Update Vehicle Options XML

DECLARE @VOXML as nvarchar(MAX)
SET @VOXML = (SELECT VehicleOptions.VehicleOptionXML FROM VehicleOptions WHERE VehicleOptions.VehicleOptionID = @VehOptionID)
SET @VOXML  = replace(@VOXML, '<VehicleOptionID></VehicleOptionID>', '<VehicleOptionID>'+cast(@VehOptionID as nvarchar(MAX))+'</VehicleOptionID>')
SET @VOXML  = replace(@VOXML, '<VehicleModelID title=""Model""></VehicleModelID>', '<VehicleModelID title=""Model"">'+cast(@VehModelID as nvarchar(MAX))+'</VehicleModelID>')

UPDATE VehicleOptions 
SET VehicleOptionXML = @VOXML
WHERE VehicleOptions.VehicleOptionID = @VehOptionID

有趣的是,我的第二次替换似乎没有实现。嗯,我再调查一下……

欢呼响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-03-20
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多