Advertisement
Guest User

Untitled

a guest
May 29th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.31 KB | None | 0 0
  1. 1.
  2. SELECT *
  3. FROM logu
  4. where exists (select * from dxml3.nodes('//*[uz1/@s="a" and uz1/@s="d" and uz1/@s="u"]') T(n))
  5.  
  6.  
  7. declare @xml XML = '<root1 a = "a" id = "2" zzz="d" > <test d = "b" c = "c" id="1" a = "a"/></root1>';
  8. declare @orderTable TABLE(node NVARCHAR(MAX), attr NVARCHAR(MAX));
  9. insert into @orderTable values('root1', 'id'), ('test', 'id');
  10.  
  11. SET @xml = @xml.query('<newRoot> { for $item in * return $item } </newRoot>');
  12.  
  13. DECLARE cursorXML CURSOR FOR  
  14.     SELECT n.query('.')
  15.     FROM @xml.nodes('//*[local-name(.)!="newRoot"]') T(n)
  16.    
  17. declare @n xml;
  18. OPEN cursorXML;
  19.  
  20. FETCH NEXT FROM cursorXML INTO @n;
  21. WHILE @@FETCH_STATUS = 0  
  22. BEGIN  
  23.     declare @node nvarchar(max) = (select CAST(n.query('local-name(.)') AS VARCHAR(MAX)) from @n.nodes('/*') T(n));
  24.     declare @id nvarchar(max) = (select n.value('.','NVARCHAR(MAX)') from @n.nodes('/*/@*[1]') T(n));
  25.     declare @parent nvarchar(max) = (select CAST(n.query('local-name(..)') AS VARCHAR(MAX)) from @xml.nodes('//*[local-name(.) = sql:variable("@node")][./@*[1] = sql:variable("@id")]') T(n));
  26.     declare @attr nvarchar(max) = (select top 1 attr from @orderTable where node = @node);
  27.    
  28.     declare @T TABLE(rowNumber INT, attr NVARCHAR(MAX), val NVARCHAR(MAX));
  29.     delete from @T;
  30.     insert into @T
  31.  
  32.     select ROW_NUMBER() OVER (order by attr), attr, val from
  33.     (select CAST(n.query('local-name(.)') AS VARCHAR(MAX)), n.value('.','NVARCHAR(MAX)')
  34.     FROM @n.nodes('/*/@*[local-name(.) != sql:variable("@attr")]') T(n)) T1(attr,val);
  35.  
  36.     SET @n.modify('delete /*/@*[local-name(.) != sql:variable("@attr")]');
  37.  
  38.     DECLARE @i INT = (select count(*) from @T);
  39.     SET @n.modify('delete /*/@*[position()>1]');
  40.     WHILE @i >= 1
  41.     BEGIN
  42.         declare @val nvarchar(max) = (select val from @T where rowNumber = @i);
  43.         SET @n.modify('insert attribute zz { sql:variable("@val") } into (/*)[1]');
  44.         SET @n = replace(cast(@n as nvarchar(max)), 'zz', (select attr from @T where rowNumber = @i));
  45.         SET @i-=1;
  46.     END;
  47.  
  48.     set @xml.modify('delete //*[local-name(.) = sql:variable("@node")][./@*[1] = sql:variable("@id")]');
  49.     SET @xml.modify('insert sql:variable("@n") into (//*)[local-name(.)=sql:variable("@parent")][1]');
  50. FETCH NEXT FROM cursorXML INTO @n;
  51. END;
  52.  
  53. close cursorXML;
  54. DEALLOCATE cursorXML;
  55.  
  56. SET @xml = (select top 1 n.query('.') from @xml.nodes('/newRoot/*[1]') T(n));
  57.  
  58. select @xml;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement