Для чего нужен тип данных SYSNAME SQL Server? BOL говорит:
Тип данных sysname используется для столбцов таблицы, переменных и параметров хранимых процедур, в которых хранятся имена объектов.
но я действительно этого не понимаю. Есть ли вариант использования, который вы можете предоставить?
sql
sql-server
tsql
types
jrara
источник
источник
Ответы:
sysname
- это встроенный тип данных, ограниченный 128 символами Unicode, который, IIRC, используется в основном для хранения имен объектов при создании скриптов. Его ценность не может бытьNULL
Это в основном то же самое, что и использование
nvarchar(128) NOT NULL
РЕДАКТИРОВАТЬ
Как отметил @Jim в комментариях, я не думаю, что есть действительно бизнес-кейс, который вы бы использовали,
sysname
если честно. Он в основном используется Microsoft при создании внутреннегоsys
таблиц, хранимых процедур и т. Д. В SQL Server.Например, выполнив,
Exec sp_help 'sys.tables'
вы увидите, что столбецname
определен так,sysname
потому что значение this на самом деле является объектом (таблицей).Я бы слишком беспокоился об этом.
Также стоит отметить, что для тех людей, которые все еще используют SQL Server 6.5 и ниже (есть ли еще люди, использующие его?), Встроенный тип
sysname
является эквивалентомvarchar(30)
Документация
sysname
определяется в документации дляnchar
иnvarchar
в разделе примечаний:Чтобы прояснить приведенные выше замечания, по умолчанию sysname определено, так как
NOT NULL
его можно определить как допускающее значение NULL. Также важно отметить, что точное определение может варьироваться в зависимости от экземпляра SQL Server.Использование специальных типов данных
Дополнительную информацию о
sysname
разрешении или запрещенииNULL
значений можно найти здесь https://stackoverflow.com/a/52290792/300863Тот факт, что это значение по умолчанию (НЕ NULL) не гарантирует, что это будет так!
источник
sysname
для прямой (и обратной) совместимости в своих сценариях.nvarchar(max)
ненулевые в SP, но они отображаются как asysname
в таблицах sys.sys.types
этимnvarchar(256) not null
. Обратите внимание, что ID системного типа = 231 (nvarchar). В настоящее время он работает как псевдоним типа в TDS; первый идентификатор псевдонима - 256, что соответствуетsysname
. Что касается использования:sysname
используется в информационных схемах.Если вам когда-либо понадобится создать динамический sql, его можно использовать в
sysname
качестве типа данных для переменных, содержащих имена таблиц, имена столбцов и имена серверов.источник
Просто к вашему сведению ....
select * from sys.types where system_type_id = 231
дает вам две строки.(я еще не уверен, что это значит, но я на 100% уверен, что прямо сейчас это испортило мой код)
edit: я предполагаю, что это означает, что вы должны присоединиться к user_type_id в этой ситуации (моя ситуация) или, возможно, к user_type_id и th esystem_type_id
Этот запрос:
выходы:
и это:
дает вам это:
источник
sys.types
содержит созданные пользователем типы . Если вы это сделаете, уcreate type MyInt from int
вас будет две строки сsystem_type_id = 56
. Другой дублированный по умолчанию - 240, который является системным типом для иерархии, геометрии и географии.where typ.name<>'sysname'
или это будет иметь какие-то другие последствия, о которых я не подозреваю?Позвольте мне перечислить ниже вариант использования. Надеюсь, поможет. Здесь я пытаюсь найти владельца таблицы Stud_dtls из БД «Студенты». Как упоминал Микаэль, sysname можно использовать, когда необходимо создать динамический sql, которому нужны переменные, содержащие имена таблиц, имена столбцов и имена серверов. Просто подумал о том, чтобы привести простой пример, чтобы дополнить его точку зрения.
источник
sysname
используетсяsp_send_dbmail
хранимой процедурой, которая «отправляет сообщение электронной почты указанным получателям» и находится в базе данных msdb.Согласно Microsoft ,
источник
FWIW, вы можете передать имя таблицы таким полезным системным SP, если хотите исследовать базу данных таким образом:
источник
Другой вариант использования - использование функциональности SQL Server 2016+ для
AT TIME ZONE
В приведенном ниже заявлении будет возвращена дата, преобразованная в GMT.
Если вы хотите передать часовой пояс в качестве переменной, скажите:
тогда эта переменная должна иметь тип
sysname
(объявление ее какvarchar
вызовет ошибку).источник
Везде, где вы хотите сохранить имя объекта для использования сценариями обслуживания базы данных. Например, сценарий удаляет старые строки из определенных таблиц, в которых есть столбец даты. Он настроен с помощью таблицы, которая дает имя таблицы, имя столбца для фильтрации и сколько дней истории нужно хранить. Другой сценарий выгружает определенные таблицы в файлы CSV и снова настраивается с таблицей, в которой перечислены таблицы для дампа. Эти таблицы конфигурации могут использовать
sysname
тип для хранения имен таблиц и столбцов.источник
nvarchar(128) not null
столбец. Имя - это просто имя. Его не обязательноsysname
использоватьnvarchar(300)
тоже будет работать, или дажеvarchar
если вы не используете Unicode в именах таблиц (как я уверен, почти никто не делает). Преимуществоsysname
отчасти состоит в том, что он проясняет намерение: этот столбец содержит имя объекта; и частично то, что даже если вы перейдете на другую версию MSSQL, которая изменит тип данных, используемый для имен объектов (как это произошло раньше), он останется правильным типом.nvarchar(128) NOT NULL
. Фактически, вот как вы можете найти тип - проверив значениеuser_type_id
столбца. Вы не получите ничего больше, используя этот тип, чем создавая свой собственный тип пользователя.sysname
было изменено в более новой версии MSSQL, а база данных была скопирована и восстановлена в этом более новом экземпляре, все столбцы, которые ранее былиsysname
, теперь будут иметь неправильный тип и больше не будут соответствовать используемому типу в системных таблицах?sysname
- это определяемый пользователем тип сusert_type_id
256. Нет,ALTER TYPE
поэтому изменить его невозможно. Вам нужно будет создать новый тип и заменить все столбцы, которые использовали старый тип, на новые. Если MS когда-либо решит изменить это, им придется перенести существующие данные системной таблицы в новый тип. Вы можете ожидать, что они сделают это для системных таблиц, о которых они уже знают, но любые пользовательские таблицы должны быть перенесены пользователями