【问题标题】:XML INSERT INTO QueryXML INSERT INTO 查询
【发布时间】:2016-07-27 01:04:36
【问题描述】:

我希望使用 XML 参数字符串通过单个调用填充 SQL 表。

我构建 XML 的代码如下:

遍历列表

' update string for reserved character (ampersand) 
Dim descStr As String = allMarkets(0).result(j).event.name.Replace("&", "&&")
(NOTE : the ampersand reference text shown is not displaying correctly in this browser, where I put the correct string reference it is displaying incorrectly)

strBuffer.Append(" <ID>""" & allMarkets(0).result(j).event.id.ToString & """ </ID><DESC>""" & descStr & """</DESC>")

Next

我的存储过程:

ALTER PROC [dbo].[PriceDataXMLEVENTInsert1]
    (@ValidXMLInput XML)
AS 
BEGIN
    INSERT INTO PRICEDATA (EventID, EventDesc)
       SELECT 
           x.v.value('@ID', 'INT'), 
           x.v.value('@DESC', 'nvarchar(50)') 
       FROM 
           @ValidXMLInput.nodes('//ROOT/ROW') x(v)

传递给函数的 XML 字符串包含有效数据并且代码运行良好......但是当表中应该有几百条记录时 PRICEDATA - 没有......上面有什么问题...?

提前感谢您提供的任何帮助...

G

【问题讨论】:

  • 你能给我们提供传递给存储过程的实际字符串吗?
  • 我确实尝试过.. 但是因为它是 XML 本身,当我之前尝试发布时它显示不正确,它是一个长字符串,所以这里是它的一部分... "27748379" "Garbarnia v KS Spartakus Daleszyce""27748239" "H Petach Tikva Youth v H Rishon Lezion Youth" . ....
  • 如果我只是插入一个带有 XML 字符串的单个值来匹配.. this .... ALTER PROC [dbo].[PriceDataXMLEVENTInsert](@ValidXMLInput XML) AS BEGIN INSERT INTO PRICEDATA(EventID) SELECT Col.value('@ID','INT') FROM @ValidXMLInput.nodes('//Events/Event') Tab(Col) END 工作正常...
  • 你能把完整的字符串放在 Pastebin 上吗?
  • 您尝试将数据作为属性查询(使用@ID),但您使用数据作为元素(&lt;ID&gt;value&lt;/ID&gt;)构建 XML。当你把你的价值观放在" 标志中时,你会变得更糟......

标签: sql sql-server xml tsql parameter-passing


【解决方案1】:

回答你原来的问题:有什么问题

SELECT x.v.value('@ID','INT'), x.v.value('@DESC','nvarchar(50)') 
FROM @ValidXMLInput.nodes('//ROOT/ROW') x(v)

您的示例数据没有显示ROW 元素,也没有属性@ID@DESC。这不会返回任何内容...

不良数据的解决方案

DECLARE @x XML=
'<ROOT>
    <ID>"27748379" </ID>
    <DESC>"Garbarnia v KS Spartakus Daleszyce"</DESC>
    <ID>"27748239" </ID>
    <DESC>"H Peta8h Tikva Youth v H Rishon Lezion Youth"</DESC>
</ROOT>';

有几个缺陷:

  • 不要以这种方式分隔元素。使用 &lt;element&gt;&lt;ID&gt;gfjha&lt;/ID&gt;&lt;DESC&gt;sfasdf&lt;/DESC&gt;&lt;/element&gt; 将它们绑定在一起(都在一个节点内),或者 - 我的选择是什么 - 使用 &lt;element ID="fasdf" DESC="fsdfdaf"&gt;
  • 如果将值放在属性中 (&lt;element attr="value"&gt;),则需要引号。但在元素方面,它们令人不安!
  • 如果你想转义字符,你至少必须用&amp;lt;转义&gt;转义>和用&amp;amp;转义&(没有加倍的&&,就像你的例子一样!)

无论如何,这是一种从 XML 中获取类似表格的数据以便轻松插入的方法。但是你真的应该改变你的结构!

WITH IDNodes AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr
          ,B.value('.','varchar(max)') AS ID
    FROM @x.nodes('/ROOT/ID') AS A(B)
)
, DESCNodes AS
(
    SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr
          ,B.value('.','varchar(max)') AS [DESC]
    FROM @x.nodes('/ROOT/DESC') AS A(B)
)
SELECT IDNodes.ID,DESCNodes.[DESC]
FROM IDNodes 
INNER JOIN DESCNodes ON IDNodes.Nr=DESCNodes.Nr

结果(你应该让"离开...)

ID          DESC
"27748379"  "Garbarnia v KS Spartakus Daleszyce"
"27748239"  "H Peta8h Tikva Youth v H Rishon Lezion Youth"

最后,这可能是您真正想要实现的目标:

DECLARE @ValidXMLInput XML=
'<ROOT>
    <element ID="27748379" DESC="Garbarnia v KS Spartakus Daleszyce"/>
    <element ID="27748239" DESC="H Peta8h Tikva Youth v H Rishon Lezion Youth"/>
</ROOT>';

SELECT A.B.value('@ID','int') AS ID
      ,A.B.value('@DESC','varchar(max)') AS [DESC]
FROM @ValidXMLInput.nodes('/ROOT/element') AS A(B)

【讨论】:

  • Shnugo - 感谢您的及时回复!提议的解决方案很有效..我接受了你对我糟糕的编码结构所说的话....很多年前我曾经对 SQL Server 进行编码....所以已经忘记了很多,重新开始这些事情可能需要一段时间……尤其是当灰质变得不那么倾斜时……!再次感谢,帮助很大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多