試圖瞭解爲什麼你不能使用SQL Server中的XML節點的功能時,該值類型使用SQL_VARIANT?我有一個場景,我將動態解析一些XML輸入,並能夠使用sql_variant將是一個很好的替代方案,以分配數據類型變量或在sys.columns上執行查找。的SQL Server 2008 - SQL_VARIANT在XML nodes.value
例子:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[XmlSourceTable]') AND type in (N'U'))
DROP TABLE [dbo].[XmlSourceTable]
GO
CREATE TABLE [dbo].[XmlSourceTable](
[RecordId] [int] IDENTITY(1,1) NOT NULL,
[XmlData] [xml] NOT NULL,
PRIMARY KEY CLUSTERED
(
[RecordId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
DECLARE @XML XML ='<?xml version="1.0" ?>
<Root>
<Person>
<Name>Simon</Name>
<Age>20</Age>
<Skills>
<Skill>Cooking</Skill>
<Skill>Cleaning</Skill>
</Skills>
</Person>
<Person>
<Name>Peter</Name>
<Age>21</Age>
<Skills>
<Skill>Ironing</Skill>
</Skills>
</Person>
</Root>'
INSERT INTO XmlSourceTable(XmlData)
SELECT @XML
GO
SELECT * FROM XmlSourceTable
GO
SELECT
pref.value('(Name/text())[1]', 'varchar(50)') as PersonName,
pref.value('(Age/text())[1]', 'int') as PersonAge,
pref.query('Skills') as PersonSkills
FROM
XmlSourceTable CROSS APPLY
XmlData.nodes('/Root/Person') AS People(pref)
所以不是:
SELECT * FROM XmlSourceTable
GO
SELECT
pref.value('(Name/text())[1]', 'varchar(50)') as PersonName,
pref.value('(Age/text())[1]', 'int') as PersonAge,
pref.query('Skills') as PersonSkills
FROM
XmlSourceTable CROSS APPLY
XmlData.nodes('/Root/Person') AS People(pref)
這將是很好的使用方法:
SELECT * FROM XmlSourceTable
GO
SELECT
pref.value('(Name/text())[1]', 'sql_variant') as PersonName,
pref.value('(Age/text())[1]', 'sql_variantt') as PersonAge,
pref.query('Skills') as PersonSkills
FROM
XmlSourceTable CROSS APPLY
XmlData.nodes('/Root/Person') AS People(pref)
但我得到這個錯誤: 消息9500,級別16 ,狀態1,行1 VALUE方法中使用的數據類型'sql_variant')是無效的。
反正使用SQL_VARIANT中的節點功能?
謝謝,
小號
感謝萊姆斯....有道理。 – scarpacci 2010-09-09 17:43:34