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

Tại sao (và cách) chia cột bằng cách sử dụng master..spt_values?

Mục đích

Tại sao lại sử dụng master..spt-values không có tài liệu

Sybase, và do đó là đứa con hoang của nó là MS SQL, cung cấp các tính năng và chức năng khác nhau cho sản phẩm, được triển khai trong các thủ tục hệ thống (trái ngược với các mã nhị phân như sqlserver, được khởi động như một dịch vụ). Các quy trình thủ tục hệ thống này được viết bằng mã SQL và được đặt tên là sp_%. Ngoại trừ một số nội dung bí mật, chúng có những hạn chế và nhu cầu giống như bất kỳ mã SQL nào khác. Chúng là một phần của sản phẩm Sybase ASE hoặc SQL Server. Do đó, chúng không bị bắt buộc để ghi lại nó; và các bit bên trong không thể được gắn nhãn hợp lý là "không có tài liệu".

master..spt_values chứa tất cả các bit và phần khác nhau mà các thủ tục hệ thống nói trên cần, trong một bảng SQL, để tạo ra các báo cáo khác nhau. sp có nghĩa là thủ tục hệ thống; spt có nghĩa là các bảng cho các thủ tục hệ thống; và tất nhiên là các giá trị values là nội dung.

Bảng tra cứu

(ý nghĩa của) Type ='P' là gì

Mọi người thường mô tả spt_values là "de-normalized", nhưng đó là thuật ngữ không chính xác. Thuật ngữ chính xác là gấp lại hoặc đóng gói . Đó là 26 bảng Tra cứu hợp lý hoặc tương tự, mỗi bảng được Chuẩn hóa đẹp mắt, được xếp lại thành một bảng vật lý, với Type để phân biệt các bảng logic.

Bây giờ trong một cơ sở dữ liệu bình thường, đó sẽ là một lỗi lớn (chỉ cần xem các câu trả lời cho "một hoặc nhiều bảng tra cứu"). Nhưng trong danh mục máy chủ, điều đáng mong đợi là nó thay thế 26 bảng vật lý.

  • "L" là viết tắt của LockType Lookup; "V" là viết tắt của DeviceType Lookup (V là viết tắt của Device trên toàn máy chủ); v.v ... Loại "P2" chứa thứ tự theo chiều bit, để mở rộng các bit được đóng gói thành INT.

  • Cần phải có một tập hợp các số liên tiếp trong các giới hạn đã biết, có sẵn dưới dạng bảng SQL, để thực hiện Phép chiếu, mà nhiều thủ tục hệ thống phải thực hiện. Loại "P" là danh sách các số liên tiếp từ 0 đến 2047.

  • Thuật ngữ Phép chiếu được sử dụng ở đây như là ý nghĩa chính xác về mặt kỹ thuật, nghĩa logic tự nhiên, không phải nghĩa đại số quan hệ, điều này không tự nhiên.

Do đó, chỉ có một mục đích cho spt_values, để chứa 26 bảng tham chiếu được gấp lại, nếu không thì riêng biệt, và một bảng chiếu.

Mở rộng

Việc sử dụng spt_values thông thường sau đó, giống như một Tra cứu hoặc Tham chiếu thông thường hoặc ENUM bàn. Đầu tiên, các giá trị Tra cứu:

    SELECT *                    -- list Genders
        FROM Gender 

Nó được sử dụng giống như cách mà Người có Mã giới tính cần được mở rộng (rất mở rộng, những ngày kỳ lạ này):

    SELECT  P.*,                -- list Person
            G.Name              -- expand GenderCode to Name
        FROM Person P
        JOIN Gender G
            ON P.GenderCode = G.GenderCode

Ví dụ. sp_lock tạo báo cáo về các khóa đang hoạt động, hiển thị các loại khóa dưới dạng chuỗi tên . Nhưng master..syslocks chứa các loại khóa dưới dạng số , nó không chứa những tên ; và nếu nó xảy ra, nó sẽ là một bảng không chuẩn hóa xấu! Nếu bạn thực hiện truy vấn (mã Sybase ASE, bạn sẽ phải chuyển đổi):

    SELECT *                    -- list LockTypes
        FROM master..spt_values 
        WHERE type = "L"

bạn sẽ nhận thấy 66 LockType số tên trong bảng Tra cứu. Điều đó cho phép sp_lock để thực thi mã đơn giản như Person ::Gender ở trên:

    SELECT  spid,               -- list Active Locks
            DB_NAME(dbid),
            OBJECT_NAME(id, dbid),
            v.name,             -- expand lock name
            page,
            row
    FROM master..syslocks   L,
         master..spt_values LT
    WHERE L.type = LT.number    -- 
    AND   type = "L"            -- LockType Lookup table
    ORDER by 1, 2, 3, 4, 5, 6   -- such that perusal is easy

Phép chiếu

(ý nghĩa của) Type ='P' là gì?

Projection là gì và nó được sử dụng như thế nào?

Ví dụ:giả sử thay vì các khóa đang hoạt động được tạo bởi truy vấn ở trên, bạn muốn có một danh sách tất cả 66 LockTypes, hiển thị số lượng khóa đang hoạt động (hoặc Null). Bạn không cần con trỏ hoặc WHILE vòng. Chúng tôi có thể Dự án bảng LockType Lookup, từ thông qua số lượng khóa hoạt động:

    SELECT  LT.name,            -- list LockTypes
            [Count] = (         -- with count
        SELECT COUNT(*)
            FROM master..syslocks
            WHERE type = LT.number
                )
        FROM master..spt_values LT
        WHERE type = "L"

Có một số phương pháp, đó chỉ là một. Một phương pháp khác là sử dụng Bảng gốc thay vì Truy vấn con. Nhưng bạn vẫn cần Phép chiếu.

Đó thường là những gì spt_values được sử dụng cho, Mở rộng hoặc Chiếu. Bây giờ bạn biết nó ở đó, bạn cũng có thể sử dụng nó. Nó an toàn (trong master cơ sở dữ liệu) và được hầu như tất cả các thủ tục hệ thống sử dụng, có nghĩa là các thủ tục hệ thống không thể chạy nếu không có nó.

để tách một cột?

À, bạn chưa hiểu mã "Tách một cột CSV thành nhiều hàng".

  • Quên về spt_values trong giây lát và kiểm tra lại mã đó. Nó chỉ cần một danh sách các số liên tiếp, để có thể bước qua danh sách các giá trị trong cột CSV, từng byte. Mã chỉ được kích hoạt cho mỗi byte là dấu phẩy hoặc cuối chuỗi.

  • Lấy một tập hợp các số liên tiếp ở đâu dưới dạng một bảng SQL, thay vì TẠO một tập hợp từ đầu và CHÈN vào nó? Tại sao, master..spt_values tất nhiên rồi. Nếu bạn biết nó ở đó.

  • (Bạn có thể tìm hiểu một chút về nội bộ của ASE hoặc SQL Server, chỉ bằng cách đọc mã của các thủ tục được lưu trữ trong hệ thống.)

  • Lưu ý rằng bất kỳ trường CSV nào trong một cột đều là lỗi Chuẩn hóa tổng, nó phá vỡ 2NF (chứa các giá trị lặp lại) và 1NF (không phải nguyên tử). Lưu ý, đó là không được đóng gói hoặc gấp lại, nó là một nhóm lặp lại, nó là chưa chuẩn hóa. Một trong nhiều hậu quả tiêu cực của lỗi tổng thể như vậy là thay vì sử dụng SQL đơn giản để điều hướng nhóm lặp lại dưới dạng các hàng, người ta phải sử dụng mã phức tạp để xác định và trích xuất nội dung của trường CSV chưa được chuẩn hóa. Đây spt_values P cung cấp một vectơ cho mã phức tạp đó, làm cho nó dễ dàng hơn.

Lợi ích của nó là gì?

Tôi nghĩ rằng tôi đã trả lời rằng. Nếu bạn không có nó, mọi thủ tục hệ thống yêu cầu danh sách các Số sẽ phải TẠO một bảng tạm thời; và CHÈN các hàng vào đó; trước khi chạy mã của nó. Tất nhiên, việc không phải thực hiện các bước đó sẽ làm cho quy trình hệ thống nhanh hơn nhiều.

Bây giờ, khi bạn cần thực hiện một Phép chiếu, ví dụ:ngày lịch trong tương lai hoặc bất cứ thứ gì, bạn có thể sử dụng spt_values , thay vì phải tạo bảng tạm thời của riêng bạn mỗi lần (hoặc tạo bảng vĩnh viễn riêng tư của bạn và duy trì nó).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sao chép các hàng dựa trên giá trị cột trong mỗi hàng

  2. Các hoạt động CRUD của SQL Server

  3. Tránh đưa vào SQL mà không có tham số

  4. SQL Server SELECT trong đó bất kỳ cột nào chứa 'x'

  5. Truy vấn PIVOT động của SQL Server?