XML original:

 1
 2declare @xml xml = '
 3<MyRow rowValue2="NewValue3">
 4    <IdProduct>312345</IdProduct>
 5    <CodeProduct>CAPEX</CodeProduct>
 6    <IdCaract1>12</IdCaract1>
 7    <IdCaract2>23</IdCaract2>
 8    <Description>XML Support in Microsoft SQL Server</Description>
 9    <item>
10        <myitem>13</myitem>
11    </item>
12    <item>
13        <myitem>14</myitem>
14    </item>
15</MyRow>
16<MyRow rowValue1="myNewRow1" rowValue2="NewValue2">
17    <IdProduct CanBeDeleted="Yes">312345</IdProduct>
18    <CodeProduct>TOPEX</CodeProduct>
19    <IdCaract1>13</IdCaract1>
20    <IdCaract2>14</IdCaract2>
21    <Description>Server-Side Support</Description>
22</MyRow>
23'

Sélection de données 1:

1
2SELECT
3  Tbl.Col.value('IdProduct[1]', 'int') as IdProduct,
4  Tbl.Col.value('CodeProduct[1]', 'nvarchar(10)') as CodeProduct,
5  Tbl.Col.value('IdCaract1[1]', 'smallint') as IdCaract1,
6  Tbl.Col.value('IdCaract2[1]', 'smallint') as IdCaract2,
7  Tbl.Col.value('Description[1]', 'nvarchar(40)') as [Description]
8FROM   @xml.nodes('//MyRow') Tbl(Col);
1
2IdProduct   CodeProduct IdCaract1 IdCaract2 Description
3----------- ----------- --------- --------- ----------------------------------------
4312222      CAPEX       12        23        XML Support in Microsoft SQL Server
5312333      TOPEX       13        14        Server-Side Support

Sélection de données 2:

1
2SELECT
3  Tbl.Col.value('IdProduct[1]', 'int') as IdProduct,
4  Tbl.Col.value('@rowValue1', 'nvarchar(20)') as rowValue1,
5  Tbl.Col.value('@rowValue2', 'nvarchar(20)') as rowValue2
6FROM   @xml.nodes('//MyRow') Tbl(Col);
1
2IdProduct   rowValue1            rowValue2
3----------- -------------------- --------------------
4312222      NULL                 NewValue3
5312333      myNewRow1            NewValue2

Sélection de données 3: Il faut noter que dans ce cas si’il n’y a pas des valeurs dans le niveau cherché, alors il n’y a pas de données du niveau superieur. Remarquer qu’il n’y a pas le produit “IdProduct=312333”.

1
2SELECT
3  Tbl.Col.value('../IdProduct[1]', 'int') as IdProduct,
4  Tbl.Col.value('myitem[1]', 'smallint') as item
5FROM   @xml.nodes('//MyRow/item') Tbl(Col);
1
2IdProduct   item
3----------- ------
4312222      13
5312222      14

Sélection de données 4:

 1
 2SELECT
 3  Tbl.Col.value('../@rowValue1', 'nvarchar(20)') as rowValue1,
 4  Tbl.Col.value('../@rowValue2', 'nvarchar(20)') as rowValue2,
 5  Tbl.Col.value('../IdProduct[1]', 'int') as IdProduct,
 6  Tbl.Col.value('../CodeProduct[1]', 'nvarchar(10)') as CodeProduct,
 7  Tbl.Col.value('../IdCaract1[1]', 'smallint') as IdCaract1,
 8  Tbl.Col.value('../IdCaract2[1]', 'smallint') as IdCaract2,
 9  Tbl.Col.value('../Description[1]', 'nvarchar(40)') as [Description],
10  Tbl.Col.value('myitem[1]', 'smallint') as item
11FROM   @xml.nodes('//MyRow/item') Tbl(Col);
1
2rowValue1            rowValue2            IdProduct   CodeProduct IdCaract1 IdCaract2 Description                              item
3-------------------- -------------------- ----------- ----------- --------- --------- ---------------------------------------- ------
4NULL                 NewValue3            312222      CAPEX       12        23        XML Support in Microsoft SQL Server      13
5NULL                 NewValue3            312222      CAPEX       12        23        XML Support in Microsoft SQL Server      14

Requête pour créer un variable XML et le script pour le “SELECT” la variable xml.

 1
 2DECLARE @TABLE_NAME as NVARCHAR(100);
 3DECLARE @TABLE_SCHEMA as NVARCHAR(100);
 4DECLARE @MyElement as NVARCHAR(100);
 5DECLARE @MyFieldXml as NVARCHAR(100);
 6DECLARE @MyPrefix as NVARCHAR(100);
 7
 8
 9SET @TABLE_NAME = 'sqlwatch_config_sql_instance'
10SET @TABLE_SCHEMA = 'dbo'
11
12--MyFieldXml
13SET @MyElement  = 'msg_' + @TABLE_NAME; -- we must check if this name is ok for YOU.
14SET @MyFieldXml = 'Message';            -- we must check if this name is ok for YOU.
15SET @MyPrefix   = 'tbl.Col';            -- we must check if this name is ok for YOU.
16SET NOCOUNT ON
17
18BEGIN TRY DROP TABLE #TMP END TRY BEGIN CATCH END CATCH;
19SELECT
20        TABLE_SCHEMA
21       ,TABLE_NAME
22       ,ORDINAL_POSITION AS rownumber
23       ,COLUMN_NAME AS 'ColumnName'
24       ,DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END AS 'DataType'
25       ,IS_NULLABLE
26       ,'@'+REPLACE(COLUMN_NAME,' ','_') + ' AS ' + DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END as procedureParameter
27       , @MyPrefix+'.value(''('+COLUMN_NAME+')[1]'', '''+DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END+''') as ['+COLUMN_NAME+']' as xmlParameterV1
28       , '['+@MyFieldXml+'].value(''('+@MyElement+'/'+TABLE_NAME+'/'+COLUMN_NAME+')[1]'', '''+DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END+''') as ['+COLUMN_NAME+']' as xmlParameterV2
29       , 'DECLARE @'+REPLACE(COLUMN_NAME,' ','_') + ' AS ' + DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END + ';' AS [DeclareVariable]
30       , '['+COLUMN_NAME+'] ' + + DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END + CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE ' NULL' END  AS CreateField
31INTO #TMP
32FROM INFORMATION_SCHEMA.COLUMNS
33WHERE TABLE_SCHEMA = @TABLE_SCHEMA AND TABLE_NAME = @TABLE_NAME;
34
35DECLARE @SQL AS NVARCHAR(MAX);
36SET @SQL = '';
37
38SELECT @SQL = @SQL
39              + CASE WHEN @SQL = '' THEN '  ' ELSE ', ' END
40              + xmlParameterV1
41              + CHAR(13) + CHAR(10)
42FROM
43#TMP;
44
45
46PRINT 'DECLARE @xml as xml;
47SELECT @xml = (
48SELECT * FROM [' + @TABLE_SCHEMA + '].[' + @TABLE_NAME + '] for xml path
49);
50
51select @xml as [xml];
52'
53SET @MyPrefix = replace(@MyPrefix, '.','(')+')'
54SET @SQL = 'SELECT'+ CHAR(13) + CHAR(10)
55          + @SQL
56          + 'FROM   @xml.nodes(''row'') '+@MyPrefix + CHAR(13) + CHAR(10)
57 
58
59PRINT @SQL

Source : https://msdn.microsoft.com/en-us/library/ms191474.aspx https://msdn.microsoft.com/en-us/library/ms345117%28SQL.90%29.aspx http://kennyshu.blogspot.com/2007/12/convert-xml-file-to-table-in-sql-2005.html