Microsoft SQL Server
Функция STUFF
Поиск…
параметры
параметр | подробности |
---|---|
character_expression | существующая строка в ваших данных |
начальная_позиция | положение в character_expression выражении для удаления length а затем вставить replacement_string |
длина | количество символов для удаления из character_expression |
replacement_string | последовательность символов для вставки в character_expression |
Замена основного символа с помощью STUFF ()
Функция STUFF()
вставляет строку в другую строку, сначала удаляя указанное количество символов. В следующем примере удаляется «Svr» и заменяется на «Сервер». Это происходит, указывая start_position
и length
замены.
SELECT STUFF('SQL Svr Documentation', 5, 3, 'Server')
Выполнение этого примера приведет к возврату SQL Server Documentation
вместо SQL Svr Documentation.
Использование FOR XML для объединения значений из нескольких строк
Одним из распространенных способов использования функции FOR XML
является конкатенация значений нескольких строк.
Вот пример использования таблицы Customers :
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH('')),
1, 1, '')
В приведенном выше примере FOR XML PATH(''))
используется для конкатенации адресов электронной почты, используя ;
как символ разделителя. Кроме того, целью STUFF
является удаление ведущего ;
из конкатенированной строки. STUFF
также неявно бросает конкатенированную строку из XML в varchar.
Примечание: результат из приведенного выше примера будет XML - кодировке, то есть он будет заменить <
символы с <
и т. д. Если вы этого не хотите, измените FOR XML PATH(''))
в FOR XML PATH, TYPE).value('.[1]','varchar(MAX)')
, например:
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH, TYPE).value('.[1]','varchar(900)'),
1, 1, '')
Это можно использовать для достижения результата, аналогичного GROUP_CONCAT
в MySQL или string_agg
в PostgreSQL 9.0+, хотя мы используем подзапросы вместо агрегатов GROUP BY. (В качестве альтернативы вы можете установить определяемый пользователем агрегат, такой как этот, если вы ищете функциональность, близкую к функциональности GROUP_CONCAT
).
Получить имена столбцов, разделенные запятой (не список)
/*
The result can be use for fast way to use columns on Insertion/Updates.
Works with tables and views.
Example: eTableColumns 'Customers'
ColumnNames
------------------------------------------------------
Id, FName, LName, Email, PhoneNumber, PreferredContact
INSERT INTO Customers (Id, FName, LName, Email, PhoneNumber, PreferredContact)
VALUES (5, 'Ringo', 'Star', '[email protected]', NULL, 'EMAIL')
*/
CREATE PROCEDURE eTableColumns (@Table VARCHAR(100))
AS
SELECT ColumnNames =
STUFF( (SELECT ', ' + c.name
FROM
sys.columns c
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
WHERE
c.object_id = OBJECT_ID( @Table)
FOR XML PATH, TYPE).value('.[1]','varchar(2000)'),
1, 1, '')
GO
материал для запятой, разделенный на сервере sql
FOR XML PATH
и STUFF
объединить несколько строк в одну строку:
select distinct t1.id,
STUFF(
(SELECT ', ' + convert(varchar(10), t2.date, 120)
FROM yourtable t2
where t1.id = t2.id
FOR XML PATH (''))
, 1, 1, '') AS date
from yourtable t1;
Основной пример функции STUFF ().
STUFF (Original_Expression, Start, Length, Replacement_expression)
Функция STUFF () вставляет значение Replacement_expression в указанной начальной позиции вместе с удалением символов, заданных параметром Length.
Select FirstName, LastName,Email, STUFF(Email, 2, 3, '*****') as StuffedEmail From Employee
Выполнение этого примера приведет к возврату данной таблицы
Имя | Фамилия | Эл. адрес | StuffedEmail |
---|---|---|---|
Jomes | охотник | [email protected] | J*****[email protected] |
Shyam | rathod | [email protected] | S*****[email protected] |
Баран | Shinde | [email protected] | R ***** hotmail.com |