SQL सर्वर में SYSNAME डेटा प्रकार क्या है?


131

SQL सर्वर SYSNAME डेटा प्रकार किसके लिए है? बोल कहते हैं:

Sysname डेटा प्रकार का उपयोग टेबल कॉलम, वेरिएबल्स और संग्रहित प्रक्रिया मापदंडों के लिए किया जाता है जो ऑब्जेक्ट नामों को स्टोर करते हैं।

लेकिन मैं वास्तव में ऐसा नहीं करता। क्या कोई उपयोग-मामला है जो आप प्रदान कर सकते हैं?


1
नीचे इन ठीक जवाबों के अलावा, इसका उपयोग किसी ऐसे व्यक्ति के लिए भी कहर पैदा करता था जो sys.types का उपयोग करके कॉलम मेटाडेटा प्राप्त करने की कोशिश करता है, क्योंकि यह उसी सिस्टम_टाइप_id को nvarchar के रूप में साझा करता है।
स्टनिंगजैक

जवाबों:


150

sysname128 यूनिकोड वर्णों तक सीमित डेटाटाइप में बनाया गया है, जिसे IIRC, मुख्य रूप से स्क्रिप्ट बनाते समय ऑब्जेक्ट नामों को संग्रहीत करने के लिए उपयोग किया जाता है। इसका मूल्य नहीं हो सकताNULL

यह मूल रूप से उपयोग करने के समान है nvarchar(128) NOT NULL

संपादित करें

जैसा कि @Jim द्वारा टिप्पणियों में उल्लेख किया गया है, मुझे नहीं लगता कि वास्तव में कोई व्यावसायिक मामला है जहां आप sysnameईमानदार होने के लिए उपयोग करेंगे । sysSQL सर्वर के भीतर आंतरिक तालिकाओं और संग्रहीत कार्यविधियों आदि का निर्माण करते समय इसका उपयोग मुख्य रूप से Microsoft द्वारा किया जाता है ।

उदाहरण के लिए, निष्पादित करके Exec sp_help 'sys.tables'आप देखेंगे कि कॉलम nameको sysnameइस रूप में परिभाषित किया गया है क्योंकि इसका मूल्य वास्तव में अपने आप में एक वस्तु है (तालिका)

मुझे इसकी बहुत चिंता होगी।

यह भी ध्यान देने योग्य बात है कि उन लोगों को अभी भी एसक्यूएल सर्वर 6.5 का उपयोग करने और कम करने के लिए (वहाँ अभी भी इसे प्रयोग कर रहे हैं?) प्रकार में बनाया के लायक है sysnameके बराबर हैvarchar(30)

प्रलेखन

sysnameटिप्पणी अनुभाग में प्रलेखन के लिए परिभाषित किया गया है ncharऔरnvarchar :

sysname एक सिस्टम-प्रदत्त उपयोगकर्ता-परिभाषित डेटा प्रकार है जो कार्यात्मक रूप से nvarchar (128) के बराबर है , सिवाय इसके कि यह अशक्त नहीं है। डेटाबेस ऑब्जेक्ट नामों को संदर्भित करने के लिए sysname का उपयोग किया जाता है।

उपर्युक्त टिप्पणियों को स्पष्ट करने के लिए, डिफ़ॉल्ट रूप से sysname परिभाषित किया NOT NULLगया है क्योंकि यह निश्चित रूप से अशक्त के रूप में परिभाषित करना संभव है। यह नोट करना भी महत्वपूर्ण है कि सटीक परिभाषा SQL सर्वर के उदाहरणों के बीच भिन्न हो सकती है।

विशेष डेटा प्रकारों का उपयोग करना

Sysname डेटा प्रकार तालिका स्तंभ, चर के लिए इस्तेमाल किया, और प्रक्रिया पैरामीटर संग्रहीत है कि दुकान वस्तु के नाम है। Sysname की सटीक परिभाषा पहचानकर्ताओं के लिए नियमों से संबंधित है। इसलिए, यह SQL सर्वर के उदाहरणों के बीच भिन्न हो सकते हैं। sysname कार्यात्मक रूप से nvarchar (128) के समान है, सिवाय इसके कि, डिफ़ॉल्ट रूप से, sysname NULL नहीं है। SQL सर्वर के पुराने संस्करणों में, sysname को varchar (30) के रूप में परिभाषित किया गया है।

मूल्यों को sysnameअनुमति देने या अस्वीकार करने के बारे में कुछ और जानकारी NULLयहाँ देखी जा सकती है https://stackoverflow.com/a/52290792/300863

सिर्फ इसलिए कि यह डिफ़ॉल्ट है (NULL नहीं होना) गारंटी नहीं देता है कि यह होगा!


1
"क्या कोई उपयोग मामला है जो आप प्रदान कर सकते हैं?" मुझे नहीं लगता कि आप उपयोग करने के लिए एक व्यावहारिक व्यावसायिक कारण पाएंगे। अधिकतर इसका उपयोग MS SQL में आंतरिक रूप से किया जाता है क्योंकि यह संभवतः तालिकाओं आदि में काफी उपयोग किया जाता है
जिम

9
आप sysnameअपनी लिपियों में फॉरवर्ड (और बैकवर्ड) संगतता के लिए उपयोग करेंगे ।
मार्टिन स्मिथ

बस यहाँ 2 सेंट में डाल: मुझे यहाँ लाए गए स्तंभों nvarchar(max)को सपा में अशक्त घोषित नहीं किया गया है, लेकिन वे sysnamesys तालिकाओं में एक के रूप में दिखा रहे हैं ।
gloomy.penguin

3
@Barry असल में ... के अनुसार sys.typesयह एक है nvarchar(256) not null। ध्यान दें कि सिस्टम प्रकार ID = 231 (nvarchar)। यह आजकल टीडीएस में एक प्रकार का उपनाम के रूप में काम करता है; उपनाम की पहली आईडी 256 है, जो से मेल खाती है sysname। उपयोग के लिए: sysnameसूचना स्कीमा में उपयोग की जाती है।
15

2
@atlaste sys.tables में max_length की लंबाई बाइट्स में है। nvarchar प्रति चरित्र दो बाइट्स का उपयोग करता है, यही कारण है कि इसकी nvarchar (128) के रूप में परिभाषित किया गया है।
डेविड रशटन

60

क्या कोई उपयोग मामला है जो आप प्रदान कर सकते हैं?

यदि आपको कभी कुछ गतिशील sql बनाने की आवश्यकता होती है, तो यह sysnameतालिका नाम, स्तंभ नाम और सर्वर नाम रखने वाले चर के लिए डेटा प्रकार के रूप में उपयोग करने के लिए उपयुक्त है ।


6

एफवाईआई के रूप में ...।

select * from sys.types where system_type_id = 231 आपको दो पंक्तियाँ देता है।

(मुझे यकीन नहीं है कि इसका क्या मतलब है अभी तक लेकिन मुझे 100% यकीन है कि यह अभी मेरे कोड को गड़बड़ कर रहा है)

संपादित करें: मुझे लगता है कि इसका क्या मतलब है कि आपको इस स्थिति (मेरी स्थिति) में user_type_id से जुड़ना चाहिए या संभवतः user_type_id और th esystem_type_id दोनों

name        system_type_id   user_type_id   schema_id   principal_id    max_length  precision   scale   collation_name                  is_nullable     is_user_defined     is_assembly_type    default_object_id   rule_object_id
nvarchar    231              231            4           NULL            8000        0           0       SQL_Latin1_General_CP1_CI_AS    1               0                   0                   0                   0
sysname     231              256            4           NULL            256         0           0       SQL_Latin1_General_CP1_CI_AS    0               0                   0                   0                   0

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 

यह प्रश्न:

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

पैदावार:

parameter           max_length  parameter_id
@col_one            -1          1
@col_two            -1          2
@col_three           2          3
@col_four            2          4
@col_five            256        5
@col_six             256        6
@col_seven           256        7

और इस:

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

आपको यह देता है:

parameter   max_length  parameter_id    data_type   system_type_id  user_type_id    collation_name                  is_nullable
@col_one    -1          1               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_one    -1          1               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_two    -1          2               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_two    -1          2               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_three   2          3               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_three   2          3               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_four    2          4               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_four    2          4               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_five    256        5               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_five    256        5               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_six     256        6               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_six     256        6               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0
@col_seven   256        7               nvarchar    231             231             SQL_Latin1_General_CP1_CI_AS    1
@col_seven   256        7               sysname     231             256             SQL_Latin1_General_CP1_CI_AS    0

sys.typesआपके द्वारा बनाए गए उपयोगकर्ता परिभाषित प्रकारों को भी रखता है । यदि आप करते हैं तो create type MyInt from intआपके पास दो पंक्तियाँ होंगी system_type_id = 56। एक और जो डिफ़ॉल्ट रूप से डुप्लिकेट है 240 है जो पदानुक्रम, ज्यामिति और भूगोल के लिए सिस्टम प्रकार है।
मिकेल एरिकसन

मैं उस बारे में पूरी तरह भूल गया। तो ... वहाँ इस sysname के साथ इस सामान के लिए क्वेरी करने के लिए आदर्श तरीका क्या है? चूंकि यह एक 'उर्फ' है, क्या मैं बस कर सकता हूं where typ.name<>'sysname'या इसका कोई और परिणाम होगा, जिससे मैं अनजान हूं?
gloomy.penguin

3
Sys.types के खिलाफ दोनों system_type_id और user_type_id पर शामिल हों। एसक्यूएल फिडल
मिकेल एरिकसन

ओह, यही मैंने सबसे ऊपर कहा। मुझे लगा कि आप कह रहे हैं कि गलत था ...
gloomy.penguin

उसके बारे में क्षमा करें, मेरा अर्थ नहीं। बस कुछ अन्य चीजों को इंगित करना चाहते थे जो आपकी क्वेरी को गड़बड़ कर सकते हैं, न केवल sysname दोनों स्तंभों पर शामिल होने के बिना आपको दु: ख पहुंचा सकता है।
मिकेल एरिकसन

3

मुझे नीचे एक उपयोग के मामले की सूची दें। आशा करता हूँ की ये काम करेगा। यहां मैं 'DB' स्टूडेंट्स के टेबल 'Stud_dtls' का टेबल ओनर ढूंढने की कोशिश कर रहा हूं। जैसा कि मिकेल ने उल्लेख किया है, sysname का उपयोग तब किया जा सकता है जब कुछ गतिशील sql बनाने की आवश्यकता होती है, जिसमें तालिका नाम, स्तंभ नाम और सर्वर नाम रखने वाले चर की आवश्यकता होती है। बस अपनी बात के पूरक के लिए एक सरल उदाहरण प्रदान करने के बारे में सोचा।

USE Students

DECLARE @TABLE_NAME sysname

SELECT @TABLE_NAME = 'Stud_dtls'

SELECT TABLE_SCHEMA 
  FROM INFORMATION_SCHEMA.Tables
 WHERE TABLE_NAME = @TABLE_NAME

2

sysnamesp_send_dbmailएक संग्रहीत प्रक्रिया द्वारा उपयोग किया जाता है , जो "निर्दिष्ट प्राप्तकर्ता को एक ई-मेल संदेश भेजता है" और एमएसडीबी डेटाबेस में स्थित है।

Microsoft के अनुसार ,

[ @profile_name = ] 'profile_name'  

से संदेश भेजने के लिए प्रोफ़ाइल का नाम है। प्रोफ़ाइल_नाम NULL के डिफ़ॉल्ट के साथ टाइप sysname का है। प्रोफाइल_नाम एक मौजूदा डेटाबेस मेल प्रोफाइल का नाम होना चाहिए। जब कोई प्रोफ़ाइल_नाम निर्दिष्ट नहीं किया जाता है, तो sp_send_dbmail वर्तमान उपयोगकर्ता के लिए डिफ़ॉल्ट निजी प्रोफ़ाइल का उपयोग करता है। यदि उपयोगकर्ता के पास डिफ़ॉल्ट निजी प्रोफ़ाइल नहीं है, तो sp_send_dbmail msdb डेटाबेस के लिए डिफ़ॉल्ट सार्वजनिक प्रोफ़ाइल का उपयोग करता है। यदि उपयोगकर्ता के पास डिफ़ॉल्ट निजी प्रोफ़ाइल नहीं है और डेटाबेस के लिए कोई डिफ़ॉल्ट सार्वजनिक प्रोफ़ाइल नहीं है, तो @profile_name को निर्दिष्ट किया जाना चाहिए।


1

एफडब्ल्यूआईडब्ल्यू, आप उपयोगी सिस्टम एसपी की तरह एक तालिका नाम पारित कर सकते हैं, क्या आपको उस तरह से एक डेटाबेस का पता लगाना चाहिए:

DECLARE @Table sysname; SET @Table = 'TableName';
EXEC sp_fkeys @Table;
EXEC sp_help @Table;

0

SQL सर्वर 2016+ की कार्यक्षमता का उपयोग करते समय एक और उपयोग मामला है AT TIME ZONE

नीचे दिया गया विवरण जीएमटी में परिवर्तित तारीख लौटा देगा

SELECT 
CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE 'GMT Standard Time')))

यदि आप समय क्षेत्र को एक चर के रूप में पारित करना चाहते हैं, तो कहें:

SELECT 
CONVERT(DATETIME, SWITCHOFFSET([ColumnA], DATEPART(TZOFFSET, [ColumnA] AT TIME ZONE @TimeZone)))

तब उस चर को प्रकार का होना चाहिए sysname(इसे घोषित करना varcharएक त्रुटि का कारण होगा)।


0

क्या कोई उपयोग मामला है जो आप प्रदान कर सकते हैं?

कहीं भी आप डेटाबेस रखरखाव लिपियों द्वारा उपयोग के लिए एक वस्तु नाम स्टोर करना चाहते हैं। उदाहरण के लिए, एक स्क्रिप्ट कुछ निश्चित तालिकाओं से पुरानी पंक्तियों को शुद्ध करती है जिसमें एक तिथि स्तंभ होता है। इसे एक तालिका के साथ कॉन्फ़िगर किया गया है, जिस पर फ़िल्टर करने के लिए तालिका का नाम, स्तंभ का नाम और कितने दिनों का इतिहास है। एक और स्क्रिप्ट CSV फ़ाइलों के लिए कुछ तालिकाओं को डंप करती है, और फिर से तालिका को डंप करने के लिए तालिका को सूचीबद्ध करने के साथ कॉन्फ़िगर किया जाता है। ये कॉन्फ़िगरेशन तालिकाएँ sysnameतालिका और स्तंभ नामों को संग्रहीत करने के लिए प्रकार का उपयोग कर सकती हैं ।


आपको इसकी बिल्कुल भी जरूरत नहीं है। बस एक nvarchar(128) not nullकॉलम का उपयोग करें। नाम सिर्फ इतना है, एक नाम। इसका sysnameइस्तेमाल करने की जरूरत नहीं है
पनागोटिस कानावोस

यकीन है, और वास्तव में यह भी उस प्रकार का नहीं है, nvarchar(300)तो भी काम करेंगे या यहां तक ​​कि varcharअगर आप यूनिकोड का उपयोग तालिका नामों में नहीं करते हैं (जैसा कि मुझे यकीन है कि लगभग कोई भी नहीं करता है)। sysnameआंशिक रूप से लाभ यह है कि यह इरादा स्पष्ट कर देता है: यह कॉलम एक वस्तु का नाम रखता है; और आंशिक रूप से भले ही आप MSSQL के किसी भिन्न संस्करण में माइग्रेट करते हों, जो ऑब्जेक्ट नामों के लिए उपयोग किए गए डेटा प्रकार को बदलता है (जैसा कि पहले हुआ है), यह सही प्रकार जारी रहेगा।
एड एविस

नहीं, यह नहीं है। यह केवल एक अन्य उपयोगकर्ता प्रकार है (अनिवार्य रूप से एक उपनाम) जिसे मैप किया गया है nvarchar(128) NOT NULL। वास्तव में, यह है कि आप user_type_idकॉलम के मूल्य की जांच करके प्रकार को कैसे पा सकते हैं । आप उस प्रकार का उपयोग करके अधिक कुछ नहीं हासिल करते हैं, जैसे कि आप अपना स्वयं का उपयोगकर्ता प्रकार बनाकर
पनागीओटीस कानावोस

क्या आपका मतलब है कि यदि sysnameनए MSSQL संस्करण में परिभाषा को बदल दिया गया था, और डेटाबेस का बैकअप ले लिया गया था और उस नए उदाहरण में पुनर्स्थापित किया गया था, जो पहले किए गए सभी कॉलम sysnameअब गलत प्रकार के होंगे और अब उपयोग किए गए प्रकार से मेल नहीं खाते हैं सिस्टम तालिकाओं में?
एड एविस

यह, या इससे भी बदतर, अगर कभी ऐसा होता है, तो आपका कॉलम hosed हो सकता है। 256 के sysnameसाथ एक उपयोगकर्ता-परिभाषित प्रकार है। इसे बदलने का कोई तरीका नहीं है। आपको एक नया प्रकार बनाना होगा और उन सभी स्तंभों को बदलना होगा जो पुराने प्रकार को नए में उपयोग करते हैं। यदि MS ने कभी इसे बदलने का फैसला किया है तो उन्हें मौजूदा सिस्टम टेबल डेटा को नए प्रकार पर माइग्रेट करना होगा। आप उनसे सिस्टम टेबल के लिए ऐसा करने की उम्मीद कर सकते हैं, जिनके बारे में वे पहले से ही जानते हैं, लेकिन किसी भी उपयोगकर्ता तालिका को उपयोगकर्ताओं द्वारा माइग्रेट करना होगाusert_type_idALTER TYPE
Panagiotis Kanavos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.