সুতরাং, CAST
দূরবর্তী উদাহরণে নয়, স্থানীয়ভাবে কাজটি করা হচ্ছে তা বুঝতে পেরে আমি ত্রুটিটি পুনরুত্পাদন করতে সক্ষম হয়েছি । আমি এর আগে এটি ঠিক করার আশায় এসপি 3-তে এগিয়ে যাওয়ার প্রস্তাব দিয়েছিলাম (এসপি 3 এর ত্রুটিটি পুনরায় উত্পাদন করতে না পারার কারণে এবং এটি একটি ভাল ধারণা নির্বিশেষে আংশিক কারণে)) যাইহোক, এখন আমি ত্রুটিটি পুনরুত্পাদন করতে পারি, এটি স্পষ্ট যে এসপি 3-এ উঠে যাওয়া, যদিও এখনও সম্ভবত একটি ভাল ধারণা, এটি ঠিক করতে যাচ্ছে না। এবং আমি এসকিউএল সার্ভার 2008 আর 2 আরটিএম এবং 2014 এসপি 1 (তিনটি ক্ষেত্রে "লুপ-ব্যাক" স্থানীয় লিঙ্কযুক্ত সার্ভার ব্যবহার করে) ত্রুটিটিও পুনরুত্পাদন করেছি।
মনে হচ্ছে এই সমস্যার সঙ্গে কি আছে যে যেখানে ক্যোয়ারী নির্বাহ করা হয়, অথবা অন্তত যেখানে অংশ (গুলি) এটি নির্বাহ করছে। আমি এটি বলছি কারণ আমি CAST
অপারেশনটি কাজ করতে সক্ষম হয়েছি , তবে কেবলমাত্র স্থানীয় ডিবি অবজেক্টের রেফারেন্স অন্তর্ভুক্ত করে:
SELECT rmt.*, CAST(NULL AS UNIQUEIDENTIFIER) AS [GUID]
FROM [Local].[database_name].[dbo].[table_name] rmt
CROSS JOIN (SELECT TOP (1) 1 FROM [sys].[data_spaces]) tmp(dummy);
এটি আসলে কাজ করে। তবে নিম্নলিখিতটি মূল ত্রুটি পায়:
SELECT rmt.*, CAST(NULL AS UNIQUEIDENTIFIER) AS [GUID]
FROM [Local].[database_name].[dbo].[table_name] rmt
CROSS JOIN (VALUES (1)) tmp(dummy);
আমি অনুমান করছি যে যখন কোনও স্থানীয় রেফারেন্স নেই তখন পুরো ক্যোয়ারীটি কার্যকর করা দূরবর্তী সিস্টেমে প্রেরণ করা হয় এবং কোনও কারণে NULL
এসগুলিতে রূপান্তর করা যায় না UNIQUEIDENTIFIER
বা সম্ভবত NULL
এটি ওএলডি ডিবি ড্রাইভার দ্বারা ভুলভাবে অনুবাদ করা হচ্ছে।
আমি যে পরীক্ষার কাজ করেছি তার উপর ভিত্তি করে এটি একটি বাগ হিসাবে উপস্থিত হবে তবে আমি নিশ্চিত নই যে বাগটি এসকিউএল সার্ভারের মধ্যে রয়েছে বা এসকিউএল সার্ভার নেটিভ ক্লায়েন্ট / ওএইলডিবি ড্রাইভারের মধ্যে রয়েছে কিনা। যাইহোক, রূপান্তর ত্রুটি OLEDB চালক মধ্যে ঘটে, এবং তাই অগত্যা থেকে রূপান্তর কোনো সমস্যা হয় না INT
করতে UNIQUEIDENTIFIER
চালক যেহেতু (ক রূপান্তর যা SQL সার্ভার অনুমোদিত নয়) SQL সার্ভার ব্যবহার করছে না ধর্মান্তর (SQL সার্ভার এছাড়াও না করতে রূপান্তর INT
করার অনুমতি দিন DATE
, তবুও OLEDB ড্রাইভার সফলভাবে পরিচালনা করে যা পরীক্ষার একটিতে দেখানো হয়েছে)।
আমি তিনটি পরীক্ষা চালিয়েছি। সফল হওয়া দুজনের জন্য, আমি এক্সএমএল কার্যকর করার পরিকল্পনাগুলি দেখেছি যা দূরবর্তীভাবে কার্যকর করা হচ্ছে এমন ক্যোয়ারী দেখায়। তিনটির জন্যই, এসকিউএল প্রোফাইলারের মাধ্যমে আমি কোনও ব্যতিক্রম বা OLEDB ইভেন্ট ক্যাপচার করেছি:
ইভেন্ট:
- ত্রুটি এবং সতর্কতা
- মনোযোগ
- ব্যতিক্রম
- কার্যকর করার সতর্কতা
- ব্যবহারকারীর ত্রুটির বার্তা
- OLEDB
- TSQL
- ব্যতীত সমস্ত :
- এসকিউএল: StmtRecompile
- এক্সকিয়ার স্ট্যাটিক প্রকার
কলাম ফিল্টার:
পরীক্ষাগুলো
পরীক্ষা 1
CAST(NULL AS UNIQUEIDENTIFIER)
ওই কাজগুলো
SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
, (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
FROM [Local].[TEMPTEST].[sys].[objects] rmt;
এক্সএমএল বাস্তবায়ন পরিকল্পনার প্রাসঙ্গিক অংশ:
<DefinedValue>
<ColumnReference Column="Expr1002" />
<ScalarOperator ScalarString="NULL">
<Const ConstValue="NULL" />
</ScalarOperator>
</DefinedValue>
...
<RemoteQuery RemoteSource="Local" RemoteQuery=
"SELECT 1 FROM "TEMPTEST"."sys"."objects" "Tbl1001""
/>
পরীক্ষা 2
CAST(NULL AS UNIQUEIDENTIFIER)
যে ব্যর্থ
SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
-- , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
FROM [Local].[TEMPTEST].[sys].[objects] rmt;
(দ্রষ্টব্য: আমি সাবকিউটি সেখানে রেখেছি, মন্তব্য করেছি, যাতে এক্সএমএল ট্রেস ফাইলগুলির তুলনা করার সময় এটির চেয়ে কম পার্থক্য হবে)
পরীক্ষা 3
CAST(NULL AS DATE)
ওই কাজগুলো
SELECT TOP (2) CAST(NULL AS DATE) AS [Something]
-- , (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
FROM [Local].[TEMPTEST].[sys].[objects] rmt;
(দ্রষ্টব্য: আমি সাবকিউটি সেখানে রেখেছি, মন্তব্য করেছি, যাতে এক্সএমএল ট্রেস ফাইলগুলির তুলনা করার সময় এটির চেয়ে কম পার্থক্য হবে)
এক্সএমএল বাস্তবায়ন পরিকল্পনার প্রাসঙ্গিক অংশ:
<DefinedValue>
<ColumnReference Column="Expr1002" />
<ScalarOperator ScalarString="[Expr1002]">
<Identifier>
<ColumnReference Column="Expr1002" />
</Identifier>
</ScalarOperator>
</DefinedValue>
...
<RemoteQuery RemoteSource="Local" RemoteQuery=
"SELECT TOP (2) NULL "Expr1002" FROM "TEMPTEST"."sys"."objects" "Tbl1001""
/>
যদি আপনি পরীক্ষা # 3 দেখুন, এটি SELECT TOP (2) NULL
"রিমোট" সিস্টেমে একটি করছে । এসকিউএল প্রোফাইলার ট্রেস দেখায় যে এই প্রত্যন্ত ক্ষেত্রের ডেটাটাইপ আসলে INT
। ট্রেসটি আরও দেখায় যে ক্লায়েন্টের ক্ষেত্রের ক্ষেত্রটি (যেখানে আমি কোয়েরিটি চালাচ্ছি) DATE
প্রত্যাশার মতো। থেকে রুপান্তরের INT
জন্য DATE
, কিছু যা SQL সার্ভার একটি ত্রুটি পাবেন, OLEDB চালক মধ্যে মাত্র কাজ করে জরিমানা। রিমোট মান হয় NULL
, সুতরাং এটি সরাসরি ফিরে আসে, সুতরাং <ColumnReference Column="Expr1002" />
।
আপনি যদি পরীক্ষা # 1 এর দিকে লক্ষ্য SELECT 1
করেন তবে এটি "রিমোট" সিস্টেমে একটি করছে । এসকিউএল প্রোফাইলার ট্রেস দেখায় যে এই প্রত্যন্ত ক্ষেত্রের ডেটাটাইপ আসলে INT
। ট্রেসটি আরও দেখায় যে ক্লায়েন্টের ক্ষেত্রের ক্ষেত্রটি (যেখানে আমি কোয়েরিটি চালাচ্ছি) GUID
প্রত্যাশার মতো। থেকে রুপান্তরের INT
জন্য GUID
(মনে রাখবেন, এই ড্রাইভার মধ্যে সম্পন্ন করা হয়, এবং OLEDB এটা কল "GUID"), যা SQL সার্ভার একটি ত্রুটি পাবেন, OLEDB চালক মধ্যে মাত্র কাজ করে জরিমানা। রিমোট মানটি হয় না NULL
, সুতরাং এটি আক্ষরিক সাথে প্রতিস্থাপন করা হয় NULL
, সুতরাং <Const ConstValue="NULL" />
।
পরীক্ষা # 2 ব্যর্থ হয়, তাই কার্যকর করার কোনও পরিকল্পনা নেই। তবে এটি সফলভাবে "রিমোট" সিস্টেমটিকে জিজ্ঞাসাবাদ করে তবে ফলাফলের সেটটি আর পাস করতে পারে না। এসকিউএল প্রোফাইলার যে ক্যোয়ারীটি ধরেছিল তা হ'ল:
SELECT TOP (2) NULL "Expr1002" FROM "TEMPTEST"."sys"."objects" "Tbl1001"
এটি ঠিক একই প্রশ্নটি যা টেস্ট # 1 এ করা হচ্ছে, তবুও এখানে এটি ব্যর্থ হচ্ছে। অন্যান্য ছোটখাটো পার্থক্য রয়েছে তবে আমি ওএইএলডিবি যোগাযোগের পুরোপুরি ব্যাখ্যা করতে পারি না। তবে, দূরবর্তী ক্ষেত্রটি এখনও INT
(ডাব্লুটাইপ = 3 = অ্যাডিন্টিজার / ফোর-বাইট স্বাক্ষরিত পূর্ণসংখ্যার / DBTYPE_I4) হিসাবে প্রদর্শিত হচ্ছে যখন "ক্লায়েন্ট" ক্ষেত্রটি এখনও GUID
(ডাব্লুটাইপ = 72 = অ্যাডজিইউডি / বিশ্বব্যাপী অনন্য শনাক্তকারী / ডিবিটিওয়াইপিত) হিসাবে প্রদর্শিত হচ্ছে। , OLE DB ব্যবহার ডকুমেন্টেশন যতটা সাহায্য না GUID ডাটা টাইপ রূপান্তর , DBDATE ডাটা টাইপ রূপান্তর , এবং I4 ডাটা টাইপ রূপান্তর দেখায় যে থেকে রূপান্তর I4 হয় GUID বা DBDATE অসমর্থিত, এখনো DATE
ক্যোয়ারী কাজ করে।
তিনটি পরীক্ষার জন্য ট্রেস এক্সএমএল ফাইলগুলি পেস্টবিনে অবস্থিত। প্রতিটি পরীক্ষা অন্যের থেকে কোথায় আলাদা হয় তার বিশদটি যদি আপনি দেখতে চান তবে আপনি স্থানীয়ভাবে সেগুলি সংরক্ষণ করতে পারেন এবং তারপরে একটি "ডিফার" করতে পারেন। ফাইলগুলি হ'ল:
- NullGuidSuccess.xml
- NullGuidError.xml
- NullDateSuccess.xml
অতএব?
এটা সম্পর্কে কি করতে হবে? সম্ভবত কেবলমাত্র কাজটির চারপাশে আমি শীর্ষ বিভাগে উল্লেখ করেছি যে এসকিউএল নেটিভ ক্লায়েন্ট - SQLNCLI11
- এসকিউএল সার্ভার ২০১২ হিসাবে অবমূল্যায়িত হয়েছে। শীর্ষ:
সতর্কতা
এসকিউএল সার্ভার নেটিভ ক্লায়েন্ট (এসএনএসি) এসকিউএল সার্ভার ২০১২ এর বাইরে সমর্থিত নয় new নতুন বিকাশের কাজে এসএনএসি ব্যবহার করা থেকে বিরত থাকুন এবং বর্তমানে এটি ব্যবহার করা অ্যাপ্লিকেশনগুলিকে সংশোধন করার পরিকল্পনা করুন। SQL সার্ভার জন্য Microsoft ODBC ড্রাইভারের মাইক্রোসফট SQL সার্ভার এবং মাইক্রোসফট নভোনীল SQL ডাটাবেস উইন্ডোজ থেকে নেটিভ সংযোগ প্রদান করে।
আরও তথ্যের জন্য, দয়া করে দেখুন:
ওডিবিসি ??
আমি এর মাধ্যমে একটি ওডিবিসি লিঙ্কযুক্ত সার্ভার সেট আপ করেছি:
EXEC master.dbo.sp_addlinkedserver
@server = N'LocalODBC',
@srvproduct=N'{my_server_name}',
@provider=N'MSDASQL',
@provstr=N'Driver={SQL Server};Server=(local);Trusted_Connection=Yes;';
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'LocalODBC',
@useself=N'True',
@locallogin=NULL,
@rmtuser=NULL,
@rmtpassword=NULL;
এবং তারপরে চেষ্টা করেছেন:
SELECT CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
FROM [LocalODBC].[tempdb].[sys].[objects] rmt;
এবং নিম্নলিখিত ত্রুটি পেয়েছি:
ওএলই ডিবি সরবরাহকারী "এমএসডিএএসকিউএল" লিঙ্কযুক্ত সার্ভারের জন্য "লোকালডোবিসি" বার্তা ফিরে এসেছে "অনুরোধ করা রূপান্তরটি সমর্থিত নয়।"
এমএসজি 7341, স্তর 16, রাজ্য 2, লাইন 53
কলামের বর্তমান সারি মান "(ব্যবহারকারী উত্পন্ন এক্সপ্রেশন) পেতে পারে না। লিঙ্কযুক্ত সার্ভার" লোকালোডিবিসি "এর জন্য ওএলই ডিবি সরবরাহকারী" এমএসডিএএসকিউএল "থেকে এক্সপ্র 100100"।
দ্রষ্টব্য
এটি যেমন দূরবর্তী এবং স্থানীয় সার্ভারগুলির মধ্যে জিআইডিগুলি পরিবহনের সাথে সম্পর্কিত, নন-নুল মানগুলি একটি বিশেষ সিনট্যাক্সের মাধ্যমে পরিচালিত হয়। আমি দৌড়ানোর সময় এসকিউএল প্রোফাইলার ট্রেসে নিম্নলিখিত ওএল ডিবি ইভেন্টের তথ্যটি লক্ষ্য করেছি CAST(0x00 AS UNIQUEIDENTIFIER)
:
<RemoteQuery RemoteSource="Local" RemoteQuery=
"SELECT {guid'00000000-0000-0000-0000-000000000000'} "Expr1002" FROM "TEMPTEST"."sys"."objects" "Tbl1001""
/>
PPS
আমিও মাধ্যমে পরীক্ষিত OPENQUERY
নিম্নলিখিত প্রশ্নের সাথে সাথে
SELECT TOP (2) CAST(NULL AS UNIQUEIDENTIFIER) AS [Something]
--, (SELECT COUNT(*) FROM sys.[data_spaces]) AS [lcl]
FROM OPENQUERY([Local], N'SELECT 705 AS [dummy] FROM [TEMPTEST].[sys].[objects];') rmt;
এবং এটি সফল হয়েছে, এমনকি স্থানীয় অবজেক্টের রেফারেন্স ছাড়াই। এসকিউএল প্রোফাইলার ট্রেস এক্সএমএল ফাইলটি এখানে পেস্টবিনে পোস্ট করা হয়েছে:
NullGuidSuccessOPENQUERY.xml
এক্সএমএল সম্পাদন পরিকল্পনা NULL
টেস্ট # 1 এর মতো একটি ধ্রুবক ব্যবহার করে এটি দেখায় ।