Microsoft SQL Server
Funkcja STUFF
Szukaj…
Parametry
Parametr | Detale |
---|---|
wyrażenie_wyrażeniowe | istniejący ciąg w twoich danych |
pozycji startowej | pozycja w character_expression aby usunąć length a następnie wstawić łańcuch_ replacement_string |
długość | liczba znaków do usunięcia z character_expression |
zamiennik_ciągów | sekwencja znaków do wstawienia w character_expression |
Podstawowa zamiana znaków na STUFF ()
Funkcja STUFF()
wstawia ciąg do innego ciągu, usuwając najpierw określoną liczbę znaków. Poniższy przykład usuwa „Svr” i zastępuje go „Server”. Dzieje się tak, określając pozycję start_position
i length
zamiany.
SELECT STUFF('SQL Svr Documentation', 5, 3, 'Server')
Wykonanie tego przykładu spowoduje zwrócenie SQL Server Documentation
zamiast SQL Server Documentation
SQL Svr Documentation.
Używanie FOR XML do łączenia wartości z wielu wierszy
Jednym z powszechnych zastosowań funkcji FOR XML
jest łączenie wartości wielu wierszy.
Oto przykład z wykorzystaniem tabeli Klienci :
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH('')),
1, 1, '')
W powyższym przykładzie do konkatenacji adresów e-mail użyto FORMATU FOR XML PATH(''))
;
jako znak separatora. Ponadto celem STUFF
jest usunięcie wiodącego ;
z połączonego łańcucha. STUFF
pośrednio rzutuje także skonkatenowany ciąg znaków z XML na varchar.
Uwaga: wynik z powyższego przykładu będzie zakodowany w formacie XML, co oznacza, że zamieni <
znaki na <
itp. Jeśli nie chcesz tego, zmień FOR XML PATH(''))
na FOR XML PATH, TYPE).value('.[1]','varchar(MAX)')
, np .:
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, '')
Można to wykorzystać do osiągnięcia wyniku podobnego do GROUP_CONCAT
w MySQL lub string_agg
w PostgreSQL 9.0+, chociaż używamy podkwerend zamiast agregacji GROUP BY. (Alternatywnie możesz zainstalować agregat zdefiniowany przez użytkownika, taki jak ten, jeśli szukasz funkcji zbliżonej do funkcji GROUP_CONCAT
).
Uzyskaj nazwy kolumn oddzielone przecinkiem (nie lista)
/*
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
rzeczy dla przecinka oddzielone na serwerze sql
FOR XML PATH
i STUFF
aby połączyć wiele wierszy w jeden wiersz:
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;
Podstawowy przykład funkcji STUFF ().
STUFF (Original_Expression, Start, Length, Replacement_expression)
Funkcja STUFF () wstawia wyrażenie_wyrażeniowe w określonej pozycji początkowej wraz z usuwaniem znaków określonych za pomocą parametru Długość.
Select FirstName, LastName,Email, STUFF(Email, 2, 3, '*****') as StuffedEmail From Employee
Wykonanie tego przykładu spowoduje zwrócenie podanej tabeli
Imię | Nazwisko | StuffedEmail | |
---|---|---|---|
Jomes | Łowca | [email protected] | J*****[email protected] |
Shyam | rathod | [email protected] | S*****[email protected] |
Baran | shinde | [email protected] | R ***** hotmail.com |