Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa mengonversi fungsi split ke tabel sebaris yang bernilai udf di SQL server?

Masalahnya adalah dengan fungsi split Anda. Itu melakukan pemisahan dalam RBAR mode. Anda harus menggunakan splitter berbasis set. Berikut adalah DelimitedSplit8k oleh Jeff Moden, yang merupakan salah satu splitter tercepat yang pernah ada:

CREATE FUNCTION [dbo].[DelimitedSplit8K](
    @pString VARCHAR(8000), @pDelimiter CHAR(1)
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN
WITH E1(N) AS (
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
)
,E2(N) AS (SELECT 1 FROM E1 a, E1 b)
,E4(N) AS (SELECT 1 FROM E2 a, E2 b)
,cteTally(N) AS(
    SELECT TOP (ISNULL(DATALENGTH(@pString), 0)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
,cteStart(N1) AS(
    SELECT 1 UNION ALL 
    SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString, t.N, 1) = @pDelimiter
),
cteLen(N1, L1) AS(
SELECT 
    s.N1,
    ISNULL(NULLIF(CHARINDEX(@pDelimiter, @pString, s.N1),0) - s.N1, 8000)
FROM cteStart s
)
SELECT 
    ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
    Item       = SUBSTRING(@pString, l.N1, l.L1)
FROM cteLen l

Catatan:Pastikan untuk membaca artikel untuk fungsi yang diperbarui

Untuk fungsi split lainnya, baca artikel ini oleh Sir Aaron Bertrand:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Linq to SQL - Gagal memperbarui

  2. Mendapatkan minimal dua nilai dalam SQL

  3. Pivot Beberapa Kolom di T-SQL

  4. Bagaimana saya bisa mendapatkan 50% terbawah dari kueri pemilihan di SQL server?

  5. Cara mendapatkan baris acak dari Tabel SQL Server - Tutorial SQL Server / TSQL Bagian 117