最後更新:
OK,現在的問題是,更清楚,他是解決方案 - 希望!
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
這給了我一開始
@errors後
<errors><error>Message 1</error></errors>
@newError 「魔術師」 選擇:
<error>Message 2</error><error>Message 3</error>
@errors的更新後:
<errors>
<error>Message 1</error>
<error>Message 2</error>
<error>Message 3</error>
</errors>
是那個你在找什麼? :-)
(舊的答案 - 不是什麼OP是尋找.....)
你需要看看SQL的XQuery的.nodes()
功能 - 這將打破一個XML 根據XPath表達式(引用XML中的某個點,您可能擁有相同結構的節點的枚舉),將其變爲XML節點列表,併爲其提供「虛擬」表和列名稱。
基於該「Table.Column」元素,您可以從該XML節點中選擇單個值 - 屬性或子元素 - 並將其返回爲「原子」值。作爲INT,VARCHAR(x),無論你需要什麼。這些數值可以被插入到表:
INSERT dbo.YourTable(col1, col2, col3, ..., colN)
SELECT
Error.Column.value('@attr1[1]', 'varchar(20)'),
Error.Column.value('subitem[1]', 'int'),
.....
Error.Column.value('subitemN[1]', 'DateTime')
FROM
@xmldata.nodes('/error') AS Error(Column)
UPDATE:好了,你想要做的恰恰相反 - 把關係型數據轉換成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>
和UPDATE語句與.modify()
通話將實際插入次在內容中添加到數據庫中的現有XML字段中。這是將XML內容轉換爲現有XML列的唯一方法 - 無法直接引用正在插入的XML片段中的另一個XML列......
新的「FOR XML PATH」語法非常強大,靈活,並允許你做任何事情。
當然,您可以輕鬆地將其存儲到XML變量中。
馬克
是的,但我想做相反的事情:用表中的數據填充xml變量。 – erikkallen 2009-11-21 13:35:29
我知道FOR XML語法,但你能告訴我如何使用它來追加到現有的變量,而不是完全替換值。 – erikkallen 2009-11-21 15:03:26
好的 - 從你的原始問題中不清楚 - 答案再次更新 – 2009-11-21 15:37:32