সামঞ্জস্যতা স্তর 80 এর আসল আচরণ কী?


47

সামঞ্জস্যতা মোড বৈশিষ্ট্য সম্পর্কে কেউ কি আমাকে আরও ভাল অন্তর্দৃষ্টি দিতে পারেন? এটি আমার প্রত্যাশার চেয়ে আলাদা আচরণ করছে।

আমি যতটা সামঞ্জস্যতা মোডগুলি বুঝতে পারি, এটি এসকিউএল সার্ভারের বিভিন্ন সংস্করণের মধ্যে নির্দিষ্ট ভাষা কাঠামোর উপলব্ধতা এবং সমর্থন সম্পর্কে।

এটি ডাটাবেস ইঞ্জিন সংস্করণটির অভ্যন্তরীণ কাজগুলিকে প্রভাবিত করে না। এটি পূর্ববর্তী সংস্করণগুলিতে এখনও উপলভ্য নয় এমন বৈশিষ্ট্য এবং নির্মাণের ব্যবহার রোধ করার চেষ্টা করবে।

আমি এসকিউএল সার্ভার ২০০৮ আর 2 তে কমপ্যাট লেভেল 80 সহ একটি নতুন ডাটাবেস তৈরি করেছি। একটি একক আন্ত কলাম দিয়ে একটি সারণী তৈরি করেছে এবং কয়েকটি সারি দিয়ে এটি তৈরি করেছে।

তারপরে একটি row_number()ফাংশন সহ একটি নির্বাচিত বিবৃতি কার্যকর করে।

আমার ধারণা ছিল যেহেতু সারি_নম্বার ফাংশনটি 2005 সালে কেবল চালু হয়েছিল, এটি 80 টি মোডে ত্রুটি ফেলবে।

কিন্তু আমার আশ্চর্যজনকভাবে এটি কাজ করে। তারপরে, অবশ্যই, কমপ্যাট বিধিগুলি কেবল একবার 'কিছু সঞ্চয়' করার সময় মূল্যায়ন করা হয়। সুতরাং আমি আমার সারি_সংখ্যার স্টেটমেন্টের জন্য একটি সঞ্চিত সংগ্রহ তৈরি করেছি।

সঞ্চিত প্রকল্পটি ঠিকঠাক হয়ে গেছে এবং আমি এটি পুরোপুরি কার্যকর করতে পারি এবং ফলাফলগুলি পেতে পারি।

সামঞ্জস্যতা মোডের কাজ আরও ভালভাবে বুঝতে কেউ আমাকে সহায়তা করতে পারে? আমার বোঝা স্পষ্টতই ত্রুটিযুক্ত।

উত্তর:


66

দস্তাবেজগুলি থেকে :

এসকিউএল সার্ভারের নির্দিষ্ট সংস্করণটির সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য নির্দিষ্ট কিছু ডাটাবেস আচরণ সেট করে।
...
সামঞ্জস্যতা স্তরটি এসকিউএল সার্ভারের পূর্ববর্তী সংস্করণগুলির সাথে কেবল আংশিক পশ্চাদপদ সামঞ্জস্যতা সরবরাহ করে। প্রাসঙ্গিক সামঞ্জস্যতা-স্তরীয় সেটিং দ্বারা নিয়ন্ত্রিত আচরণগুলির সংস্করণ পার্থক্যের আশেপাশে কাজ করার জন্য একটি অন্তর্বর্তীকালীন স্থানান্তর সহায়তা হিসাবে সামঞ্জস্যতা স্তরটি ব্যবহার করুন।

আমার ব্যাখ্যায়, সামঞ্জস্যতা মোডটি সিনট্যাক্সের আচরণ এবং বিশ্লেষণ সম্পর্কে, পার্সারের মতো জিনিসগুলির জন্য নয়, "আরে, আপনি ব্যবহার করতে পারবেন না ROW_NUMBER()!" কখনও কখনও নীচের সামঞ্জস্যের স্তরটি আপনাকে সিনট্যাক্সের সাথে আর সমর্থন না করে চালিয়ে যাওয়ার অনুমতি দেয় এবং কখনও কখনও এটি আপনাকে নতুন সিনট্যাক্স কনস্ট্রাক্টস ব্যবহার থেকে বাধা দেয়। ডকুমেন্টেশনটি বেশ কয়েকটি সুস্পষ্ট উদাহরণের তালিকা দেয় তবে এখানে কয়েকটি বিক্ষোভ প্রদর্শন করা হচ্ছে:


ফাংশন আর্গুমেন্ট হিসাবে অন্তর্নির্মিত ফাংশনগুলি পাস করা

এই কোডটি 90++ এর সামঞ্জস্যের স্তরে কাজ করে:

SELECT *
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL);

তবে 80 এ এটির ফল দেয়:

এমএসজি 102, স্তর 15,
' 1 ' এর নিকটবর্তী স্থিতি ভুল সিনট্যাক্স।

এখানে নির্দিষ্ট সমস্যাটি হ'ল 80 এ আপনাকে কোনও ফাংশনে বিল্ট-ইন ফাংশনটি পাস করার অনুমতি দেওয়া হয় না। আপনি যদি 80 টি সামঞ্জস্যতা মোডে থাকতে চান তবে আপনি এই কথাটি বলে কাজ করতে পারেন:

DECLARE @db_id INT = DB_ID();

SELECT * 
FROM sys.dm_db_index_physical_stats(@db_id, NULL, NULL, NULL, NULL);

একটি সারণী-মূল্যবান ফাংশনে একটি টেবিলের ধরণটি পাস করা

উপরের মতো, টিভিপি ব্যবহার করে এবং এটি কোনও টেবিল-মূল্যবান ফাংশনে পাস করার চেষ্টা করার সময় আপনি একটি বাক্য গঠন ত্রুটি পেতে পারেন। এটি আধুনিক তুলনামূলক স্তরে কাজ করে:

CREATE TYPE dbo.foo AS TABLE(bar INT);
GO
CREATE FUNCTION dbo.whatever
(
  @foo dbo.foo READONLY
)
RETURNS TABLE
AS 
  RETURN (SELECT bar FROM @foo);
GO

DECLARE @foo dbo.foo;
INSERT @foo(bar) SELECT 1;
SELECT * FROM dbo.whatever(@foo);

যাইহোক, সামঞ্জস্যতা স্তরটি 80 এ পরিবর্তন করুন এবং আবার শেষ তিনটি লাইন চালান; আপনি এই ত্রুটি বার্তা পান:

এমএসজি 137, স্তর 16, রাজ্য 1, লাইন 19
অবশ্যই স্কেলার ভেরিয়েবল "@ foo" ঘোষণা করতে হবে।

আমার মাথার উপরের দিক থেকে সত্যিই কোনও ভাল কাজ নয়, অন্যটি কমপ্যাট স্তরের আপগ্রেড করা বা ফলাফলগুলি ভিন্নভাবে পাওয়া ছাড়া।


APPLY এ যোগ্য কলামের নাম ব্যবহার করা

90 টি সামঞ্জস্যতা মোড এবং তারপরে, আপনি সমস্যা ছাড়াই এটি করতে পারেন:

SELECT * FROM sys.dm_exec_cached_plans AS p
  CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t;

যাইহোক, 80 সামঞ্জস্যতা মোডে, ফাংশনটির হাতে দেওয়া যোগ্য কলামটি একটি জেনেরিক সিনট্যাক্স ত্রুটি উত্থাপন করে:

এমএসজি ১০২, স্তর 15, রাজ্য 1
ভুল সংশ্লেষ 'কাছে।


কলামের নামের সাথে মেলে এমন একটি উপাধি অর্ডার করুন

এই প্রশ্নটি বিবেচনা করুন:

SELECT name = REVERSE(name), realname = name 
FROM sys.all_objects AS o
ORDER BY o.name;

80 সামঞ্জস্যতা মোডে, ফলাফলগুলি নিম্নরূপ:

001_ofni_epytatad_ps   sp_datatype_info_100
001_scitsitats_ps      sp_statistics_100
001_snmuloc_corps_ps   sp_sproc_columns_100
...

90 সামঞ্জস্যতা মোডে, ফলাফলগুলি একেবারে পৃথক:

snmuloc_lla      all_columns
stcejbo_lla      all_objects
sretemarap_lla   all_parameters
...

কারন? 80 সামঞ্জস্যতা মোডে, সারণী উপসর্গ পুরোপুরি উপেক্ষা করা হবে, সুতরাং এটি তালিকার উপদ্বারা দ্বারা সংজ্ঞায়িত এক্সপ্রেশন দ্বারা আদেশ করছে SELECT। আরও নতুন সামঞ্জস্যের স্তরগুলিতে, সারণী উপসর্গ বিবেচনা করা হয়, সুতরাং এসকিউএল সার্ভার আসলে সেই কলামটি টেবিলটিতে ব্যবহার করবে (যদি এটি পাওয়া যায়)। যদি ORDER BYউপনামটি টেবিলটিতে পাওয়া যায় না, তবে নতুন সামঞ্জস্যের মাত্রাগুলি অস্পষ্টতার বিষয়ে এতটা ক্ষমা করবেন না। এই উদাহরণ বিবেচনা করুন:

SELECT myname = REVERSE(name), realname = name 
FROM sys.all_objects AS o
ORDER BY o.myname;

ফলাফলটি myname80 এ প্রকাশের দ্বারা অর্ডার করা হয় , কারণ আবার সারণির উপসর্গটি উপেক্ষা করা হয়, তবে 90 এ এটি এই ত্রুটি বার্তা উত্পন্ন করে:

Msg 207, স্তর 16, রাজ্য 1, লাইন 3
অবৈধ কলামের নাম 'আমার নাম'।

ডকুমেন্টেশনে এগুলিও সমস্ত ব্যাখ্যা করা হয়েছে :

তালিকার কলাম রেফারেন্সগুলিকে ORDER BYতালিকায় সংজ্ঞায়িত কলামগুলিতে আবদ্ধ করার সময় SELECTকলামের দ্ব্যর্থতা উপেক্ষা করা হয় এবং কলামের উপসর্গগুলি কখনও কখনও উপেক্ষা করা হয়। এর ফলে ফলাফলটি অপ্রত্যাশিত ক্রমে ফিরে আসতে পারে।

উদাহরণস্বরূপ, একটি ORDER BYদ্বি-অংশ কলাম ( <table_alias>.<column>) সহ একটি ধারা যা একটি নির্বাচনী তালিকার একটি কলামের রেফারেন্স হিসাবে ব্যবহৃত হয় তা গৃহীত হয়, তবে টেবিলের নামটি উপেক্ষা করা হয়। নিম্নলিখিত কোয়েরি বিবেচনা করুন।

SELECT c1 = -c1 FROM t_table AS x ORDER BY x.c1

যখন মৃত্যুদন্ড কার্যকর, কলাম prefix মধ্যে উপেক্ষা করা হয় ORDER BYx.c1প্রত্যাশিত হিসাবে নির্দিষ্ট উত্স কলামে ( ) সাজানোর ক্রিয়াকলাপটি ঘটে না ; পরিবর্তে এটি উদ্ভূত উপর ঘটেc1ক্যোরিতে সংজ্ঞায়িত কলাম। এই কোয়েরির এক্সিকিউশন প্ল্যান দেখায় যে উত্পন্ন কলামের মানগুলি প্রথমে গণনা করা হয় এবং তারপরে গণিত মানগুলি বাছাই করা হয়।


কিছু নির্বাচন করুন নির্বাচন করুন তালিকায় নেই

90 সামঞ্জস্যতা মোডে আপনি এটি করতে পারবেন না:

SELECT name = COALESCE(a.name, '') FROM sys.objects AS a
UNION ALL
SELECT name = COALESCE(a.name, '') FROM sys.objects AS a
ORDER BY a.name;

ফলাফল:

এমএসজি 104, স্তর 16, রাজ্য 1
অর্ডার বা আইটেমগুলির অবশ্যই নির্বাচিত তালিকায় উপস্থিত থাকতে হবে যদি বিবৃতিতে একটি ইউনিয়ন, ইন্টারসেক্ট বা এক্সেসপটি অপারেটর থাকে।

যদিও 80 এ, আপনি এখনও এই সিনট্যাক্সটি ব্যবহার করতে পারেন।


পুরাতন, চটকদার বাইরের সাথে যোগ দেয়

80 মোড আপনাকে পুরানো, অবহিত বাইরের জোড় সিনট্যাক্স ( *=/=*) ব্যবহার করার অনুমতি দেয় :

SELECT o.name, c.name
FROM sys.objects AS o, sys.columns AS c
WHERE o.[object_id] *= c.[object_id];

এসকিউএল সার্ভার ২০০৮ / ২০০৮ আর ২-এ, আপনি যদি 90 বা তার বেশি হন তবে আপনি এই ভারবজ বার্তাটি পাবেন:

এমএসজি 4147, স্তর 15, রাজ্য 1
ক্যোয়ারিতে নন-এএনএসআই বহিরাগত যোগদানের অপারেটরগুলি (" *=" বা " =*") ব্যবহার করা হয়েছে। এই কোয়েরিটি পরিবর্তন না করে চালানোর জন্য, দয়া করে ALTER DATABASE এর SET COMPATIBILITY_LEVEL বিকল্পটি ব্যবহার করে বর্তমান ডাটাবেসের জন্য সামঞ্জস্যতা স্তরটি 80 এ সেট করুন। এএনএসআই আউটার বাইরের যোগদানকারী অপারেটর (বাম আউটর জয়েন, রাইট আউটর জয়েন) ব্যবহার করে কোয়েরিটি পুনরায় লেখার জন্য দৃ strongly়ভাবে সুপারিশ করা হয়। এসকিউএল সার্ভারের ভবিষ্যতের সংস্করণগুলিতে, নন-এএনএসআই যোগদানকারী অপারেটরগুলি এমনকি পশ্চাদপদ-সামঞ্জস্যতা মোডগুলিতে সমর্থিত হবে না।

এসকিউএল সার্ভার ২০১২-এ, এটি মোটেও বৈধ বাক্য গঠন নয় এবং নিম্নলিখিতটি প্রদান করে:

এমএসজি 102, স্তর 15, রাজ্য 1, লাইন 3
'* =' এর নিকটে ভুল সিনট্যাক্স।

অবশ্যই এসকিউএল সার্ভার ২০১২-তে আপনি সামঞ্জস্যতা স্তরটি ব্যবহার করে আর এই সমস্যাটি ঘটাতে পারবেন না, যেহেতু 80 টি আর সমর্থিত নয়। আপনি যদি ৮০ টি কমপ্যাট মোডে কোনও ডাটাবেস আপগ্রেড করেন (ইন-প্লেস আপগ্রেড, বিচ্ছিন্ন / সংযুক্তি, ব্যাকআপ / পুনরুদ্ধার, লগ শিপিং, মিররিং ইত্যাদি) এটি স্বয়ংক্রিয়ভাবে আপনার জন্য 90 এ আপগ্রেড হবে।


সঙ্গে টেবিল ইঙ্গিত

80 কমপ্যাট মোডে, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন এবং টেবিলের ইঙ্গিতটি পর্যবেক্ষণ করা হবে:

SELECT * FROM dbo.whatever NOLOCK; 

90+ তে, এটি NOLOCKএখন কোনও টেবিলের ইঙ্গিত নয়, এটি একটি উপনাম। অন্যথায়, এটি কাজ করবে:

SELECT * FROM dbo.whatever AS w NOLOCK;

তবে এটি হয় না:

Msg 1018, স্তর 15,
'NOLOCK' এর নিকটস্থ রাজ্য 1 ভুল সিনট্যাক্স। যদি এটি কোনও টেবিলের ইঙ্গিতের অংশ হিসাবে চিহ্নিত করা হয়, তবে এখন উইথ কীওয়ার্ড এবং প্রথম বন্ধনী প্রয়োজন। সঠিক সিনট্যাক্সের জন্য এসকিউএল সার্ভার বই অনলাইন দেখুন।

এখন, প্রমাণ করার জন্য যে আচরণটি প্রথম উদাহরণে পর্যবেক্ষণ করা হয় না যখন 90 কমপ্যাট মোডে থাকে, অ্যাডভেঞ্চার ওয়ার্কস (এটি উচ্চতর কম্পাটার স্তরে রয়েছে তা নিশ্চিত করে) ব্যবহার করুন এবং নিম্নলিখিতগুলি চালান:

BEGIN TRANSACTION;
SELECT TOP (1) * FROM Sales.SalesOrderHeader UPDLOCK;
SELECT * FROM sys.dm_tran_locks 
  WHERE request_session_id = @@SPID
  AND resource_type IN ('KEY', 'OBJECT'); -- how many rows here? 0
COMMIT TRANSACTION;

BEGIN TRANSACTION;
SELECT TOP (1) * FROM Sales.SalesOrderHeader WITH (UPDLOCK);
SELECT * FROM sys.dm_tran_locks
  WHERE request_session_id = @@SPID
  AND resource_type IN ('KEY', 'OBJECT'); -- how many rows here? 2
COMMIT TRANSACTION;

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


নতুন তারিখ / সময় প্রকারের সাথে জড়িত রূপান্তর

এসকিউএল সার্ভার ২০০৮-এ প্রবর্তিত নতুন তারিখ / সময়ের ধরণগুলি (যেমন dateএবং datetime2) মূল datetimeএবং এর চেয়ে অনেক বড় পরিসরকে সমর্থন করে smalldatetime)। সমর্থিত সীমার বাইরে মানগুলির সুস্পষ্ট রূপান্তরগুলি সামঞ্জস্যতা স্তরটি নির্বিশেষে ব্যর্থ হবে, উদাহরণস্বরূপ:

SELECT CONVERT(SMALLDATETIME, '00010101');

উৎপাদনের:

এমএসজি 242, স্তর 16, রাজ্য 3
একটি বার্ড ডেটা টাইপকে একটি ছোট সময়কালীন ডেটা টাইপের রূপান্তরকরণের ফলে সীমার মান ছাড়িয়ে যায়।

যাইহোক, অন্তর্নিহিত রূপান্তরগুলি নতুন সামঞ্জস্যতার স্তরে তাদের কাজ করবে। উদাহরণস্বরূপ এটি 100+ এ কাজ করবে:

SELECT DATEDIFF(DAY, CONVERT(SMALLDATETIME, SYSDATETIME()), '00010101');

তবে ৮০ (এবং 90-এও), এটি উপরের মতো একই ধরণের ত্রুটি দেয়:

এমএসজি 242, স্তর 16, রাজ্য 3
একটি বারচার ডেটা টাইপকে একটি ডেটটাইম ডেটা টাইপের রূপান্তরকরণের ফলে সীমার মান ছাড়িয়ে যায়।


ট্রিগারগুলিতে ক্লজগুলির জন্য রিডানড্যান্ট

এটি এখানে একটি অস্পষ্ট পরিস্থিতি প্রকাশিত হয়েছিল । 80 সামঞ্জস্যতা মোডে, এটি সফল হবে:

CREATE TABLE dbo.x(y INT);
GO
CREATE TRIGGER tx ON dbo.x
FOR UPDATE, UPDATE
------------^^^^^^ notice the redundant UPDATE
AS PRINT 1;

90 টি সামঞ্জস্যতা এবং উচ্চতর ক্ষেত্রে এটি আর বিশ্লেষণ করে না এবং পরিবর্তে আপনি নিম্নলিখিত ত্রুটি বার্তাটি পান:

এমএসজি 1034, স্তর 15, রাজ্য 1, প্রক্রিয়া tx
সিনট্যাক্স ত্রুটি: ট্রিগার ঘোষণায় ক্রিয়াকলাপের "আপডেট" D


পিভট / UNPIVOT

সিনট্যাক্সের কিছু ফর্ম 80 এর অধীনে কাজ করবে না (তবে 90+ তে ঠিক কাজ করবে):

SELECT col1, col2
FROM dbo.t1
UNPIVOT (value FOR col3 IN ([x],[y])) AS p;

এই ফলন:

এমএসজি 156, স্তর 15, স্টেট 1
'এর' কীওয়ার্ডের নিকটে ভুল সিনট্যাক্স।

কিছু সমাধান নীচে উপস্থিত জন্য সহ CROSS APPLY, দেখুন এই উত্তরগুলোর


নতুন অন্তর্নির্মিত ফাংশন

TRY_CONVERT()সামঞ্জস্যতা স্তরের সাথে একটি ডাটাবেসে যেমন নতুন ফাংশন ব্যবহার করার চেষ্টা করুন <110. এগুলি কেবল সেখানে স্বীকৃত নয়।

SELECT TRY_CONVERT(INT, 1);

ফলাফল:

Msg 195, স্তর 15, রাজ্য 10
'TRY_CONVERT' স্বীকৃত অন্তর্নির্মিত ফাংশনটির নাম নয়।


সুপারিশ

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


1
স্পষ্টতই এটি আমার চেয়ে ভাল উত্তর!
ম্যাক্স ভার্নন

এই বিস্তৃত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ, হারুন! এবং আমার অসংখ্য বানান ভুল সংশোধন করার জন্য।
স্যুপ্লেক্স

1
এসকিউএল সার্ভার ২০১৪ সামঞ্জস্যতার নোটগুলি এখানে পাওয়া গেছে: msdn.microsoft.com/en-us/library/bb510680(v=sql.120).aspx
জোশ গালাগের

9

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

আরও তথ্যের জন্য http://msdn.microsoft.com/en-us/library/bb510680.aspx দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.