Вывести номер документа и номер бланка документа без разделителей

Рейтинг: 0Ответов: 1Опубликовано: 19.01.2015

Здравствуйте.

Помогите, пожалуйста, решить задачу.

Есть 1 таблица, которая содержит номер документа и номера бланков, разделенные разделителем:

Таблица 1

----------
Doc_num blanks
----------
d1     b1/b2
----------
d2    b3
----------
d3    b4/b5/b6
----------

На основе этой таблицы необходимо вывести в отдельную таблицу, если такой-то номер бланка существует, вывести номер бланка и номер документа, соответствующий ему, т.е. если есть бланки b1, b2, то вывести их номера b1, b2 без разделителя и номер документа d1.

То есть должно быть так:

Таблица 2

----------
Blank doc
----------
b1   d1
----------
b2   d1
----------

Ответы

▲ 1

Напишите табличную функцию, которая из вашей строки с разделителями сделает табличку с номерами. Используйте её для получения записей:

Insert tmp (did, bid) 
Select did, bid 
From tbl 
Cross apply dbo.fun (bids) tmp 
Where did in
(
    Select did 
    From tbl 
    Cross apply dbo.fun (bids) tmp 
    Group by did, bids
    Having count (bid) =
    (
        Select count (bid) 
        From dbo.fun (bids)
    )
)

Обновление

Работающий или нет, но все просто:

Create function dbo.fun (@bids nvarchar(max))
Returns @ret table (bid int) as begin 
With pos (start, length) as 
(
Select 1, isnull(nullif(patindex('%\%', @bids), 0), len(@bids) + 1) - 1
Where len(@bids) > 0
Union all 
Select start + length + 1, isnull(nullif(patindex('%\%', substring(@bids, start + length + 1, len(@bids))), 0), len(@bids) + 1) - 1
From pos 
Where start + length < len(@bids) 
)
Insert @ret (bid) 
Select convert(int, substring(@bids, start, length)) 
From pos 
Return 
End