Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288

Табличная функция

07.10.2016, 02:24. Показов 1839. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть таблица с одним столбцом. В функции передаю два строковых массива со словами разделенными запятой, первый строковый массив- имена, а второй- фамилии. Вопрос, как распарсить эти строки так, чтобы они внеслись в нужные столбцы в таблице. Я это сделал, но что-то где-то работает не правильно
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
CREATE TABLE dbo.Numbers (Num INT NOT NULL PRIMARY KEY);
GO
 
WITH NumCTE (Num)
    AS
    (
        SELECT 0
        UNION ALL
        SELECT Num + 1
        FROM NumCTE
        WHERE Num < 30000
    )
 
INSERT INTO dbo.Numbers (Num)
SELECT Num
FROM NumCTE
OPTION (MAXRECURSION 0);
GO
 
CREATE FUNCTION dbo.GetCommaSplit (@String1 nvarchar(MAX), @String2 nvarchar(MAX))
RETURNS TABLE
AS
RETURN
(
WITH Splitter (Num, String1, String2)
AS
(
SELECT Num, SUBSTRING
    (
        @String1,
        Num,
        CASE CHARINDEX(N',', @String1, Num)
        WHEN 0 THEN LEN(@String1) - Num + 1
        ELSE CHARINDEX(N',', @String1, Num) - Num
        END
    ) AS String1,
    SUBSTRING
    (
        @String2,
        Num,
        CASE CHARINDEX(N',', @String2, Num)
        WHEN 0 THEN LEN(@String2) - Num + 1
        ELSE CHARINDEX(N',', @String2, Num) - Num 
        END
    ) AS String2
FROM dbo.Numbers
WHERE Num <= LEN(@String1) AND Num <= LEN(@String2)
AND ((SUBSTRING(@String1, Num - 1, 1) = N',' OR Num = 0) OR (SUBSTRING(@String2, Num - 1, 1) = N',' OR Num = 0))
)
SELECT ROW_NUMBER() OVER (ORDER BY Num) AS Num, RTRIM(LTRIM(String1)) AS first_name, 
        RTRIM(LTRIM(String2)) AS last_name
FROM Splitter
WHERE String1 <> '' AND String2 <> ''
);
GO
 
SELECT Num, first_name, last_name
FROM dbo.GetCommaSplit ('Michael, Tito, Jermaine, Marlon, Rebbie, Jackie, Janet, La
Toya', 'Smith, Johnson, Williams, Davis, Moore, Taylor, Anderson, Thomas');
GO
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2016, 02:24
Ответы с готовыми решениями:

Табличная функция
Здравствуйте, нужно создать многострочную табличнозначную функцию пользователя для расчета процента цены(поле &quot;Цена&quot;) каждой...

Хранимая процедура или табличная функция?
Если мне нужно получить упорядоченую выборку, зависящую от двух параметров, и выборка эта потом будет использоваться в клиентском...

Динамический запрос и внешняя табличная переменная
Добрый день! Подскажите, можно как - нибудь из динамического запроса вытащить данные во внешнюю табличную переменную. Функция...

7
119 / 111 / 47
Регистрация: 09.07.2013
Сообщений: 209
07.10.2016, 10:23
T-SQL
1
2
3
4
5
6
7
8
DECLARE @String1 nvarchar(max) = N'Michael, Tito, Jermaine, Marlon, Rebbie, Jackie, Janet, LaToya'
       ,@String2 nvarchar(max) = N'Smith, Johnson, Williams, Davis, Moore, Taylor, Anderson, Thomas';
DECLARE @Xml1 xml = N'<item>' + REPLACE(@String1, N',', N'</item><item>') + N'</item>'
       ,@Xml2 xml = N'<item>' + REPLACE(@String2, N',', N'</item><item>') + N'</item>';
SELECT q1.f.value('count(for $a in (/item) where $a << . return .)', 'int') + 1
      ,q1.f.value('.', 'nvarchar(100)'), q2.f.value('.', 'nvarchar(100)')
FROM @Xml1.nodes('item') q1(f)
JOIN @Xml2.nodes('item') q2(f) ON q2.f.value('count(for $a in (/item) where $a << . return .)', 'int') = q1.f.value('count(for $a in (/item) where $a << . return .)', 'int')
1
57 / 57 / 10
Регистрация: 27.02.2010
Сообщений: 282
07.10.2016, 11:04
Я здесь отвечал на точно такой же вопрос 3 дня назад

Получение параметров через запятую
1
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
07.10.2016, 11:44
MS SQL 2016:

STRING_SPLIT ( string , separator )
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
07.10.2016, 16:50  [ТС]
Serpentariy, _pva, iap, мне нужно не решение, а указание на то, что я неправильно сделал в своем решении, проблема в том, что если я парсю одну строку, т.е. добавляю один столбец, то все хорошо работает, а при добавлении второй строки для второго столбца работает некорректно
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
07.10.2016, 17:30
Лучший ответ Сообщение было отмечено Nike1995 как решение

Решение

Цитата Сообщение от Nike1995 Посмотреть сообщение
мне нужно не решение, а указание на то, что я неправильно сделал в своем решении
Ну ждите того, у кого возникнет желание отлаживать этот код за вас.

ЗЫ: Вместо того, чтобы написать свою или взять готовую функцию парсинга строки по разделителю в таблицу вида ("Номер элемента", "Элемент"), вызвать ее дважды в вашей GetCommaSplit и соединить результаты по "Номер элемента", вы написали нечто неэффективное и монстрообразное.
1
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
09.10.2016, 01:37  [ТС]
invm, спасибо, Ваше замечание помогло, но тоже не очень корректно работает
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
CREATE TABLE dbo.Numbers (Num INT NOT NULL PRIMARY KEY);
GO
 
WITH NumCTE (Num)
    AS
    (
        SELECT 0
        UNION ALL
        SELECT Num + 1
        FROM NumCTE
        WHERE Num < 30000
    )
 
INSERT INTO dbo.Numbers (Num)
SELECT Num
FROM NumCTE
OPTION (MAXRECURSION 0);
GO
 
CREATE FUNCTION dbo.GetCommaSplit (@String1 nvarchar(MAX))
RETURNS TABLE
AS
RETURN
(
WITH Splitter (Num, String1)
AS
(
SELECT Num, SUBSTRING
    (
        @String1,
        Num,
        CASE CHARINDEX(N',', @String1, Num)
        WHEN 0 THEN LEN(@String1) - Num + 1
        ELSE CHARINDEX(N',', @String1, Num) - Num
        END
    ) AS String1
FROM dbo.Numbers
WHERE Num <= LEN(@String1)
AND (SUBSTRING(@String1, Num - 1, 1) = N',' OR Num = 0)
)
SELECT ROW_NUMBER() OVER (ORDER BY Num) AS Num, RTRIM(LTRIM(String1)) AS first_name
FROM Splitter
WHERE String1 <> ''
);
GO
 
SELECT p.Num, e.Num, p.first_name, e.first_name AS last_name
FROM dbo.GetCommaSplit ('Michael, Tito, Jermaine, Marlon, Rebbie, Jackie, Janet, LaToya') p,
     dbo.GetCommaSplit('Smith, Johnson, Williams, Davis, Moore, Taylor, Anderson, Thomas') e
GO
при соединении таблиц поля второй выводятся несколько раз.
Миниатюры
Табличная функция  
0
3 / 3 / 8
Регистрация: 14.10.2012
Сообщений: 288
09.10.2016, 01:40  [ТС]
invm, исправил))
Спасибо за идею))
SQL
1
2
3
4
SELECT p.Num, p.first_name, e.first_name AS last_name
FROM dbo.GetCommaSplit ('Michael, Tito, Jermaine, Marlon, Rebbie, Jackie, Janet, LaToya') p
LEFT OUTER JOIN 
     dbo.GetCommaSplit('Smith, Johnson, Williams, Davis, Moore, Taylor, Anderson, Thomas') e ON p.Num = e.Num
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2016, 01:40
Помогаю со студенческими работами здесь

Select + табличная функция
Коллеги, доброго дня. Впервые столкнулся с табличными функциями. Есть select с 4 джойнами, который возвращает 100+к записей...

Табличная форма с подтаблицей
Добрый день, уважаемые форумчане! Подскажите, создаю табличную форму и в свойствах формы в пункте &quot;Развернутая подтаблица&quot;...

Табличная форма с кнопками
может у кавота есть пример файла Табличная форма с кнопками.. Поделитесь, пожалуйста

Табличная подчиненная форма
Здравствуйте, У меня есть форма с парой кнопкой и подчиненная форма в виде таблицы. Проблема в том, что я не могу добавить новую...

Табличная форма в Меню
Привет всем! Появилась такая проблемка: создала новое меню, в котором можно открывать различные формы. Когда первый раз заходишь, к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru