ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Выполнение table-valued функции в SQL: split строки на подстроки

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для работы с табличной функцией (TVF) обращайтесь к ней, как к стандартной таблице, в запросе SELECT. Если у функции dbo.ВашаФункция есть параметр @Параметр, такой запрос будет выглядеть следующим образом:

SQL
Скопировать код
SELECT * FROM dbo.ВашаФункция(@Параметр);

При выполнении встроенных табличных функций указание схемы не обязательно, при условии, что используется схема по умолчанию. В отличие от этого для многоуровневых табличных функций (MSTVF) поле схемы обязательно.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Основы использования TVF

Табличные функции (TVF) в SQL Server создают таблицу, которую можно использовать в FROM в рамках запроса SELECT. Основные аспекты следующие:

  • Название функции: всегда укажите схему функции; в большинстве случаев это dbo, исключением являются встроенные TVF, у которых схему можно опустить.
  • Передача параметров: обязательно передавайте нужные параметры в скобках сразу после имени функции.
  • Выборка данных: использование функции в SELECT * FROM ... позволяет извлекать данные, как при работе с обычной таблицей.

В общих чертах, выборка данных с помощью TVF напоминает выбор телеканала: вы выбираете соответствующую функцию и задаёте параметры для получения нужной информации.

Параметры и конечные наборы данных

Рассмотрим табличную функцию dbo.РазделитьСтроку, ожидающую параметр типа VARCHAR. Эта функция разбивает строку на элементы по запятым и выдаёт результат в виде таблицы, где каждый элемент представляет собой отдельную строку. Для использования этой функции выполните:

SQL
Скопировать код
SELECT * FROM dbo.РазделитьСтроку('яблоко,банан,морковь'); -- Оказывается, SQL тоже может быть "фруктовым салатом"?

Так вы получите таблицу с одной колонкой, содержащей разделённые строки.

При вызове TVF с несколькими параметрами строка запроса будет выглядеть так:

SQL
Скопировать код
SELECT * FROM dbo.ВашаФункция(параметр1, параметр2, параметр3);

Возможные препятствия

При работе с табличными функциями убедитесь, что:

  • Вы передали все требуемые параметры – иначе возникнут ошибки.
  • Вы не путаете TVF с скалярными функциями, которые возвращают одиночное значение и используются иначе.
  • Вы знаете, как работают операторы cross apply и outer apply. Они позволяют более гибко интегрировать TVF с другими таблицами, в отличие от стандартных JOIN.

Визуализация

Работу с TVF можно сравнить с выбором индивидуального блюда в автомате:

Markdown
Скопировать код
Меню (TVF) 📜: [🍔, 🍟, 🥗, 🥤]
Вы выбираете (Параметры) 🎛️: {🍟,🥤}

Поэтому вы получите желаемое:

SQL
Скопировать код
SELECT * FROM dbo.ВашаМенюФункция('🍟','🥤');

Итого получим:

Markdown
Скопировать код
👨‍🍳🛠️🍟🥤 = Автомат подал вам идеальное сочетание 🍟 и 🥤!

Продвинутое использование

Помимо базовых запросов SELECT, TVF можно использовать в более сложных сценариях:

  • Объединение с таблицами: вы можете связать TVF с другими таблицами для выполнения сложных запросов:
SQL
Скопировать код
SELECT t.*, f.названиеСтолбца
FROM некаяТаблица AS t
JOIN dbo.ВашаФункция(@Параметр) AS f
ON t.некийСтолбец = f.соответствующийСтолбец; -- Когда таблицы SQL Server взаимодействуют друг с другом...
  • Учёт производительности: TVF могут работать медленно с большими объёмами данных. Оптимизируйте индексы или перепишите логику TVF для повышения производительности.
  • Использование операторов 'Apply': CROSS APPLY и OUTER APPLY позволяют интегрировать TVF "порядочно", словно художник, который аккуратно обрабатывает каждый мазок кисти. Это особенно ценно, когда каждый элемент, полученный из другого запроса, требует обработки в функции.
SQL
Скопировать код
SELECT t.*, f.*
FROM некаяТаблица AS t
CROSS APPLY dbo.ВашаФункция(t.названиеСтолбца) AS f; -- Незаметный союз таблиц и функций.

Полезные материалы

  1. CREATE FUNCTION (Transact-SQL) – SQL Server | Microsoft Learn — Познакомьтесь с созданием функций с помощью официального руководства Microsoft.
  2. Table Valued Functions – SQLServerCentral Forums — Обсуждение и советы по TVF от сообщества специалистов SQL.
  3. Find All Columns in SQL Server Database with Default Values — Практические рекомендации по работе с колонками, имеющими значения по умолчанию в SQL; всегда можно узнать что-то новое, выходя за рамки привычной практики.