Database
 sql >> Baza danych >  >> RDS >> Database

Kilka sposobów na wstawienie dzielonych ciągów rozdzielanych w kolumnie

W tym artykule zademonstruję kilka sposobów dzielenia rozdzielanego ciągu i wstawiania go do kolumny tabeli w SQL Server. Możesz to zrobić za pomocą następujących metod:

  1. Konwertuj rozdzielany ciąg na XML, użyj XQuery do podzielenia ciągu i zapisz go w tabeli.
  2. Utwórz zdefiniowaną przez użytkownika funkcję wartości w tabeli, aby podzielić ciąg i wstawić go do tabeli.
  3. Podziel ciąg znaków za pomocą funkcji STRING_SPLIT i wstaw wynik do tabeli.

Aby zademonstrować powyższe metody, przygotuję konfigurację demonstracyjną. Najpierw utwórzmy tabelę o nazwie Pracownik w Bazie DemoData . W tym celu musimy wykonać następujące zapytanie:

USE DEMODATABASE 
GO 

CREATE TABLE EMPLOYEE 
  ( 
     ID            INT IDENTITY (1, 1), 
     EMPLOYEE_NAME VARCHAR(MAX) 
  )

W tym pokazie wstawimy nazwiska wszystkich pracowników w jednym wierszu, a nazwiska pracowników zostaną oddzielone przecinkiem. W tym celu musimy wykonać następujące zapytanie:

INSERT INTO EMPLOYEE 
            (EMPLOYEE_NAME) 
VALUES      ('DULCE , MARA , PHILIP , KATHLEEN, NEREIDA , GASTON , ETTA , EARLEAN , VINCENZA')

Wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały wstawione do kolumny.

SELECT * 
FROM   EMPLOYEE

Oto wynik:

Jak wspomniałem powyżej, podzielimy oddzielony ciąg i wstawimy go do tabeli. Dlatego utworzymy tabelę o nazwie Employee_Detail do przechowywania rozdzielanego ciągu podzielonego dowolną z powyższych metod.

Aby utworzyć tabelę, wykonaj następujący kod:

USE DEMODATABASE 
GO 
CREATE TABLE EMPLOYEE_DETAIL 
  ( 
     ID      INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED, 
     EMPNAME VARCHAR(MAX) NOT NULL 
  )

Metoda 1:Użyj funkcji STRING_SPLIT, aby podzielić rozdzielany ciąg

Użyjemy STRING_SPLIT funkcja podzielenia ciągu w kolumnie i wstawienia go do tabeli. Zanim to zrobimy, pozwól mi wyjaśnić STRING_SPLIT funkcja.

Co to jest funkcja STRING_SPLIT

STRING_SPLIT to funkcja zwracająca tabelę, wprowadzona w SQL Server 2016. Ta funkcja dzieli ciąg na podstawie znaku specjalnego w wierszu i zwraca dane wyjściowe w osobnej tabeli. Możemy użyć tej funkcji w bazach danych, które mają poziom zgodności równy lub wyższy niż 130.

Funkcja STRING_SPLIT przyjmuje dwa parametry i zwraca tabelę z oddzielonymi wartościami. Poniżej znajduje się składnia funkcji STRING_SPLIT.

SELECT STRING_SPLIT (STRING, SPECIALCHARACTER)

W powyższej składni SPECIALCHARACTER to jeden znak, który zostanie użyty do oddzielenia ciągu wejściowego.

Poniżej znajduje się prosty przykład funkcji STRING_SPLIT.

DECLARE @STRING VARCHAR(MAX) 
DECLARE @SPECIALCHARACTER CHAR(1) 
SET @STRING='NISARG,NIRALI,RAMESH,SURESH' 
SELECT * 
FROM   STRING_SPLIT (@STRING, ',')

Poniżej znajduje się wynik zapytania:

Jak widać w powyższym przykładzie, nazwa kolumny wyjściowej zwrócona przez STRING_SPLIT to „wartość”. Możemy filtrować dane wyjściowe zwracane przez funkcję za pomocą klauzuli WHERE w kolumnie „value”, a także możemy sortować wyniki wyjściowe za pomocą ORDER BY klauzula w kolumnie „wartość”.

Oto przykład.

Teraz, aby wstawić rozdzielany ciąg do tabeli, wykonamy następujące zadania:

  1. Utwórz zmienną o nazwie @EmployeeName , który zawiera dane wyjściowe Pracownika stół. Aby to zrobić, wykonaj następujący kod:
    DECLARE @EMPLOYEENAME VARCHAR(MAX) 
    SET @EMPLOYEENAME =(SELECT EMPLOYEE_NAME 
                        FROM   EMPLOYEE)
  2. Utwórz kolejną zmienną o nazwie @Separator typu danych char. Ta zmienna przechowuje wartość separatora, który zostanie użyty do podzielenia ciągów na wiele wartości. Aby utworzyć zmienną i przypisać wartość do separatora, wykonaj następujący kod:
    DECLARE @SEPARATOR CHAR(1) 
    SET @SEPARATOR=','
  3. Teraz użyj „STRING_SPLIT ” funkcja do dzielenia wartości nazwy_pracownika kolumna Pracownik tabeli i wstaw wartości do NAZWA PRACOWNIKA stół. Aby to zrobić, wykonaj następujący kod:
    INSERT INTO EMPLOYEE_DETAIL 
                (EMPNAME) 
    SELECT * 
    FROM   STRING_SPLIT(@EMPLOYEENAME, @SEPARATOR)

Oto cały skrypt:

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)

Wykonaj powyższy skrypt. Skrypt wstawi dziewięć wierszy do tabeli. Po wykonaniu upewnij się, że dane zostały wstawione do NAZWA PRACOWNIKA stół. W tym celu wykonaj następujące zapytanie:

SELECT * 
FROM   EMPLOYEE_DETAIL

Oto wynik:

Metoda 2:Podziel ciąg znaków za pomocą XML i wstaw wynik do tabeli

Kiedy chcemy podzielić rozdzielany ciąg, możemy to zrobić za pomocą funkcji z wartościami tabelarycznymi. Jak wiemy, funkcje z wartościami przechowywanymi w tabeli zdefiniowane przez użytkownika wymagają dużej ilości zasobów i należy ich unikać. W takich przypadkach nie mamy wielu dostępnych opcji. Jak wspomniałem, STRING_SPLIT Funkcja może być używana dla baz danych, które mają poziom zgodności większy lub równy 130. W takich okolicznościach trudno jest znaleźć sposób na rozdzielenie oddzielonego łańcucha. Stworzyliśmy proste i wydajne rozwiązanie do tego zadania. Możemy podzielić ciąg za pomocą XML.

Tak więc w tej sekcji wyjaśnię kod XML, który może być użyty do wstawienia podzielonego rozdzielanego ciągu w różnych wierszach kolumny.

Cały kod podzieliłem na trzy kroki.

Krok 1 :Konwertuj rozdzielany ciąg na format XML. Aby to zrobić, wykonaj następujący kod:

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

Oto wynik:

Aby wyświetlić cały ciąg XML, kliknij komórkę, jak pokazano na powyższym obrazku. Po kliknięciu komórki plik XML powinien wyglądać następująco:

<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>

Krok 2 :Gdy ciąg zostanie przekonwertowany na XML, użyj X-Query, aby wysłać zapytanie do pliku XML. Aby to zrobić, wykonaj następujący kod:

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)

Oto wynik:

Krok 3 :wstaw wynik wygenerowany przez zapytanie wykonane powyżej do Szczegóły_pracownika stół. Aby to zrobić, wykonaj następujący kod:

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)
 */

Po wstawieniu danych wykonaj następujący skrypt, aby sprawdzić, czy dane zostały wstawione. Wykonaj następujące zapytanie:

USE DEMODATABASE 
GO 
SELECT * 
FROM   EMPLOYEE_DETAIL

Poniżej znajduje się wynik.

Metoda 3:Podziel ciąg znaków za pomocą funkcji z wartościami przechowywanymi w tabeli i wstaw wynik funkcji do tabeli

To podejście jest tradycyjne i jest obsługiwane we wszystkich wersjach i wydaniach SQL Server. W tym podejściu stworzymy zdefiniowaną przez użytkownika funkcję z wartościami w tabeli, która będzie używać pętli while oraz funkcji CHARINDEX i SUBSTRING.

Poniżej znajduje się kod do utworzenia funkcji:

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

Po utworzeniu funkcji wykonaj następujące zapytanie, aby podzielić zapytanie i wstaw dane wyjściowe do Szczegóły_pracownika tabela.

DECLARE @SQLQUERY NVARCHAR(MAX) 
SET @SQLQUERY=(SELECT EMPLOYEE_NAME 
               FROM   EMPLOYEE) 
INSERT INTO EMPLOYEE_DETAIL 
SELECT * 
FROM   SPLIT_DELIMITED_STRING(@SQLQUERY, ',')

Po wstawieniu danych do tabeli wykonaj następujące zapytanie, aby sprawdzić, czy dane zostały wstawione prawidłowo

Podsumowanie

W tym artykule omówiłem:

  1. Inne podejście do dzielenia i wstawiania rozdzielanego ciągu w tabeli.
  2. Wysoki poziom to podsumowanie funkcji STRING_SPLIT.
  3. Podziel i wstaw rozdzielany ciąg za pomocą XML i XQuery.
  4. Podziel i wstaw rozdzielany ciąg za pomocą zdefiniowanej przez użytkownika funkcji z wartościami w tabeli.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przestarzałe funkcje do wyjęcia z przybornika – część 2

  2. Jak wygenerować dane testowe DB

  3. SQL DROP COLUMN dla początkujących

  4. Anonimizuj szczegóły swojego planu natywnie w Eksploratorze planów

  5. Czy ewolucja danych kontaktowych oznacza zmianę bazy danych?