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 |