SQL Server 2005 - Табличные функции в операторе Select - PullRequest
2 голосов
/ 22 мая 2009

У меня есть таблица с именем PurchaseOrderDetail.

TABLE PurchaseOrderDetail
 PurchaseOrderDetail int,
 Comments nvarchar(500)

В поле «Комментарии» каждого элемента у меня есть отдельный список «;», в котором хранятся Название контракта, Номер контракта, Название лицензии, Версия лицензии.

т.е.

PurchaseOrderDetail     Comments 
1                      'Microsoft Office Standard 2007;12%;;'
2                      'Microsoft Visio 2007;9%;;'

У меня также есть функция Split, которая принимает разделитель и строку и возвращает таблицу,

Так называю это выберите * из Разделить (';', 'Microsoft Office Standard 2007; 12% ;;')

возвращает это

pn           s [ column names]
1            Microsoft Office Standard 2007
2            12%

Мне нужно выделить эту информацию для каждого PurchaseOrderDetail и показать их в отчете

Так что-то вроде этого

select PurchaseOrderDetailID, cn.s as ContractName, cno.s as ContractNo
from dbo.PurchaseOrderDetail as pod
join dbo.Split(';', pod.Comments) as cn on cn.pn = 1
join dbo.Split(';', pod.Comments) as cno on cno.pn = 2

хотя это не работает, но я надеюсь, что это предполагает намерение.

Мне бы хотелось, чтобы мои результаты были:

PurchaseOrderDetailID   ContractName                    ContractNo
1                       Microsoft Office Standard 2007  12%

Возможно ли это, или я занимаюсь этим неправильно

Ответы [ 2 ]

3 голосов
/ 22 мая 2009

Вы присоединяетесь к табличным функциям, используя ключевое слово apply . Просто передайте свои поля в функцию, а не используйте выражение «ON». Пример из MSDN:

SELECT D.deptid, D.deptname, D.deptmgrid, ST.empid, ST.empname, ST.mgrid
FROM Departments AS D
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;

OUTER APPLY является эквивалентом LEFT JOIN.

Редактировать

В вашем примере вы можете добавить критерии "cn = 1" и "cn = 2" в качестве предложения WHERE после применения функции.

0 голосов
/ 22 мая 2009

Существует причина, по которой таблицы могут иметь более 1 столбца. Боль в том, чтобы постоянно выделять значения из общего столбца!

  • измени свой стол
  • добавить выделенные столбцы для ваших данных
  • ОБНОВИТЬ ОТ и присоединиться к CROSS APPLY, чтобы разбить каждую строку и заполнить новые столбцы
  • удалить старый столбец, который содержит несколько элементов данных
  • обновить подпрограммы сохранения и загрузки, чтобы использовать новые столбцы
  • никогда не беспокойтесь о разделении данных снова!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...