Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL server将表中的数据插入到XML变量中_Sql Server 2005_Sqlxml - Fatal编程技术网

Sql server 2005 SQL server将表中的数据插入到XML变量中

Sql server 2005 SQL server将表中的数据插入到XML变量中,sql-server-2005,sqlxml,Sql Server 2005,Sqlxml,如何在不使用游标的情况下将一整串行插入到XML变量中? 我知道我能行 SET @errors.modify('insert <error>{ sql:variable("@text") }</error> as last into /errors[1]') 插入变量的值,但我想基本上这样做 SET @errors.modify(SELECT 'insert <error>{ sql:column("text") }</error>' FROM t

如何在不使用游标的情况下将一整串行插入到XML变量中? 我知道我能行

SET @errors.modify('insert <error>{ sql:variable("@text") }</error> as last into /errors[1]')
插入变量的值,但我想基本上这样做

SET @errors.modify(SELECT 'insert <error>{ sql:column("text") }</error>' FROM table)
当然,这不是合法的语法

编辑:显然我的问题不清楚。我想要的是能够这样做:

CREATE TABLE my_table(text nvarchar(50))
INSERT INTO my_table VALUES('Message 2')
INSERT INTO my_table VALUES('Message 3')

DECLARE @errors xml
SET @errors = '<errors><error>Message 1</error></errors>'

SET @errors.modify('INSERT EVERYTHING FROM my_table MAGIC STATEMENT')
运行此代码后,@errors应该包含

<errors>
  <error>Message 1</error>
  <error>Message 2</error>
  <error>Message 3</error>
</errors>
最近更新:

好了,现在问题已经清楚多了,他是解决方案——希望如此

DECLARE @errors xml
SET @errors = '<errors><error>Message 1</error></errors>'

DECLARE @newErrors XML 

SELECT @newErrors = (SELECT text AS 'error'
FROM dbo.my_table 
FOR XML PATH(''), ELEMENTS)

SELECT @errors, @newErrors

SET @errors.modify('insert sql:variable("@newErrors") as last into (/errors)[1]')

SELECT @errors
更新:好的,那么您想做相反的事情——将关系数据转换为XML——这更容易:-

DECLARE @NewXmlContent XML

SELECT @NewXmlContent = 
       (SELECT
          col1 as '@ID',
          col2 as 'SomeElement',
          .....
          colN as 'LastElement'
       FROM 
          dbo.YourTable
       WHERE
           ....
       FOR XML PATH('element'), ROOT('root')
       )

UPDATE YourOtherTable
SET XmlField.modify('insert sql:variable("@NewXmlContent") 
                     as last into (/XPath)[1]')
WHERE (some condition)
这将在@NewXmlContent中为您提供类似的内容:

<root>
   <element ID="(value of col1)">
      <SomeElement>(value of col2)</SomeElement>
      .....
      <LastElement>(value of colN)</LastElement>
   </element>
</root>
带有.modify调用的UPDATE语句实际上会将该内容插入到数据库中的现有XML字段中。这是将XML内容放入现有XML列中的唯一方法—无法在插入的XML片段中直接引用另一个XML列

新的FOR XML路径语法非常强大和灵活,允许您做任何事情

当然,您可以轻松地将其存储到XML变量中


Marc

根据Marc的回答,以下是一个适用于SQL Server 2005的解决方案:

CREATE TABLE #my_table(text nvarchar(50))
INSERT INTO #my_table VALUES('Message 2')
INSERT INTO #my_table VALUES('Message 3')

DECLARE @errors xml
SET @errors = '<errors><error>Message 1</error></errors>'

SELECT @errors = CAST(@errors AS nvarchar(max)) + '<new>' + (SELECT text AS 'error' FROM #my_table FOR XML PATH(''), ELEMENTS) + '</new>'

SET @errors = CAST(@errors AS nvarchar(max)) + '<new>' + @newErrors + '</new>'
SET @errors.modify('insert (/new/*) as last into (/errors)[1]')
SET @errors.modify('delete (/new)')

SELECT @errors

DROP TABLE #my_table
会回来的

<errors>
  <error>Message 1</error>
  <error>Message 2</error>
  <error>Message 3</error>
</errors>
这不是更简单吗

set ErrorXML=(SELECT * from #MyTable FOR XML AUTO)

是的,但我想做相反的事情:用表中的数据填充xml变量。我知道FOR xml语法,但您能告诉我如何使用它附加到现有变量上吗,而不是完全替换该值。啊,好的-从您最初的问题中不清楚-答案再次更新该技术还应适用于使用新内容更新XML类型的现有SQL变量。顺便说一句,您的最新解决方案看起来很有希望,但不幸的是,它失败了,错误消息为XQuery:XQuery中不支持SQL类型“xml”。如果将@newErrors的类型更改为nvarcharmax,则会失败,错误为“XQuery[modify]:只能插入非文档节点。找到xs:string?'。它更简单,但它将替换变量的内容,而不是附加到变量中。
<root>
   <element ID="(value of col1)">
      <SomeElement>(value of col2)</SomeElement>
      .....
      <LastElement>(value of colN)</LastElement>
   </element>
</root>
CREATE TABLE #my_table(text nvarchar(50))
INSERT INTO #my_table VALUES('Message 2')
INSERT INTO #my_table VALUES('Message 3')

DECLARE @errors xml
SET @errors = '<errors><error>Message 1</error></errors>'

SELECT @errors = CAST(@errors AS nvarchar(max)) + '<new>' + (SELECT text AS 'error' FROM #my_table FOR XML PATH(''), ELEMENTS) + '</new>'

SET @errors = CAST(@errors AS nvarchar(max)) + '<new>' + @newErrors + '</new>'
SET @errors.modify('insert (/new/*) as last into (/errors)[1]')
SET @errors.modify('delete (/new)')

SELECT @errors

DROP TABLE #my_table
<errors>
  <error>Message 1</error>
  <error>Message 2</error>
  <error>Message 3</error>
</errors>
set ErrorXML=(SELECT * from #MyTable FOR XML AUTO)