Do czego służy typ danych SYSNAME programu SQL Server? BOL mówi:
Typ danych sysname jest używany dla kolumn tabeli, zmiennych i parametrów procedur składowanych, które przechowują nazwy obiektów.
ale tak naprawdę tego nie rozumiem. Czy możesz podać przykład użycia?
sql
sql-server
tsql
types
jrara
źródło
źródło
Odpowiedzi:
sysname
to wbudowany typ danych ograniczony do 128 znaków Unicode, który, IIRC, jest używany głównie do przechowywania nazw obiektów podczas tworzenia skryptów. Jego wartość nie może byćNULL
Zasadniczo jest to to samo, co używanie
nvarchar(128) NOT NULL
EDYTOWAĆ
Jak wspomniał @Jim w komentarzach, nie sądzę, aby istniał przypadek biznesowy, w którym chciałbyś
sysname
być szczery. Jest używany głównie przez firmę Microsoft podczas tworzenia wewnętrznychsys
tabel i procedur składowanych itp. W programie SQL Server.Na przykład, wykonując polecenie
Exec sp_help 'sys.tables'
, zobaczysz, że kolumnaname
jest zdefiniowana wsysname
ten sposób, ponieważ wartość this jest w rzeczywistości obiektem samym w sobie (tabelą)Za bardzo bym się tym martwił.
Warto również zauważyć, że dla tych osób, które nadal używają SQL Server 6.5 i niższych (czy nadal są ludzie używający?), Typ wbudowany
sysname
jest odpowiednikiemvarchar(30)
Dokumentacja
sysname
jest zdefiniowany w dokumentacji dlanchar
invarchar
, w sekcji uwag:Aby wyjaśnić powyższe uwagi, domyślnie zdefiniowano nazwę sysname, ponieważ z
NOT NULL
pewnością można zdefiniować ją jako dopuszczającą wartość null. Należy również zauważyć, że dokładna definicja może się różnić w zależności od wystąpienia programu SQL Server.Korzystanie ze specjalnych typów danych
Dodatkowe informacje na temat
sysname
dopuszczania lub blokowaniaNULL
wartości można znaleźć tutaj https://stackoverflow.com/a/52290792/300863Tylko dlatego, że jest to wartość domyślna (NIE NULL), nie gwarantuje, że tak będzie!
źródło
sysname
do przodu (i do tyłu) zgodności w skryptach.nvarchar(max)
niezerowe w SP, ale są wyświetlane jako asysname
w tabelach sys.sys.types
tymnvarchar(256) not null
. Zwróć uwagę, że identyfikator typu systemu = 231 (nvarchar). Obecnie działa jako alias typu w TDS; pierwszy identyfikator aliasu to 256, co odpowiadasysname
. Co do użycia:sysname
jest używany w schematach informacyjnych.Jeśli kiedykolwiek zajdzie potrzeba utworzenia jakiegoś dynamicznego sql , należy użyć go
sysname
jako typu danych dla zmiennych przechowujących nazwy tabel, nazw kolumn i nazw serwerów.źródło
Tak jak FYI ....
select * from sys.types where system_type_id = 231
daje dwa rzędy.(Nie jestem jeszcze pewien, co to oznacza, ale jestem w 100% pewien, że teraz psuje mój kod)
edit: domyślam się, że oznacza to, że w tej sytuacji powinieneś dołączyć za pomocą user_type_id (moja sytuacja) lub prawdopodobnie zarówno user_type_id, jak i system_type_id
create procedure dbo.yyy_test ( @col_one nvarchar(max), @col_two nvarchar(max) = 'default', @col_three nvarchar(1), @col_four nvarchar(1) = 'default', @col_five nvarchar(128), @col_six nvarchar(128) = 'default', @col_seven sysname ) as begin select 1 end
To zapytanie:
select parm.name AS Parameter, parm.max_length, parm.parameter_id from sys.procedures sp join sys.parameters parm ON sp.object_id = parm.object_id where sp.name = 'yyy_test' order by parm.parameter_id
Plony:
I to:
select parm.name as parameter, parm.max_length, parm.parameter_id, typ.name as data_type, typ.system_type_id, typ.user_type_id, typ.collation_name, typ.is_nullable from sys.procedures sp join sys.parameters parm ON sp.object_id = parm.object_id join sys.types typ ON parm.system_type_id = typ.system_type_id where sp.name = 'yyy_test' order by parm.parameter_id
Daje ci to:
źródło
sys.types
zawiera również utworzone przez użytkownika typy . Jeśli to zrobiszcreate type MyInt from int
, będziesz mieć dwa rzędy zsystem_type_id = 56
. Innym, który jest domyślnie zduplikowany, jest 240, czyli typ systemu dla hierarchii, geometrii i geografii.where typ.name<>'sysname'
czy miałoby to jakieś inne konsekwencje, o których nie wiem?Poniżej wymienię przypadek użycia. Mam nadzieję, że to pomoże. Tutaj próbuję znaleźć właściciela tabeli „Stud_dtls” z DB „Students”. Jak wspomniał Mikael, nazwa sysname może być używana, gdy istnieje potrzeba stworzenia jakiegoś dynamicznego sql, który wymaga zmiennych przechowujących nazwy tabel, nazw kolumn i nazw serwerów. Pomyślałem o podaniu prostego przykładu, który uzupełni jego punkt widzenia.
USE Students DECLARE @TABLE_NAME sysname SELECT @TABLE_NAME = 'Stud_dtls' SELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.Tables WHERE TABLE_NAME = @TABLE_NAME
źródło
sysname
jest używany przezsp_send_dbmail
procedurę składowaną, która „Wysyła wiadomość e-mail do określonych odbiorców” i znajduje się w bazie danych msdb.Według Microsoftu ,
źródło
FWIW, możesz przekazać nazwę tabeli do przydatnych SP systemowych w ten sposób, jeśli chcesz eksplorować bazę danych w ten sposób:
DECLARE @Table sysname; SET @Table = 'TableName'; EXEC sp_fkeys @Table; EXEC sp_help @Table;
źródło
Innym przypadkiem użycia jest korzystanie z funkcji programu SQL Server 2016+
AT TIME ZONE
Poniższa instrukcja zwróci datę przekonwertowaną na GMT
SELECT CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE 'GMT Standard Time')))
Jeśli chcesz przekazać strefę czasową jako zmienną, powiedz:
SELECT CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE @TimeZone)))
wtedy ta zmienna musi być tego typu
sysname
(zadeklarowanie jej jakovarchar
spowoduje błąd).źródło
Wszędzie tam, gdzie chcesz przechowywać nazwę obiektu do użytku przez skrypty konserwacji bazy danych. Na przykład skrypt usuwa stare wiersze z niektórych tabel, które mają kolumnę daty. Jest skonfigurowany z tabelą, która zawiera nazwę tabeli, nazwę kolumny do filtrowania i liczbę dni historii do zachowania. Inny skrypt zrzuca określone tabele do plików CSV i ponownie jest skonfigurowany z tabelą zawierającą tabele do zrzucenia. Te tabele konfiguracji mogą używać
sysname
typu do przechowywania nazw tabel i kolumn.źródło
nvarchar(128) not null
kolumny. To tylko nazwa, imię. Nie trzebasysname
go używaćnvarchar(300)
działałoby też lub nawetvarchar
gdybyś nie używał Unicode w nazwach tabel (jestem pewien, że prawie nikt tego nie robi). Zaletą programusysname
jest częściowo to, że wyjaśnia intencję: ta kolumna zawiera nazwę obiektu; a częściowo, że nawet jeśli dokonasz migracji do innej wersji MSSQL, która zmienia typ danych używany w nazwach obiektów (jak to miało miejsce wcześniej), nadal będzie to właściwy typ.nvarchar(128) NOT NULL
. W rzeczywistości w ten sposób można znaleźć typ - sprawdzając wartośćuser_type_id
kolumny. Zyskasz nic więcej przy użyciu tego typu, niż byłoby, tworząc swój własny typ użytkownikasysname
została zmieniona w nowszej wersji MSSQL, a baza danych została zarchiwizowana i przywrócona do nowszej instancji, wszystkie kolumny, które wcześniej były,sysname
byłyby teraz niewłaściwego typu i nie pasowałyby już do używanego typu w tabelach systemowych?sysname
jest typem zdefiniowanym przez użytkownika zusert_type_id
256. Nie ma,ALTER TYPE
więc nie ma sposobu, aby go zmienić. Musiałbyś utworzyć nowy typ i zmienić wszystkie kolumny, które używały starego typu, na nowe. Gdyby firma MS kiedykolwiek zdecydowała się to zmienić , musiałaby przenieść istniejące dane tabeli systemowej do nowego typu. Możesz oczekiwać, że zrobią to dla tabel systemowych, o których już wiedzą, ale wszelkie tabele użytkowników musiałyby zostać zmigrowane przez użytkowników