In questo articolo, illustrerò diversi modi per dividere la stringa delimitata e inserirla in una colonna di una tabella in SQL Server. Puoi farlo usando i seguenti metodi:
- Convertire la stringa delimitata in XML, utilizzare XQuery per dividere la stringa e salvarla nella tabella.
- Crea una funzione definita dall'utente con valori di tabella per dividere la stringa e inserirla nella tabella.
- Dividi la stringa usando la funzione STRING_SPLIT e inserisci l'output in una tabella.
Per dimostrare i metodi di cui sopra, lasciami preparare una configurazione demo. Innanzitutto, creiamo una tabella denominata Employee su DemoDatabase . Per farlo, dobbiamo eseguire la seguente query:
USE DEMODATABASE GO CREATE TABLE EMPLOYEE ( ID INT IDENTITY (1, 1), EMPLOYEE_NAME VARCHAR(MAX) )
Per questa demo, inseriremo i nomi di tutti i dipendenti in una riga e i nomi dei dipendenti saranno separati da una virgola. Per farlo, dobbiamo eseguire la seguente query:
INSERT INTO EMPLOYEE (EMPLOYEE_NAME) VALUES ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')
Esegui la query seguente per verificare che i dati siano stati inseriti nella colonna.
SELECT * FROM EMPLOYEE
Quello che segue è l'output:
Come accennato in precedenza, divideremo la stringa delimitata e la inseriremo in una tabella. Quindi, creeremo una tabella denominata Employee_Detail per memorizzare la stringa delimitata divisa con uno dei metodi precedenti.
Per creare una tabella, eseguire il codice seguente:
USE DEMODATABASE GO CREATE TABLE EMPLOYEE_DETAIL ( ID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, EMPNAME VARCHAR(MAX) NOT NULL )
Metodo 1:usa la funzione STRING_SPLIT per dividere la stringa delimitata
Utilizzeremo STRING_SPLIT funzione per dividere la stringa in una colonna e inserirla in una tabella. Prima di farlo, lascia che ti spieghi la STRING_SPLIT funzione.
Cos'è la funzione STRING_SPLIT
STRING_SPLIT è una funzione con valori di tabella, introdotta in SQL Server 2016. Questa funzione divide la stringa in base al carattere speciale all'interno della riga e restituisce l'output in una tabella separata. Possiamo utilizzare questa funzione sui database che hanno un livello di compatibilità uguale o superiore a 130.
La funzione STRING_SPLIT accetta due parametri e restituisce una tabella con i valori separati. Quella che segue è la sintassi della funzione STRING_SPLIT.
SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)
Nella sintassi sopra, SPECIALCHARACTER è un carattere che verrà utilizzato per separare la stringa di input.
Quello che segue è un semplice esempio della funzione STRING_SPLIT.
DECLARE @STRING VARCHAR(MAX) DECLARE @SPECIALCHARACTER CHAR(1) SET @STRING='NISARG,NIRALI,RAMESH,SURESH' SELECT * FROM STRING_SPLIT (@STRING, ',')
Quello che segue è un output della query:
Come puoi vedere nell'esempio sopra, il nome della colonna di output restituita daSTRING_SPLIT è "valore". Possiamo filtrare l'output restituito dalla funzione utilizzando la clausola WHERE sulla colonna "value" e inoltre possiamo ordinare l'ordine di output utilizzando ORDER BY clausola sulla colonna "valore".
Quello che segue è un esempio.
Ora per inserire una stringa delimitata in una tabella, eseguiremo le seguenti attività:
- Crea una variabile denominata @EmployeeName , che contiene l'output del Dipendente tavolo. Per farlo, esegui il seguente codice:
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE)
- Crea un'altra variabile chiamata @Separator del tipo di dati char. Questa variabile contiene il valore del separatore, che verrà utilizzato per dividere le stringhe in più valori. Per creare la variabile e assegnare il valore al separatore, eseguire il codice seguente:
DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=','
- Ora usa "STRING_SPLIT ” per dividere i valori del nome_dipendente colonna del Dipendente tabella e inserire i valori nella EMPLOYEENAME tavolo. Per farlo, esegui il seguente codice:
INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Quello che segue è l'intero script:
DECLARE @EMPLOYEENAME VARCHAR(MAX) SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME FROM EMPLOYEE) DECLARE @SEPARATOR CHAR(1) SET @SEPARATOR=',' INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT * FROM STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)
Esegui lo script sopra. Lo script inserirà nove righe nella tabella. Una volta eseguito, assicurati che i dati siano stati inseriti in EMPLOYEENAME tavolo. Per questo, esegui la seguente query:
SELECT * FROM EMPLOYEE_DETAIL
Quello che segue è l'output:
Metodo 2:dividere la stringa utilizzando XML e inserire l'output nella tabella
Quando vogliamo dividere la stringa delimitata, possiamo farlo usando le funzioni con valori di tabella. Come sappiamo, le funzioni con valori di tabella definite dall'utente richiedono molte risorse e dovrebbero essere evitate. In questi casi, non abbiamo molte opzioni disponibili. Come ho già detto, il STRING_SPLIT può essere utilizzata per i database che hanno un livello di compatibilità maggiore o uguale a 130. In tali circostanze, è difficile trovare un modo per dividere una stringa delimitata. Abbiamo creato una soluzione semplice ed efficiente per questo compito. Possiamo dividere la stringa usando XML.
Quindi, in questa sezione, spiegherò il codice XML che può essere utilizzato per inserire la stringa delimitata divisa in diverse righe di una colonna.
Ho suddiviso l'intero codice in tre passaggi.
Passaggio 1 :converte la stringa delimitata nel formato XML. Per farlo, esegui il seguente codice:
USE demodatabase go DECLARE @xml AS XML, @QueryData AS VARCHAR(max), @delimiter AS VARCHAR(10) SET @QueryData=(SELECT employee_name FROM employee) SET @delimiter =',' SET @xml = Cast(( '<EMPNAME>' + Replace(@QueryData, @delimiter, '</EMPNAME><EMPNAME>') + '</EMPNAME>' ) AS XML) SELECT @XML
Quello che segue è l'output:
Per visualizzare l'intera stringa XML, fare clic sulla cella come mostrato nell'immagine sopra. Dopo aver fatto clic sulla cella, il file XML dovrebbe apparire come segue:
<EMPNAME>DULCE </EMPNAME> <EMPNAME> MARA </EMPNAME> <EMPNAME> PHILIP </EMPNAME> <EMPNAME> KATHLEEN</EMPNAME> <EMPNAME> NEREIDA </EMPNAME> <EMPNAME> GASTON </EMPNAME> <EMPNAME> ETTA </EMPNAME> <EMPNAME> EARLEAN </EMPNAME> <EMPNAME> VINCENZA</EMPNAME>
Passaggio 2 :Una volta che la stringa è stata convertita in XML, usa X-Query per interrogare il file XML. Per farlo, esegui il seguente codice:
USE DEMODATABASE GO DECLARE @XML AS XML, @STR AS VARCHAR(MAX), @DELIMITER AS VARCHAR(10) SET @STR=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) SET @DELIMITER =',' SET @XML = CAST(( '<EMPNAME>' + REPLACE(@STR, @DELIMITER, '</EMPNAME><EMPNAME>') + '</EMPNAME>' ) AS XML) SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE FROM @XML.NODES('EMPNAME') AS T(N)
Quello che segue è l'output:
Passaggio 3 :inserisci l'output generato dalla query eseguita sopra in Employee_Detail tavolo. Per farlo, esegui il seguente codice:
USE DEMODATABASE GO DECLARE @XML AS XML,@STR AS VARCHAR(MAX),@DELIMITER AS VARCHAR(10) SET @STR=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) SET @DELIMITER =',' SET @XML = CAST(('<EMPNAME>'+REPLACE(@STR,@DELIMITER ,'</EMPNAME><EMPNAME>')+'</EMPNAME>') AS XML) INSERT INTO EMPLOYEE_DETAIL (EMPNAME) SELECT N.VALUE('.', 'VARCHAR(10)') AS VALUE FROM @XML.NODES('EMPNAME') AS T(N) /*Output (9 rows affected) */
Una volta inseriti i dati, eseguire il seguente script per verificare che i dati siano stati inseriti. Esegui la seguente query:
USE DEMODATABASE GO SELECT * FROM EMPLOYEE_DETAIL
Quello che segue è l'output.
Metodo 3:dividere la stringa utilizzando la funzione con valori di tabella e inserire l'output della funzione nella tabella
Questo approccio è tradizionale ed è supportato in tutte le versioni ed edizioni di SQL Server. In questo approccio, creeremo una funzione con valori di tabella definita dall'utente che utilizzerà il ciclo while e le funzioni CHARINDEX e SUBSTRING.
Quello che segue è il codice per creare una funzione:
REATE FUNCTION [DBO].SPLIT_DELIMITED_STRING (@SQLQUERY VARCHAR(MAX), @DELIMITOR CHAR(1)) RETURNS @RESULT TABLE( VALUE VARCHAR(MAX)) AS BEGIN DECLARE @DELIMITORPOSITION INT = CHARINDEX(@DELIMITOR, @SQLQUERY), @VALUE VARCHAR(MAX), @STARTPOSITION INT = 1 IF @DELIMITORPOSITION = 0 BEGIN INSERT INTO @RESULT VALUES (@SQLQUERY) RETURN END SET @SQLQUERY = @SQLQUERY + @DELIMITOR WHILE @DELIMITORPOSITION > 0 BEGIN SET @VALUE = SUBSTRING(@SQLQUERY, @STARTPOSITION, @DELIMITORPOSITION - @STARTPOSITION) IF( @VALUE <> '' ) INSERT INTO @RESULT VALUES (@VALUE) SET @STARTPOSITION = @DELIMITORPOSITION + 1 SET @DELIMITORPOSITION = CHARINDEX(@DELIMITOR, @SQLQUERY, @STARTPOSITION) END RETURN END
Una volta creata la funzione, eseguire la query seguente per dividere la query e inserire l'output in Employee_Detail tabella.
DECLARE @SQLQUERY NVARCHAR(MAX) SET @SQLQUERY=(SELECT EMPLOYEE_NAME FROM EMPLOYEE) INSERT INTO EMPLOYEE_DETAIL SELECT * FROM SPLIT_DELIMITED_STRING(@SQLQUERY, ',')
Una volta inseriti i dati nella tabella, eseguire la query seguente per verificare che i dati siano stati inseriti correttamente
Riepilogo
In questo articolo ho trattato:
- Approccio diverso per dividere e inserire la stringa delimitata nella tabella.
- Il livello alto è il riepilogo della funzione STRING_SPLIT.
- Dividi e inserisci una stringa delimitata utilizzando XML e XQuery.
- Dividi e inserisci una stringa delimitata utilizzando una funzione con valori di tabella definita dall'utente.