Wofür ist der SQL Server SYSNAME-Datentyp? BOL sagt:
Der Datentyp sysname wird für Tabellenspalten, Variablen und Parameter für gespeicherte Prozeduren verwendet, in denen Objektnamen gespeichert werden.
aber das verstehe ich nicht wirklich. Gibt es einen Anwendungsfall, den Sie bereitstellen können?
sql
sql-server
tsql
types
jrara
quelle
quelle
Antworten:
sysname
ist ein integrierter Datentyp, der auf 128 Unicode-Zeichen beschränkt ist und in IIRC hauptsächlich zum Speichern von Objektnamen beim Erstellen von Skripten verwendet wird. Sein Wert kann nicht seinNULL
Es ist im Grunde das gleiche wie mit
nvarchar(128) NOT NULL
BEARBEITEN
Wie von @Jim in den Kommentaren erwähnt, glaube ich nicht, dass es wirklich einen Business Case gibt, in dem Sie
sysname
ehrlich sein würden. Es wird hauptsächlich von Microsoft beim Erstellen der internensys
Tabellen und gespeicherten Prozeduren usw. in SQL Server verwendet.Wenn Sie beispielsweise ausführen, sehen
Exec sp_help 'sys.tables'
Sie, dass die Spaltename
so definiertsysname
ist, weil der Wert davon tatsächlich ein Objekt an sich ist (eine Tabelle).Ich würde mir zu viele Sorgen machen.
Es ist auch erwähnenswert, dass für diejenigen, die noch SQL Server 6.5 und niedriger verwenden (gibt es noch Leute, die es verwenden?), Der eingebaute Typ von
sysname
gleichbedeutend ist mitvarchar(30)
Dokumentation
sysname
wird mit der Dokumentation fürnchar
undnvarchar
im Abschnitt "Bemerkungen" definiert:Um die obigen Ausführungen zu verdeutlichen, wird standardmäßig sysname definiert, da
NOT NULL
es durchaus möglich ist, ihn als nullbar zu definieren. Es ist auch wichtig zu beachten, dass die genaue Definition zwischen Instanzen von SQL Server variieren kann.Spezielle Datentypen verwenden
Weitere Informationen zum
sysname
Zulassen oder Nichtzulassen vonNULL
Werten finden Sie hier https://stackoverflow.com/a/52290792/300863Nur weil es die Standardeinstellung ist (NICHT NULL zu sein), kann dies nicht garantiert werden!
quelle
sysname
für die Vorwärts- (und Rückwärts-) Kompatibilität in Ihren Skripten verwenden.nvarchar(max)
im SP als nicht null deklariert, abersysname
in den sys-Tabellen als a angezeigt.sys.types
es ist einnvarchar(256) not null
. Beachten Sie, dass der Systemtyp ID = 231 (nvarchar) ist. Es funktioniert heutzutage als Typalias in TDS. Die erste ID eines Alias ist 256, was entsprichtsysname
. Verwendung:sysname
Wird in Informationsschemata verwendet.Wenn Sie jemals die Notwendigkeit haben, einige zu erstellen dynamische SQL sollten Sie diese
sysname
als Datentyp für Variablen verwenden, die Tabellennamen, Spaltennamen und Servernamen enthalten.quelle
Nur als FYI ....
select * from sys.types where system_type_id = 231
gibt Ihnen zwei Zeilen.(Ich bin mir noch nicht sicher, was das bedeutet, aber ich bin mir zu 100% sicher, dass es meinen Code gerade durcheinander bringt.)
edit: ich denke was es bedeutet ist, dass du in dieser Situation (meiner Situation) durch die user_type_id oder möglicherweise sowohl die user_type_id als auch die essystem_type_id beitreten solltest
Diese Abfrage:
Ausbeuten:
und das:
gibt Ihnen dies:
quelle
sys.types
Enthält die benutzerdefinierten Typen , die Sie ebenfalls erstellen. Wenn Sie dies tuncreate type MyInt from int
, haben Sie zwei Zeilen mitsystem_type_id = 56
. Eine andere, die standardmäßig dupliziert wird, ist 240, der Systemtyp für Hierarchie-ID, Geometrie und Geografie.where typ.name<>'sysname'
oder hätte das eine andere Konsequenz, von der ich nichts weiß?Lassen Sie mich unten einen Anwendungsfall auflisten. Ich hoffe es hilft. Hier versuche ich, den Tabellenbesitzer der Tabelle 'Stud_dtls' aus den DB 'Students' zu finden. Wie Mikael erwähnte, könnte sysname verwendet werden, wenn eine dynamische SQL erstellt werden muss, für die Variablen mit Tabellennamen, Spaltennamen und Servernamen erforderlich sind. Ich dachte nur daran, ein einfaches Beispiel zu liefern, um seinen Standpunkt zu ergänzen.
quelle
sysname
wird verwendet vonsp_send_dbmail
einer gespeicherten Prozedur verwendet, die "eine E-Mail-Nachricht an die angegebenen Empfänger sendet" und sich in der msdb-Datenbank befindet.Laut Microsoft ,
quelle
FWIW, Sie können einen Tabellennamen an nützliche System-SPs wie diese übergeben, wenn Sie eine Datenbank auf diese Weise durchsuchen möchten:
quelle
Ein weiterer Anwendungsfall ist die Verwendung der SQL Server 2016+ -Funktionalität von
AT TIME ZONE
Die folgende Anweisung gibt ein in GMT konvertiertes Datum zurück
Wenn Sie die Zeitzone als Variable übergeben möchten, sagen Sie:
dann muss diese Variable vom Typ sein
sysname
(wenn sie alsvarchar
fehlerhaft deklariert wird).quelle
Überall dort, wo Sie einen Objektnamen zur Verwendung durch Datenbankwartungsskripte speichern möchten. Ein Skript löscht beispielsweise alte Zeilen aus bestimmten Tabellen mit einer Datumsspalte. Es ist mit einer Tabelle konfiguriert, die den Tabellennamen, den Spaltennamen zum Filtern und die Anzahl der Tage des Verlaufs angibt. Ein anderes Skript speichert bestimmte Tabellen in CSV-Dateien und wird erneut mit einer Tabelle konfiguriert, in der die zu sichernden Tabellen aufgelistet sind. Diese Konfigurationstabellen können den
sysname
Typ zum Speichern von Tabellen- und Spaltennamen verwenden.quelle
nvarchar(128) not null
Spalte. Der Name ist genau das, ein Name. Es muss nichtsysname
verwendet werdennvarchar(300)
würde auch funktionieren oder auch nur,varchar
wenn Sie Unicode nicht in Tabellennamen verwenden (wie ich sicher bin, dass fast niemand dies tut). Der Vorteil vonsysname
ist teilweise, dass es die Absicht klarer macht: Diese Spalte enthält einen Objektnamen; und teilweise, dass selbst wenn Sie auf eine andere Version von MSSQL migrieren, die den für Objektnamen verwendeten Datentyp ändert (wie zuvor), dieser weiterhin der richtige Typ ist.nvarchar(128) NOT NULL
. Auf diese Weise können Sie den Typ finden - indem Sie denuser_type_id
Wert der Spalte überprüfen . Mit diesem Typ erhalten Sie nichts mehr als mit dem Erstellen eines eigenen Benutzertypssysname
in einer neueren MSSQL-Version geändert und die Datenbank gesichert und in dieser neueren Instanz wiederhergestellt würde, alle zuvor vorhandenen Spaltensysname
jetzt vom falschen Typ wären und nicht mehr mit dem verwendeten Typ übereinstimmen würden in den Systemtabellen?sysname
ist ein benutzerdefinierter Typ mitusert_type_id
256. Es gibt keinen,ALTER TYPE
also gibt es keine Möglichkeit, ihn zu ändern. Sie müssten einen neuen Typ erstellen und alle Spalten, die den alten Typ verwendet haben, in den neuen ändern. Wenn MS jemals beschlossen , dies ändern würden sie müssen bestehende Systemtabellendaten in den neuen Typ migrieren. Sie können erwarten, dass sie dies für die Systemtabellen tun, die sie bereits kennen, aber für jeden Benutzer