Microsoft SQL Server
La funzione STUFF
Ricerca…
Parametri
Parametro | Dettagli |
---|---|
character_expression | la stringa esistente nei tuoi dati |
posizione di partenza | la posizione in character_expression per eliminare la length e quindi inserire la replacement_string |
lunghezza | il numero di caratteri da eliminare da character_expression |
replacement_string | la sequenza di caratteri da inserire in character_expression |
Sostituzione base dei caratteri con STUFF ()
La funzione STUFF()
inserisce una stringa in un'altra stringa eliminando prima un numero specificato di caratteri. Nell'esempio seguente, cancella "Svr" e lo sostituisce con "Server". Ciò accade specificando la start_position
e la length
della sostituzione.
SELECT STUFF('SQL Svr Documentation', 5, 3, 'Server')
L'esecuzione di questo esempio comporterà la restituzione della SQL Server Documentation
anziché della SQL Svr Documentation.
Utilizzo di FOR XML per concatenare valori da più righe
Un uso comune per la funzione FOR XML
consiste nel concatenare i valori di più righe.
Ecco un esempio utilizzando la tabella Clienti :
SELECT
STUFF( (SELECT ';' + Email
FROM Customers
where (Email is not null and Email <> '')
ORDER BY Email ASC
FOR XML PATH('')),
1, 1, '')
Nell'esempio sopra, FOR XML PATH(''))
viene utilizzato per concatenare gli indirizzi di posta elettronica, utilizzando ;
come il carattere delimitatore. Inoltre, lo scopo di STUFF
è quello di rimuovere il leader ;
dalla stringa concatenata. STUFF
esegue anche il casting implicito della stringa concatenata da XML a varchar.
Nota: il risultato dell'esempio precedente sarà codificato in XML, il che significa che sostituirà <
caratteri con <
ecc. Se non lo desideri, modifica FOR XML PATH(''))
in FOR XML PATH, TYPE).value('.[1]','varchar(MAX)')
, ad esempio:
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, '')
Questo può essere usato per ottenere un risultato simile a GROUP_CONCAT
in MySQL o string_agg
in PostgreSQL 9.0+, sebbene usiamo subquery invece di aggregati GROUP BY. (In alternativa, puoi installare un aggregato definito dall'utente come questo se stai cercando funzionalità più vicine a quelle di GROUP_CONCAT
).
Ottieni i nomi delle colonne separati da virgola (non una 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
roba per la virgola separata nel server sql
FOR XML PATH
e STUFF
per concatenare più righe in una singola riga:
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;
Esempio di base della funzione STUFF ().
STUFF (Original_Expression, Start, Length, Replacement_expression)
La funzione STUFF () inserisce Replace_expression, nella posizione iniziale specificata, insieme alla rimozione dei caratteri specificati usando il parametro Length.
Select FirstName, LastName,Email, STUFF(Email, 2, 3, '*****') as StuffedEmail From Employee
L'esecuzione di questo esempio comporterà la restituzione della tabella indicata
Nome di battesimo | Cognome | StuffedEmail | |
---|---|---|---|
Jomes | Cacciatore | [email protected] | J*****[email protected] |
Shyam | Rathod | [email protected] | S*****[email protected] |
ariete | shinde | [email protected] | R ***** hotmail.com |