Translate

Monday, April 14, 2014

Xml Shredder

SELECT
[Parent] = T.C.value('local-name(../../..)', 'varchar(50)')
, [ParentID] = T.C.value('../../../@ID', 'uniqueidentifier')
, [Node] = T.C.value('local-name(..)', 'varchar(50)')
, [ID] = T.C.value('../@ID', 'uniqueidentifier')
, [ChildNode] = T.C.value('local-name(.)', 'VARCHAR(50)')
, [Value] = T.C.value('.', 'nvarchar(max)')
FROM @xml.nodes('//Transfer/*/*/*') T(C);

Wednesday, April 2, 2014

The FOR XML clause is not allowed in a INSERT statement

DECLARE @sql nvarchar(max);
DECLARE @TRANSFER_TYPE_CD nvarchar(50) = 'SF1151';
DECLARE @Transfers XML, @results XML;

DECLARE @tmpTable TABLE (data XML);
DECLARE @nodes TABLE (match XML);

INSERT @tmpTable SELECT ('');
SELECT * FROM @tmpTable;

-- wrap select with select()
select @sql = N'
DECLARE @TRANSFER_TYPE_CD nvarchar(50)=''' + @TRANSFER_TYPE_CD + ''';
SELECT(SELECT
[TRANSFER_XML].query(''//Transfer[@Type=sql:variable("@TRANSFER_TYPE_CD")]'')
FROM [dbo].[IMART_TRANSFER]
FOR XML PATH(''''))';

INSERT into @nodes exec(@sql);
SELECT * from @nodes;

SELECT @results = (SELECT * from @nodes);

UPDATE @tmpTable
SET data.modify('insert sql:variable("@results") into (/root/Transfers)[1]');
SELECT * FROM @tmpTable;