Untuk apa tipe data SQL Server SYSNAME? BOL mengatakan:
Tipe data sysname digunakan untuk kolom tabel, variabel, dan parameter prosedur tersimpan yang menyimpan nama objek.
tapi saya tidak begitu mengerti. Apakah ada case-use yang bisa Anda berikan?
sql
sql-server
tsql
types
jrara
sumber
sumber
Jawaban:
sysname
adalah tipe data bawaan terbatas untuk 128 karakter Unicode yang, IIRC, digunakan terutama untuk menyimpan nama objek saat membuat skrip. Nilainya tidak bisaNULL
Ini pada dasarnya sama dengan menggunakan
nvarchar(128) NOT NULL
EDIT
Seperti yang disebutkan oleh @ Jim dalam komentar, saya tidak berpikir benar-benar ada kasus bisnis di mana Anda ingin
sysname
jujur. Ini terutama digunakan oleh Microsoft ketika membangunsys
tabel internal dan prosedur tersimpan dll dalam SQL Server.Misalnya, dengan mengeksekusi
Exec sp_help 'sys.tables'
Anda akan melihat bahwa kolomname
didefinisikan karenasysname
ini karena nilai ini sebenarnya adalah objek itu sendiri (tabel)Saya akan terlalu khawatir tentang hal itu.
Ini juga perlu dicatat bahwa untuk orang-orang yang masih menggunakan SQL Server 6.5 dan lebih rendah (apakah masih ada orang yang menggunakannya?) Tipe bawaan
sysname
adalah setara denganvarchar(30)
Dokumentasi
sysname
didefinisikan dengan dokumentasi untuknchar
dannvarchar
, di bagian komentar:Untuk memperjelas pernyataan di atas, secara default sysname didefinisikan karena
NOT NULL
tentu saja mungkin untuk mendefinisikannya sebagai nullable. Penting juga untuk dicatat bahwa definisi yang tepat dapat bervariasi antara contoh SQL Server.Menggunakan Jenis Data Khusus
Beberapa informasi lebih lanjut tentang
sysname
mengizinkan atau melarangNULL
nilai dapat ditemukan di sini https://stackoverflow.com/a/52290792/300863Hanya karena itu adalah default (untuk TIDAK NULL) tidak menjamin bahwa itu akan menjadi!
sumber
sysname
untuk kompatibilitas maju (dan mundur) dalam skrip Anda.nvarchar(max)
bukan nol di SP tetapi ditampilkan sebagaisysname
dalam tabel sys.sys.types
anvarchar(256) not null
. Perhatikan bahwa ID jenis sistem = 231 (nvarchar). Ini berfungsi sebagai jenis alias di TDS saat ini; ID pertama alias adalah 256, yang sesuai dengansysname
. Adapun penggunaan:sysname
digunakan dalam skema informasi.Jika Anda memiliki kebutuhan untuk membuat beberapa sql dinamis, maka tepat untuk digunakan
sysname
sebagai tipe data untuk variabel yang menyimpan nama tabel, nama kolom dan nama server.sumber
Sama seperti FYI ....
select * from sys.types where system_type_id = 231
memberi Anda dua baris.(Saya tidak yakin apa artinya ini tetapi saya 100% yakin itu mengacaukan kode saya sekarang)
sunting: saya kira artinya adalah Anda harus bergabung dengan user_type_id dalam situasi ini (situasi saya) atau mungkin juga user_type_id dan th esystem_type_id
Kueri ini:
hasil:
dan ini:
memberi Anda ini:
sumber
sys.types
memegang jenis yang ditentukan pengguna yang Anda buat juga. Jika Anda melakukannya,create type MyInt from int
Anda akan memiliki dua barissystem_type_id = 56
. Lain yang digandakan secara default adalah 240 yang merupakan tipe sistem untuk hierarki, geometri dan geografi.where typ.name<>'sysname'
atau apakah ada konsekuensi lain yang tidak saya sadari?Biarkan saya daftar kasus penggunaan di bawah ini. Semoga ini bisa membantu. Di sini saya mencoba untuk menemukan Pemilik Tabel dari Tabel 'Stud_dtls' dari DB 'Students'. Seperti yang disebutkan Mikael, sysname dapat digunakan ketika ada kebutuhan untuk membuat beberapa sql dinamis yang memerlukan variabel yang menyimpan nama tabel, nama kolom dan nama server. Hanya memikirkan memberikan contoh sederhana untuk melengkapi maksudnya.
sumber
sysname
digunakan olehsp_send_dbmail
, prosedur tersimpan yang "Mengirim pesan email ke penerima yang ditentukan" dan terletak di database msdb.Menurut Microsoft ,
sumber
FWIW, Anda dapat memberikan nama tabel ke sistem SP yang berguna seperti ini, jika Anda ingin menjelajahi basis data seperti itu:
sumber
Kasus penggunaan lain adalah ketika menggunakan fungsionalitas SQL Server 2016+
AT TIME ZONE
Pernyataan di bawah ini akan mengembalikan tanggal yang dikonversi ke GMT
Jika Anda ingin melewati zona waktu sebagai variabel, katakan:
maka variabel tersebut harus bertipe
sysname
(menyatakannya sebagaivarchar
akan menyebabkan kesalahan).sumber
Di mana pun Anda ingin menyimpan nama objek untuk digunakan oleh skrip pemeliharaan basis data. Misalnya, skrip membersihkan baris lama dari tabel tertentu yang memiliki kolom tanggal. Ini dikonfigurasi dengan tabel yang memberikan nama tabel, nama kolom untuk difilter, dan berapa hari riwayat disimpan. Skrip lain membuang tabel tertentu ke file CSV, dan sekali lagi dikonfigurasi dengan tabel yang mencantumkan tabel untuk dibuang. Tabel konfigurasi ini dapat menggunakan
sysname
tipe untuk menyimpan nama tabel dan kolom.sumber
nvarchar(128) not null
kolom. Namanya hanya itu, nama. Tidaksysname
harus digunakannvarchar(300)
akan berfungsi juga atau bahkan hanyavarchar
jika Anda tidak menggunakan Unicode dalam nama tabel (karena saya yakin hampir tidak ada yang melakukannya). Keuntungannyasysname
adalah sebagian hal itu membuat niat menjadi lebih jelas: kolom ini berisi nama objek; dan sebagian bahwa bahkan jika Anda bermigrasi ke versi MSSQL yang berbeda yang mengubah tipe data yang digunakan untuk nama objek (seperti yang telah terjadi sebelumnya), itu akan terus menjadi tipe yang tepat.nvarchar(128) NOT NULL
. Bahkan, itulah cara Anda dapat menemukan tipe - dengan memeriksa nilaiuser_type_id
kolom. Anda tidak mendapatkan apa-apa lagi dengan menggunakan tipe itu, daripada membuat tipe pengguna Anda sendirisysname
diubah dalam versi MSSQL yang lebih baru, dan database didukung dan dikembalikan ke contoh yang lebih baru, semua kolom yang sebelumnyasysname
akan sekarang menjadi tipe yang salah dan tidak lagi cocok dengan jenis yang digunakan dalam tabel sistem?sysname
adalah tipe yang ditentukan pengguna denganusert_type_id
256. Tidak adaALTER TYPE
sehingga tidak ada cara untuk mengubahnya. Anda harus membuat tipe baru dan mengubah semua kolom yang menggunakan tipe lama ke yang baru. Jika MS pernah memutuskan untuk mengubah ini, mereka harus memigrasi data tabel sistem yang ada ke tipe baru. Anda dapat mengharapkan mereka melakukan ini untuk tabel sistem yang sudah mereka ketahui, tetapi tabel pengguna apa pun harus dimigrasikan oleh pengguna