Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để chuyển đổi hàm chia thành bảng nội tuyến udf có giá trị trong máy chủ SQL?

Vấn đề là với chức năng phân chia của bạn. Nó đang thực hiện phân tách trong RBAR thời trang. Bạn nên sử dụng bộ chia dựa trên bộ. Đây là DelimitedSplit8k của Jeff Moden, là một trong những bộ tách nhanh nhất hiện có:

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

Lưu ý:Hãy nhớ xem bài viết để biết chức năng được cập nhật

Để biết thêm các chức năng phân chia, hãy đọc các bài viết này của 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. SQL Server 2008 Chuỗi trống so với Không gian

  2. Cú pháp và đóng gói INNER JOIN kỳ lạ

  3. Nhận danh sách các cột được tính toán trong bảng cơ sở dữ liệu (SQL Server)

  4. Cách chọn một số ký tự nhất định từ bên trái hoặc bên phải của chuỗi trong SQL Server

  5. Lợi ích của việc sử dụng ký hiệu vị trí thứ tự trong SQL?