Database
 sql >> Database >  >> RDS >> Database

Diversi modi per inserire stringhe delimitate divise in una colonna

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:

  1. Convertire la stringa delimitata in XML, utilizzare XQuery per dividere la stringa e salvarla nella tabella.
  2. Crea una funzione definita dall'utente con valori di tabella per dividere la stringa e inserirla nella tabella.
  3. 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à:

  1. 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)
  2. 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=','
  3. 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:

  1. Approccio diverso per dividere e inserire la stringa delimitata nella tabella.
  2. Il livello alto è il riepilogo della funzione STRING_SPLIT.
  3. Dividi e inserisci una stringa delimitata utilizzando XML e XQuery.
  4. Dividi e inserisci una stringa delimitata utilizzando una funzione con valori di tabella definita dall'utente.