Microsoft SQL Server
STUFF-funktionen
Sök…
parametrar
Parameter | detaljer |
---|---|
character_expression | den befintliga strängen i dina data |
start_position | positionen i character_expression att radera length och sätt sedan in replacement_string |
längd | antalet tecken som ska raderas från character_expression |
replacement_string | sekvensen med tecken att infoga i character_expression |
Grundläggande karaktärersättning med STUFF ()
STUFF()
infogar en sträng i en annan sträng genom att först ta bort ett specificerat antal tecken. Följande exempel raderar "Svr" och ersätter det med "Server". Det här sker genom att ange start_position
och length
på ersättningen.
SELECT STUFF('SQL Svr Documentation', 5, 3, 'Server')
Att utföra detta exempel kommer att resultera i att SQL Server Documentation
returneras istället för SQL Svr Documentation.
Använda FOR XML för att sammanfatta värden från flera rader
En vanlig användning för FOR XML
funktionen är att sammanfoga värdena för flera rader.
Här är ett exempel med kundtabellen :
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH('')),
1, 1, '')
I exemplet ovan används FOR XML PATH(''))
för att sammanfoga e-postadresser med ;
som avgränsare karaktär. Syftet med STUFF
är också att ta bort det ledande ;
från den sammankopplade strängen. STUFF
också implicit den sammanlänkade strängen från XML till varchar.
Obs! Resultatet från exemplet ovan kommer att vara XML-kodat, vilket betyder att det kommer att ersätta <
tecken med <
etc. Om du inte vill ha det här, ändra FOR XML PATH(''))
till FOR XML PATH, TYPE).value('.[1]','varchar(MAX)')
, t.ex.:
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, '')
Detta kan användas för att uppnå ett resultat som liknar GROUP_CONCAT
i MySQL eller string_agg
i PostgreSQL 9.0+, även om vi använder underkällor istället för GROUP BY-aggregat. (Som ett alternativ kan du installera ett användardefinierat aggregat som det här om du letar efter funktionalitet som är närmare den för GROUP_CONCAT
).
Få kolumnnamn separerade med komma (inte en 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
grejer för komma separerade i sql-server
FOR XML PATH
och STUFF
att sammanfoga flera rader i en enda rad:
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;
Grundläggande exempel på STUFF () -funktion.
STUFF (original_uttryck, start, längd, utbyte_uttryck)
STUFF () -funktionen infogar ersättningsuttryck i den angivna startpositionen tillsammans med att ta bort de tecken som anges med parametern Längd.
Select FirstName, LastName,Email, STUFF(Email, 2, 3, '*****') as StuffedEmail From Employee
Att utföra detta exempel kommer att resultera i att den givna tabellen returneras
Förnamn | Efternamn | E-post | StuffedEmail |
---|---|---|---|
Jomes | Jägare | [email protected] | J*****[email protected] |
Shyam | Rathod | [email protected] | S*****[email protected] |
Bagge | Shinde | [email protected] | R ***** hotmail.com |