Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразуване на разделен със запетая низ в множество колони в sql сървър

Можете да видите това да работи на SQL Fiddle:http://sqlfiddle.com/#!3/ 8c3ee/32

Ето същината на това:

with parsed as (
  select
  commasepa,
  root.value('(/root/s/col[@name="X"])[1]', 'varchar(20)') as X,
  root.value('(/root/s/col[@name="Y"])[1]', 'varchar(20)') as Y,
  root.value('(/root/s/col[@name="Z"])[1]', 'varchar(20)') as Z,
  root.value('(/root/s/col[@name="A"])[1]', 'varchar(20)') as A,
  root.value('(/root/s/col[@name="B"])[1]', 'varchar(20)') as B,
  root.value('(/root/s/col[@name="C"])[1]', 'varchar(20)') as C,
  root.value('(/root/s/col[@name="D"])[1]', 'varchar(20)') as D
FROM
(
select
   commasepa,
   CONVERT(xml,'<root><s><col name="' + REPLACE(REPLACE(COMMASEPA, '=', '">'),',','</col></s><s><col name="') + '</col></s></root>') as root
FROM
  samp
) xml
)
update 
  samp
  set
  samp.x = parsed.x,
  samp.y = parsed.y,
  samp.z = parsed.z,
  samp.a = parsed.a,
  samp.b = parsed.b,
  samp.c = parsed.c,
  samp.d = parsed.d
from
  parsed
where
  parsed.commasepa = samp.commasepa;

Пълно разкриване – аз съм авторът на sqlfiddle.com

Това работи, като първо преобразува всеки низ от запетая в XML обект, който изглежда така:

<root>
 <s>
  <col name="X">1</col>
 </s>
 <s>
  <col name="Y">2</col>
 </s>
  ....
</root>

След като имам низа в този формат, използвам опциите xquery, поддържани от SQL Server 2005 (и по-нови), което е .value('(/root/s/col[@name="X"])[1]', 'varchar(20)') част. Избирам всяка от потенциалните колони поотделно, така че да се нормализират и попълват, когато са налични. С този нормализиран формат дефинирам набора от резултати с израз на обща таблица (CTE), който нарекох „анализиран“. Този CTE след това се обединява обратно в израза за актуализиране, така че стойностите да могат да бъдат попълнени в оригиналната таблица.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL String Functions:разлика между използването на Left/Right и Substring и странно поведение

  2. Len() срещу datalength() в SQL Server 2005

  3. SQL:Как да поддържате редове за проследяване, които вече съответстват в корелирана подзаявка?

  4. SQL Server използва висок процесор при търсене в nvarchar низове

  5. Как да съединя две несвързани таблици в sql