এসকিউএল সার্ভারে SYSNAME ডেটা টাইপ কী?


131

এসকিউএল সার্ভার এসওয়াইএসএন ডাটা টাইপ কীসের জন্য? বিওএল বলেছেন:

সিস্টেম ডেটা টাইপটি টেবিল কলাম, ভেরিয়েবল এবং সঞ্চিত পদ্ধতি পরামিতিগুলির জন্য ব্যবহৃত হয় যা বস্তুর নাম সংরক্ষণ করে।

কিন্তু আমি সত্যিই এটি পাই না। আপনি সরবরাহ করতে পারেন এমন কোনও ব্যবহারের কেস আছে?


1
নীচে এই সূক্ষ্ম উত্তরগুলি ছাড়াও, এর দ্বারা sys.tyype ব্যবহার করে কলাম মেটাডেটা পাওয়ার চেষ্টা করে এমন কারওর জন্য বিপর্যয় ঘটত, কারণ এটি nvarchar হিসাবে একই সিস্টেম_টাইপ_আইডি ভাগ করে।
স্টিংজি জ্যাক

উত্তর:


150

sysname128 ইউনিকোড অক্ষরের মধ্যে সীমাবদ্ধ এমন ডেটাটাইপ যা আইআইআরসি, স্ক্রিপ্ট তৈরি করার সময় মূলত অবজেক্টের নাম সংরক্ষণ করতে ব্যবহৃত হয়। এর মান হতে পারে নাNULL

এটি মূলত ব্যবহারের মতোই nvarchar(128) NOT NULL

সম্পাদনা

মন্তব্যগুলিতে @ জিম দ্বারা উল্লিখিত হিসাবে, আমি মনে করি না যে সত্যিই এমন কোনও ব্যবসায়ের ঘটনা আছে যেখানে আপনি sysnameসৎ হতে ব্যবহার করবেন। এটি মূলত অভ্যন্তরীণ নির্মাণের সময় মাইক্রোসফ্ট ব্যবহার করেsys এসকিউএল সার্ভারের টেবিলগুলি এবং সঞ্চিত পদ্ধতিগুলি তৈরি করার ।

উদাহরণস্বরূপ, সম্পাদন করে Exec sp_help 'sys.tables'আপনি দেখতে পাবেন যে কলামটি nameএটি হিসাবে সংজ্ঞায়িত হয়েছে sysnameকারণ এর মান আসলে নিজের মধ্যে একটি বস্তু (একটি সারণী)

আমি এটি সম্পর্কে খুব উদ্বিগ্ন হবে।

এটি লক্ষণীয় যে সেই লোকগুলির জন্য এখনও এসকিউএল সার্ভার 6.5 এবং নিম্ন ব্যবহার করে (এখনও কি লোকেরা এটি ব্যবহার করছে?) প্রকারভেদে নির্মিত sysnameসমানvarchar(30)

নথিপত্র

sysnameডকুমেন্টেশন সঙ্গে সংজ্ঞায়িত করা হয় ncharএবংnvarchar মন্তব্য বিভাগে,:

sysname হ'ল সিস্টেম-সরবরাহিত ব্যবহারকারী-সংজ্ঞায়িত ডেটা টাইপ যা কার্যকরীভাবে nvarchar (128) এর সমতুল্য , ব্যতীত এটি অযোগ্য নয় except sysname ডাটাবেস অবজেক্টের নাম উল্লেখ করতে ব্যবহৃত হয়।

উপরের মন্তব্যগুলি স্পষ্ট করার জন্য, ডিফল্টরূপে sysname সংজ্ঞায়িত করা হয় কারণ NOT NULLএটি অবশ্যই naclable হিসাবে সংজ্ঞায়িত করা সম্ভব। এটিও লক্ষ করা গুরুত্বপূর্ণ যে সঠিক সংজ্ঞাটি এসকিউএল সার্ভারের উদাহরণগুলির মধ্যে পরিবর্তিত হতে পারে।

বিশেষ ডেটা প্রকার ব্যবহার করে

Sysname ডাটা টাইপ টেবিল কলাম, ভেরিয়েবল জন্য ব্যবহৃত পদ্ধতি পরামিতি সঞ্চিত যে দোকান বস্তুর নাম করা হয়। সিমনামের সঠিক সংজ্ঞা শনাক্তকারীদের নিয়মের সাথে সম্পর্কিত। সুতরাং, এটি এসকিউএল সার্ভারের উদাহরণগুলির মধ্যে পৃথক হতে পারে। sysname nvarchar (128) হিসাবে একই , ডিফল্টরূপে, sysname নাল নয়। এসকিউএল সার্ভারের পূর্ববর্তী সংস্করণগুলিতে, sysname ভার্চার (30) হিসাবে সংজ্ঞায়িত করা হয়।

মানগুলিকে sysnameমঞ্জুরি দেওয়া বা অস্বীকার করা সম্পর্কে আরও কিছু তথ্য NULLএখানে পাওয়া যাবে https://stackoverflow.com/a/52290792/300863

এটি ডিফল্ট হওয়ার কারণে (নাল নয়) এটি গ্যারান্টি দেয় না!


1
"আপনি সরবরাহ করতে পারেন এমন কোনও কেস আছে?" আমি মনে করি না আপনি ব্যবহারের জন্য ব্যবহারিক ব্যবসায়ের কারণ খুঁজে পাবেন। বেশিরভাগ ক্ষেত্রে এটি এমএস এসকিউএলে অভ্যন্তরীণভাবে ব্যবহৃত হয় কারণ এটি সম্ভবত টেবিল ইত্যাদিতে বেশ কিছুটা ব্যবহৃত হয়
জিম

9
আপনি sysnameআপনার স্ক্রিপ্টগুলিতে সামনের ও সামনের সামঞ্জস্যের জন্য ব্যবহার করবেন।
মার্টিন স্মিথ

এখানে কেবল 2 সেন্ট রেখেছেন: যে কলামগুলি আমাকে এখানে এনেছে তা হিসাবে ঘোষণা করা হয়েছে nvarchar(max) তা এসপিতে বাতিল নয় তবে তারা sysnameসিস্ট টেবিলে একটি হিসাবে প্রদর্শিত হচ্ছে ।
gloomy.penguin

3
@Barry আসলে ... অনুযায়ী sys.typesএটি একটি এর nvarchar(256) not null। মনে রাখবেন যে সিস্টেমের আইডি = 231 (এনভারচার)। এটি আজকাল টিডিএসে টাইপ ওরফে হিসাবে কাজ করে; একটি উপনামের প্রথম আইডি 256, যা এর সাথে সম্পর্কিত sysname। ব্যবহার হিসাবে: sysnameতথ্য স্কিমা এর ব্যবহৃত হয়।
আটলস্টে

2
@ অ্যাটলেস্ট সিস. টেবিলের সর্বোচ্চ_ দৈর্ঘ্যের দৈর্ঘ্য বাইটে রয়েছে। এনভারচর চরিত্র অনুসারে দুটি বাইট ব্যবহার করে, এ কারণেই এটি এনভারচার (128) হিসাবে সংজ্ঞায়িত হয়েছে।
ডেভিড রুশন

60

আপনি সরবরাহ করতে পারেন সেখানে ব্যবহারের কেস আছে?

আপনার যদি কখনও কিছু গতিশীল স্কয়ার তৈরি করার প্রয়োজন হয় তবে sysnameটেবিলের নাম, কলামের নাম এবং সার্ভারের নাম ধারণ করে চলকগুলির জন্য ডেটা টাইপ হিসাবে ব্যবহার করা উপযুক্ত appropriate


6

ঠিক একটি এফওয়াইআই ....

select * from sys.types where system_type_id = 231 আপনাকে দুটি সারি দেয়।

(এটির অর্থ কী তা আমি এখনও নিশ্চিত নই তবে আমি 100% নিশ্চিত যে এটি আমার কোডটি এখনই জগাখিচু করছে)

সম্পাদনা করুন: আমি অনুমান করি এর অর্থ হ'ল আপনার এই পরিস্থিতিতে (আমার পরিস্থিতি) ব্যবহারকারী বা টাইপ_আইডি বা সম্ভবত ব্যবহারকারীর টাইপ_আইডি এবং থম এসিস্টেম_ টাইপ_আইডি উভয় দ্বারা যোগদান করা উচিত

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 যা হায়ারার্কাইড, জ্যামিতি এবং ভূগোলের সিস্টেম টাইপ।
মিকেল এরিকসন

আমি যে সম্পর্কে ভুলে গেছি। সুতরাং ... সেখানে এই সাইটের নাম সহ এই স্টাফটির অনুসন্ধানের আদর্শ উপায় কী? যেহেতু এটি একটি 'ওরফে' আমি কি করতে পারি where typ.name<>'sysname'বা এর অন্য কোনও ধরণের পরিণতি হতে পারে যা সম্পর্কে আমি অজানা?
gloomy.penguin

3
সিস্টেমে টাইপ_আইডি এবং ব্যবহারকারীর_প্রকার_আইডি উভয়েই সিস.প্রকারের বিপরীতে যোগদান করুন। এসকিউএল ফিডল
মিকেল এরিকসন

ওহ, আমি একেবারে শীর্ষে বলেছিলাম। আমি ভেবেছিলাম আপনি এই কথাটি ভুল বলেছিলেন ...
gloomy.penguin

দুঃখিত, আমার অর্থ নয়। কেবল কিছু অন্যান্য বিষয়গুলিই নির্দেশ করতে চেয়েছিল যা আপনার ক্যোয়ারিকে গোলমেলে ফেলতে পারে, কেবলমাত্র sysname উভয় কলামে যোগদান না করেই আপনাকে শোক করতে পারে।
মিকেল এরিকসন

3

আমাকে নীচে একটি ব্যবহারের কেস তালিকা করতে দিন। আশা করি এটা সাহায্য করবে. এখানে আমি ডিবি 'স্টুডেন্টস' এর কাছ থেকে টেবিলের মালিক 'স্টাড_ডিটিএলস' সন্ধান করার চেষ্টা করছি। মিকারেল যেমন উল্লেখ করেছেন, সাইকনাম ব্যবহার করা যেতে পারে যখন কিছু গতিশীল এসকিএল তৈরির প্রয়োজন হয় যার জন্য টেবিলের নাম, কলামের নাম এবং সার্ভারের নাম সম্বলিত ভেরিয়েবলের প্রয়োজন হয়। কেবল তার বক্তব্যকে পরিপূরক করার জন্য একটি সাধারণ উদাহরণ দেওয়ার কথা ভেবেছিলেন।

USE Students

DECLARE @TABLE_NAME sysname

SELECT @TABLE_NAME = 'Stud_dtls'

SELECT TABLE_SCHEMA 
  FROM INFORMATION_SCHEMA.Tables
 WHERE TABLE_NAME = @TABLE_NAME

2

sysname দ্বারা ব্যবহৃত হয় sp_send_dbmail , একটি সঞ্চিত পদ্ধতি যা "নির্দিষ্ট প্রাপকদের একটি ইমেল বার্তা প্রেরণ করে" এবং এমএসডিবি ডাটাবেসে অবস্থিত।

মাইক্রোসফ্টের মতে ,

[ @profile_name = ] 'profile_name'  

মেসেজ পাঠানোর জন্য প্রোফাইলের নাম। প্রোফাইল_নামটি এনএসএলএল এর একটি ডিফল্ট সহ সিস্টেমে টাইপ হয়। প্রোফাইল নামটি অবশ্যই বিদ্যমান ডাটাবেস মেল প্রোফাইলের নাম হতে হবে be যখন কোনও প্রোফাইল_নাম নির্দিষ্ট করা থাকে না, sp_send_dbmail বর্তমান ব্যবহারকারীর জন্য ডিফল্ট ব্যক্তিগত প্রোফাইল ব্যবহার করে। ব্যবহারকারীর ডিফল্ট ব্যক্তিগত প্রোফাইল না থাকলে, sp_send_dbmail এমএসডিবি ডাটাবেসের জন্য ডিফল্ট পাবলিক প্রোফাইল ব্যবহার করে। যদি ব্যবহারকারীর ডিফল্ট ব্যক্তিগত প্রোফাইল না থাকে এবং ডাটাবেসের জন্য কোনও ডিফল্ট পাবলিক প্রোফাইল না থাকে তবে @ প্রোফাইলে_নামটি অবশ্যই নির্দিষ্ট করতে হবে।


1

এফডাব্লুআইডাব্লু, আপনি দরকারী সিস্টেম এসপির মতো একটি টেবিলের নামটি এইভাবে পাঠাতে পারেন, আপনি কি কোনও ডাটাবেসটি সেভাবে অন্বেষণ করতে চান:

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

0

আর একটি ব্যবহারের ক্ষেত্রে এসকিউএল সার্ভার ব্যবহার করার সময় 2016+ এর কার্যকারিতা AT TIME ZONE

নীচের বিবৃতিটি GMT তে রূপান্তরিত তারিখ ফিরিয়ে দেবে

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

আপনি সরবরাহ করতে পারেন সেখানে ব্যবহারের কেস আছে?

আপনি যে কোনও জায়গায় ডাটাবেস রক্ষণাবেক্ষণ স্ক্রিপ্টগুলি ব্যবহারের জন্য কোনও বস্তুর নাম সঞ্চয় করতে চান। উদাহরণস্বরূপ, কোনও স্ক্রিপ্ট নির্দিষ্ট সারণী থেকে পুরানো সারিগুলি মুছে দেয় যার একটি তারিখ কলাম রয়েছে। এটি একটি টেবিলের সাথে কনফিগার করা হয়েছে যা ছকটির নাম, ফিল্টার করার জন্য কলামের নাম এবং কত দিন ইতিহাস রাখতে হবে gives অন্য স্ক্রিপ্টটি সিএসভি ফাইলগুলিতে নির্দিষ্ট সারণী ডাম্প করে দেয় এবং আবার টেবিলগুলি ডাম্পের জন্য তালিকাভুক্ত টেবিলের সাথে কনফিগার করা হয়। এই কনফিগারেশন টেবিলগুলি sysnameটেবিল এবং কলামের নাম সঞ্চয় করতে টাইপটি ব্যবহার করতে পারে ।


আপনার মোটেই দরকার নেই। শুধু একটি nvarchar(128) not nullকলাম ব্যবহার করুন । নাম ঠিক সেটাই, একটি নাম। এটি sysnameব্যবহার করার দরকার নেই
পানাগিওটিস কানভোস

অবশ্যই, এবং এটি এমনকি সেই ধরণের হতে পারে না, আপনি টেবিলের নামগুলি ইউনিকোড ব্যবহার না nvarchar(300)করলেও খুব কার্যকর হবে এমনকি varchar(আমি নিশ্চিত যে প্রায় কেউই তা করে না)। এর সুবিধাটি sysnameহ'ল আংশিকভাবে তা স্পষ্ট করে তোলে: এই কলামটিতে একটি বস্তুর নাম রাখা হয়েছে; এবং আংশিকরূপে আপনি এমএসএসকিউএল এর আলাদা সংস্করণে স্থানান্তরিত করেও যা বস্তুর নামগুলির জন্য ব্যবহৃত ডেটার ধরণের পরিবর্তন করে (আগে যেমন হয়েছে), এটি সঠিক ধরণের হতে থাকবে।
এড অ্যাভিস

না এটা হয় না। এটি কেবলমাত্র অন্য এক প্রকারের (মূলত একটি উপনাম) ম্যাপ করা হয়েছে nvarchar(128) NOT NULL। প্রকৃতপক্ষে, user_type_idকলামটির মান পরীক্ষা করে আপনি কীভাবে টাইপটি সন্ধান করতে পারেন । আপনি নিজের ধরণের নিজস্ব ব্যবহারকারী তৈরির চেয়ে এই ধরণের ব্যবহার করে আর কিছুই অর্জন করতে পারবেন না
Panagiotis Kanavos

আপনি কী বোঝাতে চেয়েছেন যে যদি sysnameনতুন এমএসএসকিউএল সংস্করণে সংজ্ঞাটি পরিবর্তন করা হয় এবং ডাটাবেসটিকে ব্যাকআপ করে সেই নতুন উদাহরণে পুনরুদ্ধার করা হয়, তবে পূর্বে যে সমস্ত কলাম ছিল sysnameতা এখন ভুল ধরণের এবং আর ব্যবহৃত ধরণের সাথে আর মেলে না সিস্টেম টেবিলের মধ্যে?
এড অ্যাভিস

এটি, বা আরও খারাপ হতে পারে না যদি তা কখনও ঘটে থাকে, আপনার কলামটি হোজ্জিত। sysnameএটি usert_type_id256 সহ একটি ব্যবহারকারী-সংজ্ঞায়িত টাইপ ALTER TYPEit এটির কোনও পরিবর্তন করার কোনও উপায় নেই। আপনাকে একটি নতুন টাইপ তৈরি করতে হবে এবং সমস্ত কলামগুলি পরিবর্তন করতে হবে যা পুরানো প্রকারটি নতুনটিতে ব্যবহার করে। এমএস যদি কখনও এটি পরিবর্তন করার সিদ্ধান্ত নিয়েছে তবে তাদের বিদ্যমান সিস্টেমের টেবিলের ডেটা নতুন ধরণের স্থানান্তর করতে হবে। আপনি ইতিমধ্যে যে সিস্টেম টেবিলগুলি সম্পর্কে তাদের জানা আছে তাদের জন্য আপনি
এটিটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.