Ответ 1
Цель
Зачем использовать недокументированные master..spt-values
Sybase и, следовательно, его сын-ублюдок MS SQL, предоставляют различные функции и функции для продукта, которые реализуются в системных процедурах (в отличие от двоичных файлов, таких как sqlserver, которые запускаются как служба). Эти процедуры процедур системы написаны в коде SQL и называются sp_%.
За исключением некоторых секретных внутренних элементов, они имеют те же ограничения и потребности, что и любой другой код SQL. Они являются частью продукта Sybase ASE или SQL Server. Таким образом, они не обязаны документировать его; и внутренние биты не могут быть разумно помечены как "недокументированные".
master..spt_values
содержит все различные биты и куски, которые требуются указанным системным процедурам в таблице SQL, для создания различных отчетов. sp
означает системную процедуру; spt
означает таблицы для системных процедур; и, конечно, values
- это контент.
Таблицы поиска
Что такое (значение) Type = 'P'
Люди часто описывают spt_values
как "ненормированные", но это неправильный термин. Правильный термин складывается или упаковывается. Это 26 или около того логических таблиц Lookup, каждая из которых красиво Normalized, сложенная в одну физическую таблицу, с столбцом Type
, чтобы различать логические таблицы.
Теперь в нормальной базе данных это будет грубая ошибка (просто посмотрите ответы на "одну таблицу поиска или много" ). Но в каталоге сервера, желательно, он заменяет 26 физических таблиц.
-
"L" означает для поиска LockType; "V" означает "Поиск по DeviceType" (V является коротким для устройства на всем сервере); и т.д. Тип "P2" содержит побитовые ординалы, для расширения бит, которые упакованы в INT.
-
Требуется набор последовательных чисел в пределах известных границ, доступных в форме таблицы SQL, для выполнения Проекции, которые должны выполняться многими системными процедурами. Тип "P" - это список последовательных чисел от 0 до 2047.
-
Термин Проекция используется здесь как технически точный смысл, естественный логический смысл, а не значение реляционной алгебры, что является неестественным.
Таким образом, для spt_values,
существует только одна цель: содержать 26 сложенных, иначе разделенных, справочных таблиц и одну таблицу проекций.
Расширение
Обычное использование spt_values
тогда, как обычная таблица поиска или ссылки или ENUM
. Во-первых, значения Lookup:
SELECT * -- list Genders
FROM Gender
Он используется таким же образом, что Person имеет гендерный код, который необходимо развернуть (очень расширены, эти причудливые дни):
SELECT P.*, -- list Person
G.Name -- expand GenderCode to Name
FROM Person P
JOIN Gender G
ON P.GenderCode = G.GenderCode
Eg. sp_lock
создает отчет о активных блокировках, отображая типы блокировки в виде имен строк. Но master..syslocks
содержит типы блокировок как числа, он не содержит этих имен; и если бы это было так, это был бы плохо денормализованный стол! Если вы выполните запрос (код Sybase ASE, вам придется преобразовать):
SELECT * -- list LockTypes
FROM master..spt_values
WHERE type = "L"
вы увидите 66 номеров и имен LockType в таблице Lookup. Это позволяет sp_lock
выполнять простой код наподобие Person:: Gender выше:
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
Проекция
Что такое (значение) Type = 'P'?
Что такое Projection и как оно используется?
Скажем, например, вместо активных блокировок, созданных запросом выше, вам нужен список всех 66 LockTypes, показывающий количество активных блокировок (или Null). Вам не нужен курсор или цикл WHILE
. Мы можем спроектировать таблицу LookType Lookup, подсчитывая количество активных блокировок:
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"
Существует несколько методов, то есть один. Другой метод - использовать производную таблицу вместо подзапроса. Но вам все равно нужна проекция.
Это обычно означает, что spt_values
используется для расширения или проецирования. Теперь, когда вы знаете, что он есть, вы тоже можете его использовать. Он безопасен (в базе данных master
) и используется практически всеми системными процедурами, что означает, что системные процедуры не могут работать без него.
для разделения столбца?
А, вы не понимаете код "Разделить один столбец CSV на несколько строк".
-
Забудьте о
spt_values
на мгновение и снова проверьте этот код. Ему просто нужен список последовательных номеров, так что in может пройти через список значений в столбце CSV, байт по байту. Код активируется только для каждого байта, который представляет собой запятую или конец строки. -
Где получить набор последовательных чисел в виде таблицы SQL, а не CREATing один с нуля и INSERTING? Почему,
master..spt_values
, конечно. Если вы знаете, что он есть. -
(Вы можете немного узнать о внутренних компонентах ASE или SQL Server, просто прочитав код хранимых процедур системы.)
-
Обратите внимание, что любое поле CSV в одном столбце является грубой ошибкой нормализации, оно разбивает 2NF (содержит повторяющиеся значения) и 1NF (не является атомом). Обратите внимание, что это не упакован или не сложен, это повторяющаяся группа, она не нормирована. Одним из многих негативных последствий такой грубой ошибки является использование простого SQL для перемещения повторяющейся группы в виде строк, поэтому для определения и извлечения содержимого ненормированного поля CSV необходимо использовать сложный код. Здесь
spt_values P
предоставляет вектор для этого сложного кода, облегчая его.
Какая польза от этого?
Думаю, я ответил на это. Если у вас его нет, каждая системная процедура, требующая списка номеров, должна будет СОЗДАТЬ временную таблицу; и ВСТАВИТЬ строки в него; перед запуском его кода. Конечно, не нужно выполнять эти шаги, делает процедуры системы намного быстрее.
Теперь, когда вам нужно выполнить проецирование, например. даты календаря в будущем или что-то еще, вы можете использовать spt_values
вместо того, чтобы каждый раз создавать свою собственную временную таблицу (или создавать свою собственную постоянную таблицу и поддерживать ее).