কেন এই স্পষ্ট কাস্ট কেবলমাত্র একটি লিঙ্কযুক্ত সার্ভারে সমস্যা সৃষ্টি করছে?


21

উত্স সার্ভারের একটি ভিউয়ের মাধ্যমে আমি কোনও লিঙ্কযুক্ত সার্ভার থেকে ডেটা জিজ্ঞাসা করছি। দৃশ্য যেমন আদর্শায়িত কলাম, একটি দম্পতি অন্তর্ভুক্ত করা হয়েছে Created, Modifiedএবং Deleted, কিন্তু এই ক্ষেত্রে উৎস সার্ভারে টেবিল কোনো উপযুক্ত তথ্য নেই। কলামগুলি স্বতন্ত্রভাবে তাদের প্রকারে প্রেরণ করা হয়। আমি ভিউ আপডেট করেছি, থেকে একটি কলাম পরিবর্তন করছি

NULL AS Modified

থেকে

CAST(NULL as DateTime) as Modified

তবে এই আপডেটটি সম্পাদন করার পরে, ভিউটি নিম্নলিখিত ত্রুটি বার্তাকে ট্রিগার করছে:

এমএসজি 7341, স্তর 16, রাজ্য 2, লাইন 3 কলামের বর্তমান সারির মান পেতে পারে না (ব্যবহারকারী উত্পন্ন অভিব্যক্তি) linkedএলই ডিবি সরবরাহকারী "এসকিউএলএনসিএলআই 11" এর সাথে সংযুক্ত সার্ভারের জন্য "" এক্সপ্রেস 1002 ""।

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

সার্ভার সংস্করণ (উত্স):

মাইক্রোসফ্ট এসকিউএল সার্ভার 2012 - 11.0.5058.0 (X64) মে 14 2014 18:34:29 কপিরাইট (গ) মাইক্রোসফ্ট কর্পোরেশন এন্টারপ্রাইজ সংস্করণ (-৪-বিট) উইন্ডোজ এনটি 6.1 (বিল্ড 7601: সার্ভিস প্যাক 1) (হাইপারভাইজার)

সার্ভার সংস্করণ (সংযুক্ত):

মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮ আর 2 (এসপি 1) - 10.50.2500.0 (এক্স 64) জুন 17 2011 00:54:03 কপিরাইট (সি) উইন্ডোজ এনটি 6.1 তে মাইক্রোসফ্ট কর্পোরেশন এন্টারপ্রাইজ সংস্করণ (-৪-বিট) (বিল্ড 7601: সার্ভিস প্যাক 1) (হাইপারভাইজার )

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

ভ্রষ্ট কাস্ট ডেটটাইমে কাস্টের সাথে ঘটে না, তবে কলামটি ইউনিকআইডেন্টিফায়ারে কাস্ট করার সাথে ঘটে।

এই অপরাধী:

CAST(NULL AS UniqueIdentifier) AS [GUID]

ইউনিক আইডেন্টিফায়ারগুলি এসকিউএল সার্ভার ২০০৮ আর 2 তে সমর্থিত এবং মন্তব্যগুলিতে উল্লিখিত হিসাবে, ভিউ দ্বারা সম্পাদিত ক্যোয়ারী লিঙ্কযুক্ত সার্ভারে সূক্ষ্মভাবে চালিত হয়।


আপনার কি প্রতিটি সার্ভারে আলাদা আলাদা এএনএসআই নুল সেটিং আছে? বিভিন্ন কোলেশন?
র্যান্ডলফ ওয়েস্ট

উভয় সার্ভারে এএনএসআই নুল = ০ রয়েছে Orig অরিজিন সার্ভারের কোলেশন রয়েছে Danish_Norwegian_CI_ASএবং লিঙ্কযুক্ত সার্ভারটির কোলেশন রয়েছে SQL_Danish_Pref_CP1_CI_AS, তবে COLLATEধারাটি DateTimeকলামগুলিতে প্রয়োগ করা যায় না , তাই আমি আরও কিছু পাইনি!
ক্রিস্তাহ

উইথ select Null from ...বা নেস্টেড কোয়েরিতে এবং CASTঅন্যটিতে থাকলে এটি কি ব্যর্থ হবে ?
স্টোলেগ

সুস্পষ্ট কাস্ট ব্যতীত এটির হিসাবে এমন আচরণ করা হবে INTযাতে আপনি এটি করে ডাটাটাইপ পরিবর্তন করেছেন। আমি জানি না যে কেন এটি আপনাকে সেই ত্রুটি বার্তা দেবে।
মার্টিন স্মিথ

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

উত্তর:


13

সুতরাং, 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
      • এক্সকিয়ার স্ট্যাটিক প্রকার

কলাম ফিল্টার:

  • আবেদনের নাম
    • মত % Intellisense%
  • SPID
    • 50 এর চেয়ে বড় বা সমান

পরীক্ষাগুলো

  • পরীক্ষা 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 &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;"
     />
  • পরীক্ষা 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 &quot;Expr1002&quot; FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;" 
     />

যদি আপনি পরীক্ষা # 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ক্যোয়ারী কাজ করে।

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

  1. NullGuidSuccess.xml
  2. NullGuidError.xml
  3. 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'} &quot;Expr1002&quot; FROM &quot;TEMPTEST&quot;.&quot;sys&quot;.&quot;objects&quot; &quot;Tbl1001&quot;" 
 />

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 এর মতো একটি ধ্রুবক ব্যবহার করে এটি দেখায় ।


আমি 2012 এসপি 3-সিউ 1 এ এই সমস্যাটি আবার তৈরি করেছি।
বব ক্লিমস

পছন্দ করেছেন এটি কি কোনও ২০০৮ R2 উদাহরণ বা লুপ-ব্যাকের সাথে সংযুক্ত সার্ভারটি ব্যবহার করছে?
সলোমন রুটজকি

রিমোট লিঙ্কযুক্ত সার্ভারটি ২০০৮ আর 2 এসপি 2 + এমএস 15-058 (10.50.4339.0)।
বব ক্লাইমস

1
সংস্করণ সম্পর্কিত বলে মনে হচ্ছে না। 2008r2,2012,2014,2016 এর একাধিক কম্বো পরীক্ষা করেছে এবং সমস্ত এখনও পর্যন্ত 2008r2-2008r2 এমনকি ত্রুটি তৈরি করেছে।
বব ক্লাইমস 23:58

2
এটা কি অত্যন্ত অস্পষ্ট সমস্যা। অন্তর্দৃষ্টি এবং গবেষণার জন্য আপনাকে অনেক ধন্যবাদ, @ শ্রুতজকি, এটির প্রশংসা হয়েছে। আমি ভবিষ্যতের কাজের জন্য এসএনএসি-র ক্ষয়ের বিষয়টি মাথায় রাখব এবং পূর্বোক্ত কর্মপরীক্ষার পিছনে পিছনে পড়ব। মহান কাজ!
ক্রিস্তাহ

4

এখানে কেবল একটি কুরুচিপূর্ণ কাজ রয়েছে - '1900-01-01'পরিবর্তে কিছু তারিখ ধ্রুবক ব্যবহার করুন null

CAST('1900-01-01' as DateTime) as Modified

আমদানির পরে 1900-01-01আপনি নাল থেকে ফিরে কলামগুলি আপডেট করতে পারেন ।

এটি এসকিউএল 2012 বৈশিষ্ট্য / বাগ অনুসারে এক ধরণের এখানে

সম্পাদনা করুন: নীচে @a_horse_with_no_name মন্তব্য অনুসারে 1900-00-00বৈধ তারিখ দিয়ে প্রতিস্থাপন করা হয়েছে 1900-01-01


এই কার্যনির্বাহ সম্ভবত সম্ভবত উল্লেখযোগ্য ছিল তবে এটি এখন আর প্রাসঙ্গিক হতে পারে না কারণ ওপি স্পষ্ট করে দিয়েছে যে সমস্যার দোষী একটি uniqueidentifierকলাম। অথবা হতে পারে এটি অভিযোজিত হতে পারে - এমন কিছু CAST('00000000-0000-0000-0000-000000000000' AS UniqueIdentifier) AS [GUID], সম্ভবত?
অ্যান্ড্রি এম

ধন্যবাদ বন্ধুরা. একটি খালি জিইউইডি বা ডেটটাইম কাজ করা কাস্টিং কাজ করে তবে এটি কেন হচ্ছে তা আমার বুঝতে হবে। এটিও উল্লেখযোগ্য যে আমি কোনও কিছু আমদানি করছি না, সুতরাং উত্সের ডেটা পরিবর্তন করার কোনও সম্ভাবনা নেই।
ক্রিস্তাহ

1
1900-00-00এটি একটি অবৈধ তারিখ এবং গ্রহণযোগ্য হবে না।
a_horse_with_no_name

@ এ_হর্স_বিহীন_নাম_নাম: বোকা ভুল, স্থির
আন্তন ক্রোগলভ

2

সমস্যাটি ডেটা ধরণের রূপান্তরগুলির সাথে সম্পর্কিত (মন্তব্যে হিট হিসাবে)।

নিম্নোক্ত বিবেচনা কর:

SELECT NULL as NullColumn INTO SomeTable;
EXEC sp_help SomeTable;
DROP TABLE SomeTable;

নোট করুন যে NullColumnটাইপ int। এসকিউএল সার্ভার intমানগুলিতে রূপান্তর করতে পছন্দ করে না uniqueidentifier। এই SELECTবিবৃতিটি কোনও ডেটা ধরণের রূপান্তরে ব্যর্থ হবে:

--Just a SELECT from nothing
SELECT CAST(CAST(NULL as int) as uniqueidentifier);
--
--or to see it from a physical table:
SELECT NULL as NullColumn INTO SomeTable;
SELECT CAST(NullColumn as uniqueidentifier) FROM SomeTable;
DROP TABLE SomeTable;

এমএসজি 529, স্তর 16, রাজ্য 2, লাইন 3

ডেটা টাইপ ইন্টি থেকে অনন্যপরিচয়কারীতে স্পষ্ট রূপান্তর অনুমোদিত নয়।

এই নির্দিষ্ট মানটি (এনএইউএল) একটি জিইউইডি তে কাস্ট করতে সক্ষম হয়েছে, এসকিউএল সার্ভার এমনকি নির্দিষ্ট মানগুলি দেখার আগেও ডেটা ধরণের রূপান্তরের ভিত্তিতে ত্রুটি নিক্ষেপ করে। পরিবর্তে, আপনি একটি মাল্টি-পদক্ষেপ কি প্রয়োজন হবে CASTঅপারেশন পরিবর্তন অন্তর্নিহিত যেতে intএকটি ডাটাটাইপ যে মধ্যে পরিচ্ছন্নভাবে রূপান্তরিত করতে uniqueidentiferপ্রথম ভোটদান --which উপায়ে varcharতারপর uniqueidentifier:

--Just a SELECT from nothing
SELECT CAST(CAST(CAST(NULL as int) as varchar) as uniqueidentifier);
--
--or to see it from a physical table:
SELECT NULL as NullColumn INTO SomeTable;
SELECT CAST(CAST(NullColumn as varchar(32)) as uniqueidentifier) FROM SomeTable;
DROP TABLE SomeTable;

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

1

ওপি চূড়ান্তভাবে সিদ্ধান্ত নিতে পারে এটি কোনও উপযুক্ত উত্তর কিনা।

আমার কাছে কোনও 'নিখুঁত' প্রমাণ নেই, তবে আমার 'সন্দেহ' এই সমস্যাটি থেকে উদ্ভূত হয়েছে যে কোনও ইউনিকআইডিটিফায়ার সার্ভার নির্ভর and শূন্য. এজন্য আপনি সম্ভবত এই দৃশ্যে অন্য কোনও ডেটাটাইপ সফলভাবে কাস্ট করতে পারেন, তবে অনন্য পরিচয়দাতা নয়। 'সার্ভার' নির্ভর UNIQUEIDENTIFIERS এবং DATETIMEOFFSET এর মতো ডেটা টাইপগুলি আপনাকে যে ত্রুটির মুখোমুখি হচ্ছে তা দিবে।

4 অংশের নামের পরিবর্তে ওপেনকুরি ব্যবহার করা।

set nocount on  
DECLARE @cmd nVARCHAR(max)
DECLARE @datatype SYSNAME

DECLARE _CURSOR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT NAME
FROM sys.types 

OPEN _CURSOR

FETCH NEXT
FROM _CURSOR
INTO @datatype

WHILE @@FETCH_STATUS = 0
BEGIN
    BEGIN TRY
        SET @cmd = 'select top 1 cast(null as ' + @Datatype + ') as CastedData from remoteserver.remotedatabase.remoteschema.remotetable'
        PRINT @cmd
        EXECUTE sp_executesql @cmd
    END TRY

    BEGIN CATCH
        PRINT Error_message()
    END CATCH

FETCH NEXT
FROM _CURSOR
INTO @datatype
END --End While

CLOSE _CURSOR

DEALLOCATE _CURSOR

আপনার দ্বারা ঠিক কি বোঝাতে চেয়েছেন Uniqueidentifierএবং DateTimeOffsetসার্ভার-নির্ভরশীল হচ্ছে? আপনি কি এই জন্য কোন উত্স আছে?
ক্রাইস্টাহ

@ ক্রাইস্টাহ - এই লিঙ্কটি থেকে ( টেকনিকেট.মাইক্রোসফট.ফেন / লিবেরি / এসএমসিএল 215 ( v=sql.105 ) .aspx ) "অনন্য পরিচয়দাতার তথ্য টাইপ 16-বাইট বাইনারি মানগুলি সঞ্চয় করে যা বিশ্বব্যাপী অনন্য শনাক্তকারী (জিইউডি) হিসাবে কাজ করে একটি জিইউইডি একটি অনন্য বাইনারি সংখ্যা; পৃথিবীর আর কোনও কম্পিউটার সেই জিইউডি মানটির একটি সদৃশ তৈরি করতে পারে না a একটি জিইউইডির মূল ব্যবহার এমন একটি সনাক্তকারী নির্ধারণের জন্য যা একটি নেটওয়ার্কে অনন্য হতে হবে যার অনেক সাইটগুলিতে অনেকগুলি কম্পিউটার থাকে। "
স্কট হজগিন

ডেটটাইমঅফসেটের জন্য ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/bb630289.aspx ) এমন একটি তারিখ নির্ধারণ করে যা একটি দিনের সময়টির সাথে মিলিত হয় যা সময় অঞ্চল সচেতনতা এবং 24 ঘন্টা ঘড়ির উপর ভিত্তি করে
স্কট হডগিন

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

@ ক্রাইস্টাহ এবং স্কট: এই দুটি ডেটাটাইপগুলি সার্ভার-নির্ভর নয়, অন্তত আপনি কীভাবে বর্ণনা করছেন এবং বোঝাচ্ছেন তাতে তা নয়। জিইউইডিগুলি হ'ল "আর্কিটেকচার" তাদের অন্তর্নিহিত বাইনারি উপস্থাপনার ক্ষেত্রে নির্ভর করে ( বিশদগুলির জন্য এখানে দেখুন) তবে এটি যদি এখানে কোনও সমস্যা হয়ে থাকে তবে কোনও জিইউডিগুলি সঠিকভাবে স্থানান্তর করত না। DATETIMEOFFSET- এর জন্য, এটি কেবল অফসেট সম্পর্কে জানে, আসল সময় অঞ্চল / টাইমজোনআইডি নয় of উভয়ই নতুন মান উত্পন্ন করতে সিস্টেমের তথ্য ব্যবহার করার সময়, এখানে কোনও নতুন মান উত্পন্ন হচ্ছে না এবং যদি তা হয় তবে তারা সরবরাহকারীর মধ্যে উত্পন্ন হয় না।
সলোমন রুটজকি

0

কার্যকারণ: গৃহীত উত্তর মনে হয় যে রূপান্তরটি স্থানীয়ভাবে হওয়া দরকার কারণ ওএইলডিবি ড্রাইভার এটি সমর্থন করে না।

সুতরাং আমি মনে করি একটি সাধারণ কাজ (কমপক্ষে আমার জিজ্ঞাসার uniqueidentifierক্ষেত্রে যা একটি পুনরাবৃত্ত সিটিইর বেসের ক্ষেত্রে নাল নির্বাচন করছে ) নাল ভেরিয়েবল ঘোষণা করার জন্য:

declare @nullGuid as uniqueidentifier = null;

--Instead of...
CAST(NULL AS UniqueIdentifier) AS [GUID]

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