Как преобразовать значение CSV в ячейке в строки и отменить его? - PullRequest
1 голос
/ 15 марта 2012

Я хочу преобразовать данные в таблицу

Name    DependsOn-CSV
----    -------------
a       b,c
b       d
c
d
e       g
f       b,e,a,g
g
h       a

в

Name    DependsOn-Rows
----    --------------
a       b
a       C
b       d
c
d
e       g
f       b
f       e
f       a
f       g
g
h       a

, а затем в

C1  C2  C3  C4  C5
--  --  --  --  --
f
    b
        d
    e
        g
    a
        b
            d
        c
    g
h
    a
        b
            d
        c

, используя SQL (не используя TSQL / циклытак далее).Можно ли это сделать?


ОБНОВЛЕНИЕ: Я думаю с точки зрения отношений.Поэтому, пожалуйста, не используйте XML, OpenQuery и т. Д. Для первой части вопроса.В этом вопросе есть проблема, связанная с реляционным дизайном, и вот в чем проблема!

1 Ответ

2 голосов
/ 15 марта 2012

Первый результат можно получить следующим образом:

Данные испытаний

DECLARE @tbl TABLE(Name VARCHAR(100),DependsOnCSV VARCHAR(100))

INSERT INTO @tbl
VALUES
    ('a','b,c'),
    ('b','d'),
    ('c',''),
    ('d',''),
    ('e','g'),
    ('f','b,e,a,g'),
    ('g',''),
    ('h','a')

Функция разделения

CREATE FUNCTION Split
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
  id int identity(1,1),
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(5)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
GO

Альтернативная функция разделения

CREATE FUNCTION dbo.Split (@s varchar(512),@sep char(1))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
GO

Запрос

SELECT
  tbl.Name,
  split.val AS [DependsOn-Rows]
FROM @tbl AS tbl
CROSS APPLY dbo.Split(tbl.DependsOnCSV,',') split

Тогда я не совсем уверен, как получить второй результат,Вы должны объяснить больше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...