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ố và 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ó).