সিস.ড্যাটাবেসগুলিতে কিছু কলামের জোটের কী হবে?


21

আমি এতে UNPIVOTথাকা বিভিন্ন কলামগুলিতে চালানোর চেষ্টা করছিsys.databases 2005 থেকে 2012 অবধি এসকিউএল সার্ভারের বিভিন্ন সংস্করণে ।

UNPIVOTনিম্নলিখিত ত্রুটির বার্তা সঙ্গে ব্যর্থ হচ্ছে:

এমএসজি 8167, স্তর 16, রাজ্য 1, লাইন 48

UNPIVOT তালিকায় নির্দিষ্ট অন্যান্য কলামগুলির ধরণের সাথে "সামঞ্জস্যযোগ্যতা" কলামের ধরণের বিরোধ রয়েছে।

টি এসকিউএল:

DECLARE @dbname SYSNAME;
SET @dbname = DB_NAME();

SELECT [Database]            = unpvt.DatabaseName
    , [Configuration Item]   = unpvt.OptionName
    , [Configuration Value]  = unpvt.OptionValue
FROM (
    SELECT 
        DatabaseName = name 
        , RecoveryModel                 = CONVERT(VARCHAR(50), d.recovery_model_desc)
        , CompatibilityLevel            = CONVERT(VARCHAR(50), CASE d.[compatibility_level] WHEN 70 THEN 'SQL Server 7' WHEN 80 THEN 'SQL Server 2000' WHEN 90 THEN 'SQL Server 2005' WHEN 100 THEN 'SQL Server 2008' WHEN 110 THEN 'SQL Server 2012' WHEN 120 THEN 'SQL Server 2014' ELSE 'UNKNOWN' END)
        , AutoClose                     = CONVERT(VARCHAR(50), CASE d.is_auto_close_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoCreateStatistics          = CONVERT(VARCHAR(50), CASE d.is_auto_create_stats_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoShrink                    = CONVERT(VARCHAR(50), CASE d.is_auto_shrink_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoUpdateStatistics          = CONVERT(VARCHAR(50), CASE d.is_auto_update_stats_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoUpdateStatisticsAsynch    = CONVERT(VARCHAR(50), CASE d.is_auto_update_stats_async_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , CloseCursorOnCommit           = CONVERT(VARCHAR(50), CASE d.is_cursor_close_on_commit_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DefaultCursor                 = CONVERT(VARCHAR(50), CASE d.is_local_cursor_default WHEN 1 THEN 'LOCAL' ELSE 'GLOBAL' END)
        , ANSINULL_Default              = CONVERT(VARCHAR(50), CASE d.is_ansi_null_default_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSINULLS_Enabled             = CONVERT(VARCHAR(50), CASE d.is_ansi_nulls_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSIPadding_Enabled           = CONVERT(VARCHAR(50), CASE d.is_ansi_padding_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSIWarnings_Enabled          = CONVERT(VARCHAR(50), CASE d.is_ansi_warnings_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ArithmeticAbort_Enabled       = CONVERT(VARCHAR(50), CASE d.is_arithabort_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ConcatNullYieldsNull          = CONVERT(VARCHAR(50), CASE d.is_concat_null_yields_null_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , CrossDBOwnerChain             = CONVERT(VARCHAR(50), CASE d.is_db_chaining_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DateCorrelationOptimized      = CONVERT(VARCHAR(50), CASE d.is_date_correlation_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , NumericRoundAbort             = CONVERT(VARCHAR(50), CASE d.is_numeric_roundabort_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , [Parameterization]            = CONVERT(VARCHAR(50), CASE d.is_parameterization_forced WHEN 0 THEN 'SIMPLE' ELSE 'FORCED' END)
        , QuotedIdentifiers_Enabled     = CONVERT(VARCHAR(50), CASE d.is_quoted_identifier_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , RecursiveTriggers_Enabled     = CONVERT(VARCHAR(50), CASE d.is_recursive_triggers_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , [TrustWorthy]                 = CONVERT(VARCHAR(50), CASE d.is_trustworthy_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , VARDECIMAL_Storage            = CONVERT(VARCHAR(50), 'TRUE')
        , PageVerify                    = CONVERT(VARCHAR(50), page_verify_option_desc  )
        , BrokerEnabled                 = CONVERT(VARCHAR(50), CASE d.is_broker_enabled WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DatabaseReadOnly              = CONVERT(VARCHAR(50), CASE d.is_read_only WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , EncryptionEnabled             = CONVERT(VARCHAR(50), CASE d.is_encrypted WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , RestrictedAccess              = CONVERT(VARCHAR(50), user_access_desc)
        , Collation                     = CONVERT(VARCHAR(50), d.collation_name)
    FROM sys.databases d
    WHERE name = @dbname
        OR @dbname IS NULL
    ) src
UNPIVOT
(
    OptionValue FOR OptionName IN
    (
        RecoveryModel
        , CompatibilityLevel
        , AutoClose
        , AutoCreateStatistics 
        , AutoShrink 
        , AutoUpdateStatistics 
        , AutoUpdateStatisticsAsynch 
        , CloseCursorOnCommit 
        , DefaultCursor 
        , ANSINULL_Default 
        , ANSINULLS_Enabled 
        , ANSIPadding_Enabled 
        , ANSIWarnings_Enabled 
        , ArithmeticAbort_Enabled 
        , ConcatNullYieldsNull 
        , CrossDBOwnerChain 
        , DateCorrelationOptimized 
        , NumericRoundAbort 
        , [Parameterization] 
        , QuotedIdentifiers_Enabled 
        , RecursiveTriggers_Enabled 
        , [TrustWorthy] 
        , VARDECIMAL_Storage 
        , PageVerify 
        , BrokerEnabled 
        , DatabaseReadOnly 
        , EncryptionEnabled 
        , RestrictedAccess 
        , Collation
    )
) AS unpvt;

এটি প্রদত্ত ডাটাবেসের জন্য ডাটাবেসের বিকল্পগুলির সুন্দর বিন্যাসিত তালিকা সরবরাহ করার জন্য ডিজাইন করা হয়েছে, এর মতো:

+----------+----------------------------+----------------------------+
| Database | Configuration Item         | Value in Use               |
+----------+----------------------------+----------------------------+
| master   | RecoveryModel              | SIMPLE                     |
| master   | CompatibilityLevel         | SQL Server 2008            |
| master   | AutoClose                  | FALSE                      |
| master   | AutoCreateStatistics       | TRUE                       |
| master   | AutoShrink                 | FALSE                      |
| master   | AutoUpdateStatistics       | TRUE                       |
| master   | AutoUpdateStatisticsAsynch | FALSE                      |
| master   | CloseCursorOnCommit        | FALSE                      |
| master   | DefaultCursor              | GLOBAL                     |
| master   | ANSINULL_Default           | FALSE                      |
| master   | ANSINULLS_Enabled          | FALSE                      |
| master   | ANSIPadding_Enabled        | FALSE                      |
| master   | ANSIWarnings_Enabled       | FALSE                      |
| master   | ArithmeticAbort_Enabled    | FALSE                      |
| master   | ConcatNullYieldsNull       | FALSE                      |
| master   | CrossDBOwnerChain          | TRUE                       |
| master   | DateCorrelationOptimized   | FALSE                      |
| master   | NumericRoundAbort          | FALSE                      |
| master   | Parameterization           | SIMPLE                     |
| master   | QuotedIdentifiers_Enabled  | FALSE                      |
| master   | RecursiveTriggers_Enabled  | FALSE                      |
| master   | TrustWorthy                | TRUE                       |
| master   | VARDECIMAL_Storage         | TRUE                       |
| master   | PageVerify                 | CHECKSUM                   |
| master   | BrokerEnabled              | FALSE                      |
| master   | DatabaseReadOnly           | FALSE                      |
| master   | EncryptionEnabled          | FALSE                      |
| master   | RestrictedAccess           | MULTI_USER                 |
| master   | Collation                  | Latin1_General_CI_AS_KS_WS |
+----------+----------------------------+----------------------------+

আমি যখন Latin1_General_CI_AS_KS_WSএটি কোলিশেশন সহ কোনও সার্ভারে চালিত করি তখন বিবৃতিটি সফল হয়। যদি আমি টি-এসকিউএল সংশোধন করি যাতে নির্দিষ্ট ক্ষেত্রগুলিতে একটি COLLATEধারা থাকে তবে এটি অন্যান্য কোলেশন রয়েছে এমন সার্ভারগুলিতে চলবে।

কোডগুলি যা অন্য কোলিশেশন সহ সার্ভারে কাজ করে তা Latin1_General_CI_AS_KS_WSহ'ল:

DECLARE @dbname SYSNAME;
SET @dbname = DB_NAME();

SELECT [Database]            = unpvt.DatabaseName
    , [Configuration Item]   = unpvt.OptionName
    , [Configuration Value]  = unpvt.OptionValue
FROM (
    SELECT 
        DatabaseName = name 
        , RecoveryModel                 = CONVERT(VARCHAR(50), d.recovery_model_desc) COLLATE SQL_Latin1_General_CP1_CI_AS
        , CompatibilityLevel            = CONVERT(VARCHAR(50), CASE d.[compatibility_level] WHEN 70 THEN 'SQL Server 7' WHEN 80 THEN 'SQL Server 2000' WHEN 90 THEN 'SQL Server 2005' WHEN 100 THEN 'SQL Server 2008' WHEN 110 THEN 'SQL Server 2012' WHEN 120 THEN 'SQL Server 2014' ELSE 'UNKNOWN' END) 
        , AutoClose                     = CONVERT(VARCHAR(50), CASE d.is_auto_close_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoCreateStatistics          = CONVERT(VARCHAR(50), CASE d.is_auto_create_stats_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoShrink                    = CONVERT(VARCHAR(50), CASE d.is_auto_shrink_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoUpdateStatistics          = CONVERT(VARCHAR(50), CASE d.is_auto_update_stats_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoUpdateStatisticsAsynch    = CONVERT(VARCHAR(50), CASE d.is_auto_update_stats_async_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , CloseCursorOnCommit           = CONVERT(VARCHAR(50), CASE d.is_cursor_close_on_commit_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DefaultCursor                 = CONVERT(VARCHAR(50), CASE d.is_local_cursor_default WHEN 1 THEN 'LOCAL' ELSE 'GLOBAL' END)
        , ANSINULL_Default              = CONVERT(VARCHAR(50), CASE d.is_ansi_null_default_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSINULLS_Enabled             = CONVERT(VARCHAR(50), CASE d.is_ansi_nulls_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSIPadding_Enabled           = CONVERT(VARCHAR(50), CASE d.is_ansi_padding_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSIWarnings_Enabled          = CONVERT(VARCHAR(50), CASE d.is_ansi_warnings_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ArithmeticAbort_Enabled       = CONVERT(VARCHAR(50), CASE d.is_arithabort_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ConcatNullYieldsNull          = CONVERT(VARCHAR(50), CASE d.is_concat_null_yields_null_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , CrossDBOwnerChain             = CONVERT(VARCHAR(50), CASE d.is_db_chaining_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DateCorrelationOptimized      = CONVERT(VARCHAR(50), CASE d.is_date_correlation_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , NumericRoundAbort             = CONVERT(VARCHAR(50), CASE d.is_numeric_roundabort_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , [Parameterization]            = CONVERT(VARCHAR(50), CASE d.is_parameterization_forced WHEN 0 THEN 'SIMPLE' ELSE 'FORCED' END)
        , QuotedIdentifiers_Enabled     = CONVERT(VARCHAR(50), CASE d.is_quoted_identifier_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , RecursiveTriggers_Enabled     = CONVERT(VARCHAR(50), CASE d.is_recursive_triggers_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , [TrustWorthy]                 = CONVERT(VARCHAR(50), CASE d.is_trustworthy_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , VARDECIMAL_Storage            = CONVERT(VARCHAR(50), 'TRUE')
        , PageVerify                    = CONVERT(VARCHAR(50), page_verify_option_desc  ) COLLATE SQL_Latin1_General_CP1_CI_AS
        , BrokerEnabled                 = CONVERT(VARCHAR(50), CASE d.is_broker_enabled WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DatabaseReadOnly              = CONVERT(VARCHAR(50), CASE d.is_read_only WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , EncryptionEnabled             = CONVERT(VARCHAR(50), CASE d.is_encrypted WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , RestrictedAccess              = CONVERT(VARCHAR(50), user_access_desc) COLLATE SQL_Latin1_General_CP1_CI_AS
        , Collation                     = CONVERT(VARCHAR(50), d.collation_name)
    FROM sys.databases d
    WHERE name = @dbname
        OR @dbname IS NULL
    ) src
UNPIVOT
(
    OptionValue FOR OptionName IN
    (
        RecoveryModel
        , CompatibilityLevel
        , AutoClose
        , AutoCreateStatistics 
        , AutoShrink 
        , AutoUpdateStatistics 
        , AutoUpdateStatisticsAsynch 
        , CloseCursorOnCommit 
        , DefaultCursor 
        , ANSINULL_Default 
        , ANSINULLS_Enabled 
        , ANSIPadding_Enabled 
        , ANSIWarnings_Enabled 
        , ArithmeticAbort_Enabled 
        , ConcatNullYieldsNull 
        , CrossDBOwnerChain 
        , DateCorrelationOptimized 
        , NumericRoundAbort 
        , [Parameterization] 
        , QuotedIdentifiers_Enabled 
        , RecursiveTriggers_Enabled 
        , [TrustWorthy] 
        , VARDECIMAL_Storage 
        , PageVerify 
        , BrokerEnabled 
        , DatabaseReadOnly 
        , EncryptionEnabled 
        , RestrictedAccess 
        , Collation
    )
) AS unpvt;

পরিলক্ষিত আচরণটি হ'ল নিম্নলিখিত ক্ষেত্রগুলি সার্ভার কোলিশন, বা ডাটাবেস কোলেশন পর্যবেক্ষণ করে না; তারা সর্বদা উপস্থাপিত হয়Latin1_General_CI_AS_KS_WS কোলেশন ।

এসকিউএল সার্ভারে 2012, আমরা sys.sp_describe_first_result_setকোনও নির্দিষ্ট ক্যোয়ারী থেকে ফিরে আসা কলামগুলি সম্পর্কে সহজেই মেটাডেটা ব্যবহার করতে পারি । কোলেশন অমিল নির্ধারণ করতে আমি নিম্নলিখিতটি ব্যবহার করেছি:

DECLARE @cmd NVARCHAR(MAX);

SET @cmd = '
SELECT 
    DatabaseName                    = CONVERT(VARCHAR(50), d.name)
    , RecoveryModel                 = CONVERT(VARCHAR(50), d.recovery_model_desc) 
    , Collation                     = CONVERT(VARCHAR(50), d.collation_name)
FROM sys.databases d
WHERE name = DB_NAME();
';

EXEC sp_describe_first_result_set @command = @cmd;

ফলাফলগুলো:

এখানে চিত্র বর্ণনা লিখুন

এই কলামগুলির জোট স্থিরভাবে সেট করা আছে কেন?

উত্তর:


17

মাইক্রোসফ্ট থেকে সরকারী শব্দ:

প্রাক-সংজ্ঞায়িত স্ট্রিং (যেমন প্রকার, সিস্টেমের বিবরণ এবং ধ্রুবক) সহ কিছু কলাম সর্বদা নির্দিষ্ট কোলেশনে স্থির থাকে - Latin1_General_CI_AS_KS_WS। এটি উদাহরণস্বরূপ / ডাটাবেস সংযোগ নির্বিশেষে। কারণটি হ'ল এটি সিস্টেম মেটাটাটা (ব্যবহারকারী মেটাডেটা নয়) এবং মূলত এই স্ট্রিংগুলিকে সংবেদনশীল হিসাবে বিবেচনা করা হয় (যেমন কীওয়ার্ডস, তাই সর্বদা ল্যাটিন)।

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

আপনি জিজ্ঞাসা করেছেন (জোর আমার):

কেন এই কলামের কোলেশন স্ট্যাটিক্যালি সেট করা হয়?

কিছু কলামগুলি স্থিতিশীলভাবে সেট করার কারণটি রয়েছে যাতে সঠিকভাবে কাজ করার জন্য ক্যোয়ারীদের সার্ভার বা ডাটাবেস কল্যানেশন সম্পর্কে আরও বেশি চিন্তা করার দরকার নেই (আরও গুরুত্বপূর্ণ: CaSe SenSiTIviTy)। এই কোয়েরিটি সর্বদা সংগৃহ নির্বিশেষে কাজ করবে:

SELECT * FROM sys.databases WHERE state_desc = N'ONLine';

যদিও সার্ভার কোলেশন ক্ষেত্রে সংবেদনশীল ছিল, উপরের ক্যোয়ারী 0 টি সারি ফেরত দেবে, ঠিক যেমন:

  SELECT * FROM sys.databases 
  WHERE state_desc COLLATE Albanian_BIN = N'ONLine';

উদাহরণস্বরূপ, আপনি যদি SQL_Estonian_CP1257_CS_ASকোলেশন সহ এসকিউএল সার্ভারের একটি ইনস্টলস ইনস্টল করেন তবে নিম্নলিখিতগুলি চালান:

SELECT name, collation_name 
FROM master.sys.all_columns
WHERE collation_name IS NOT NULL
AND [object_id] = OBJECT_ID(N'sys.databases');

আপনি এই ফলাফলগুলি দেখতে পাবেন (বা এসকিউএল সার্ভারের আপনার সংস্করণের উপর নির্ভর করে কিছু অন্যরকম):

name                            SQL_Estonian_CP1257_CS_AS
collation_name                  SQL_Estonian_CP1257_CS_AS
user_access_desc                Latin1_General_CI_AS_KS_WS
state_desc                      Latin1_General_CI_AS_KS_WS
snapshot_isolation_state_desc   Latin1_General_CI_AS_KS_WS
recovery_model_desc             Latin1_General_CI_AS_KS_WS
page_verify_option_desc         Latin1_General_CI_AS_KS_WS
log_reuse_wait_desc             Latin1_General_CI_AS_KS_WS
default_language_name           SQL_Estonian_CP1257_CS_AS
default_fulltext_language_name  SQL_Estonian_CP1257_CS_AS
containment_desc                Latin1_General_CI_AS_KS_WS
delayed_durability_desc         SQL_Estonian_CP1257_CS_AS

এখন, মাস্টার ডাটাবেস থেকে সার্ভার কোলেশন উত্তরাধিকারী হওয়ার পরিবর্তে ডেটাবেস কোলেশন উত্তরাধিকার সূত্রে মেটাডেটা দেখাতে:

CREATE DATABASE server_collation;
GO
CREATE DATABASE albanian COLLATE Albanian_BIN;
GO
CREATE DATABASE hungarian COLLATE Hungarian_Technical_100_CS_AI;
GO

SELECT name, collation_name 
  FROM server_collation.sys.all_columns 
  WHERE collation_name IS NOT NULL 
  AND object_id = -391; -- sys.columns

SELECT name, collation_name 
  FROM albanian.sys.all_columns 
  WHERE collation_name IS NOT NULL 
  AND object_id = -391; -- sys.columns

SELECT name, collation_name 
  FROM hungarian.sys.all_columns 
  WHERE collation_name IS NOT NULL 
  AND object_id = -391; -- sys.columns

ফলাফল:

server_collation
----------------
name                                 SQL_Estonian_CP1257_CS_AS
collation_name                       SQL_Estonian_CP1257_CS_AS
generated_always_type_desc           Latin1_General_CI_AS_KS_WS
encryption_type_desc                 Latin1_General_CI_AS_KS_WS
encryption_algorithm_name            Latin1_General_CI_AS_KS_WS
column_encryption_key_database_name  SQL_Estonian_CP1257_CS_AS


albanian
----------------
name                                 Albanian_BIN
collation_name                       Albanian_BIN
generated_always_type_desc           Latin1_General_CI_AS_KS_WS
encryption_type_desc                 Latin1_General_CI_AS_KS_WS
encryption_algorithm_name            Latin1_General_CI_AS_KS_WS
column_encryption_key_database_name  Albanian_BIN


hungarian
----------------
name                                 Hungarian_Technical_100_CS_AI
collation_name                       Hungarian_Technical_100_CS_AI
generated_always_type_desc           Latin1_General_CI_AS_KS_WS
encryption_type_desc                 Latin1_General_CI_AS_KS_WS
encryption_algorithm_name            Latin1_General_CI_AS_KS_WS
column_encryption_key_database_name  Hungarian_Technical_100_CS_AI

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

আপনি যদি একটি সম্পাদন করার চেষ্টা করেন UNION, উদাহরণস্বরূপ:

SELECT name FROM albanian.sys.columns
UNION ALL
SELECT name FROM server_collation.sys.columns;

আপনি এই ত্রুটি পান:

এমএসজি 451, স্তর 16, স্টেট 1
নির্বাচনী বিবৃতি কলাম 1 এ সংঘটিত ইউনিয়ন সমস্ত অপারেটরে "আলবেনিয়ান_বিএন" এবং "এসকিউএল_এস্টোনিয়ান_সিপি 1257_CS_AS" এর মধ্যে কোলেশন বিরোধের সমাধান করতে পারে না।

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

এমএসজি 67১6767, স্তর ১ 16, রাজ্য 1
কলামের ধরণ "কলামের নাম" UNPIVOT তালিকায় নির্দিষ্ট অন্যান্য কলামগুলির ধরণের সাথে বিরোধ করে।

COLLATEআপনার প্রশ্নগুলিতে সুস্পষ্ট ধারাগুলি ব্যবহার করে আপনাকে এই ত্রুটিগুলি নিয়ে কাজ করতে হবে । উদাহরণস্বরূপ, উপরের ইউনিয়নটি হতে পারে:

SELECT name COLLATE Latin1_General_CI_AS_KS_WS
  FROM albanian.sys.columns
UNION ALL
SELECT name COLLATE Latin1_General_CI_AS_KS_WS
  FROM server_collation.sys.columns;

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


7

কোলেশন অগ্রাধিকারের পটভূমি

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

তাকানোর সময় sys.databases, এটি কোনও টেবিল নয় তা মনে রাখা গুরুত্বপূর্ণ। অতীতে (আমার মনে হয় এসকিউএল সার্ভার 2000 এ শেষ হওয়া) এগুলি ছিল সিস্টেম ক্যাটালগ সারণী , তারা এখন সিস্টেম ক্যাটালগ দর্শন । অতএব, তাদের মধ্যে তথ্যের উত্স অগত্যা বর্তমান ডাটাবেস প্রসঙ্গ (বা যেমন একটি পূর্ণ-যোগ্য বস্তুর সাথে কাজ করার সময় নির্দিষ্ট ডাটাবেসের প্রসঙ্গ master.sys.databases) থেকে আসে না।

বিশেষভাবে ডিল করে sys.databases, কিছু ক্ষেত্র [master]ডাটাবেস থেকে এসেছে (যা উদাহরণস্বরূপের ডিফল্ট কল্যানেশন - অর্থাৎ সার্ভার-লেভেল কোলিশনের উপর ভিত্তি করে একটি কোলেশন দিয়ে তৈরি হয়েছিল), কিছু ক্ষেত্র এক্সপ্রেশন (অর্থাত CASEবিবৃতি), এবং কিছু আসছে একটি "লুকানো" উত্স থেকে: [mssqlsystemresource]ডাটাবেস। আর [mssqlsystemresource]ডেটাবেসের একটি কোলেশন রয়েছে: Latin1_General_CI_AS_KS_WS

nameমাঠ থেকে sourced হয় nameমাঠে master.sys.sysdbreg। সুতরাং এই ক্ষেত্রটি সর্বদা [master]ডাটাবেসের কোলেশন থাকা উচিত , যা আবার সার্ভারের জোটের সাথে মিলবে।

কিন্তু মাঠ sys.databasesথেকে নিম্নলিখিত ক্ষেত্রগুলি এখানে আসে :[name][mssqlsystemresource].[sys].[syspalvalues]

  • user_access_desc
  • snapshot_isolation_state_desc
  • recovery_model_desc
  • page_verify_option_desc
  • log_reuse_wait_desc
  • containment_desc

এই ক্ষেত্রগুলির সর্বদা একটি কোলেশন থাকা উচিত Latin1_General_CI_AS_KS_WS

collation_nameক্ষেত্র অবশ্য নিম্নলিখিত অভিব্যক্তি থেকে আসে:

CONVERT(nvarchar(128),
        CASE
            WHEN serverproperty('EngineEdition')=5
                   AND [master].[sys].[sysdbreg].[id] as [d].[id]=(1)
              THEN serverproperty('collation')
            ELSE collationpropertyfromid(
                           CONVERT(int,
                            isnull([master].[sys].[sysobjvalues].[value] as [coll].[value],
                                   CONVERT_IMPLICIT(sql_variant,DBPROP.[cid],0)
                                ),
                         0),'name')
         END,
        0)

এখানে কোলেশন অগ্রাধিকার আসতে শুরু করে output এখানে আউটপুটের উভয় বিকল্প হ'ল সিস্টেম ফাংশন: serverproperty()এবং collationpropertyfromid()। এই অভিব্যক্তির কোলেশনটিকে "Coercible-default" হিসাবে বিবেচনা করা হয়:

যে কোনও লেনদেন-এসকিউএল অক্ষর স্ট্রিং ভেরিয়েবল, প্যারামিটার, আক্ষরিক, বা অন্তর্নির্মিত ফাংশন ক্যাটালগের আউটপুট, বা একটি অন্তর্নির্মিত ফাংশন যা স্ট্রিং ইনপুট নেয় না তবে স্ট্রিং আউটপুট উত্পাদন করে।

যদি অবজেক্টটি কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশন, সঞ্চিত পদ্ধতি, বা ট্রিগার হিসাবে ঘোষিত হয় তবে অবজেক্টটি ডেটাবেসটির ডিফল্ট কোলেশন বরাদ্দ করা হয় যেখানে ফাংশন, সঞ্চিত পদ্ধতি বা ট্রিগার তৈরি করা হয়। যদি কোনও ব্যাচে অবজেক্টটি ঘোষিত হয় তবে সংযোগের জন্য অবজেক্টটি বর্তমান ডাটাবেসের ডিফল্ট কোলেশন বরাদ্দ করা হয়েছে।

সেই ২ য় অনুচ্ছেদের আলোকে, যেহেতু sys.databasesএকটি ভিউ যা masterডাটাবেসে বিদ্যমান , তাই এটি masterডাটাবেসের (বর্তমান ডাটাবেস নয়) কোলেশন গ্রহণ করে ।

state_descক্ষেত্রও আমাদেরকে একটি অভিব্যক্তি হল:

CASE
   WHEN serverproperty('EngineEdition')=5
       AND [Expr1081]=(1)
       THEN N'RESTORING'
   ELSE
      CASE
         WHEN serverproperty('EngineEdition')=5
            AND CONVERT(bit,
                        [master].[sys].[sysdbreg].[status] as [d].[status]&(128),
                        0)=(1)
          THEN N'COPYING'
         ELSE
            CASE
               WHEN serverproperty('EngineEdition')=5
                  AND CONVERT(bit,
                              [master].[sys].[sysdbreg].[status] as [d].[status]&(256),
                              0)=(1)
                 THEN N'SUSPECT'
            ELSE [mssqlsystemresource].[sys].[syspalvalues].[name] as [st].[name]
            END
         END
       END

তবে, এই অভিব্যক্তিটির কোলেশনটি হ'ল Latin1_General_CI_AS_KS_WS। কেন? ঠিক আছে, এই অভিব্যক্তিতে নতুন কিছু প্রবর্তিত হয়েছে: একটি বাস্তব ক্ষেত্রের জন্য একটি রেফারেন্স: [mssqlsystemresource].[sys].[syspalvalues].[name]সেই চূড়ান্ত ELSEধারাটিতে। কলাম রেফারেন্সগুলি "অন্তর্নিহিত" হিসাবে বিবেচিত:

একটি কলাম রেফারেন্স। সারণী বা দৃশ্যের কলামের জন্য সংজ্ঞায়িত কোলাশন থেকে অভিব্যক্তিটির কোলাশন নেওয়া হয়েছে।

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

-- Force ELSE condition
SELECT system_type_name, max_length, collation_name
FROM sys.dm_exec_describe_first_result_set(N'
DECLARE @A INT;
SET @A = -1;
SELECT CASE WHEN @A = 100 THEN N''All About the Benjamins''
            ELSE [name]
       END AS [Stuff]
FROM msdb.dbo.sysjobs
', NULL, NULL) rs

-- Force WHEN condition
SELECT system_type_name, max_length, collation_name
FROM sys.dm_exec_describe_first_result_set(N'
DECLARE @A INT;
SET @A = 100;
SELECT CASE WHEN @A = 100 THEN N''All About the Benjamins''
            ELSE [name]
       END AS [Stuff]
FROM msdb.dbo.sysjobs
', NULL, NULL) rs

-- Control test
SELECT system_type_name, max_length, collation_name
FROM sys.dm_exec_describe_first_result_set(N'
DECLARE @A INT;
SET @A = 100;
SELECT CASE WHEN @A = 100 THEN N''All About the Benjamins''
            ELSE N''Whazzup, yo?!?!?''
       END AS [Stuff]
', NULL, NULL) rs

প্রত্যাবর্তন (একটি কোলেশন সহ একটি উদাহরণস্বরূপ সেটআপ করা হয়েছে SQL_Latin1_General_CP1_CI_ASতবে এর কোলেশন সহ একটি ডাটাবেসে চলছে Japanese_Unicode_CI_AS):

system_type_name    max_length    collation_name
----------------    ----------    --------------
nvarchar(128)       256           SQL_Latin1_General_CP1_CI_AS
nvarchar(128)       256           SQL_Latin1_General_CP1_CI_AS
nvarchar(23)         46           Japanese_Unicode_CI_AS

এখানে আমরা দেখতে পাই যে দুটি ক্যোয়ারী ক্ষেত্রটি রেফারেন্স করে [msdb][msdb] ডেটাবেসের কোলেশন গ্রহণের (যা একটি সিস্টেম ডিবি হওয়ায় সার্ভার কোলেশন দ্বারা নির্ধারিত হয়েছিল)।

মূল প্রশ্নের সাথে সম্পর্কিত

পরিলক্ষিত আচরণটি হ'ল নিম্নলিখিত ক্ষেত্রগুলি সার্ভার কোলিশন, বা ডাটাবেস কোলেশন পর্যবেক্ষণ করে না; তারা সর্বদা উপস্থাপিত হয়Latin1_General_CI_AS_KS_WS কোলেশন ।

আপনার পর্যবেক্ষণটি স্পট-অন রয়েছে: Latin1_General_CI_AS_KS_WSসার্ভার কোলেশন বা ডাটাবেস কোলেশন নির্বিশেষে fields ক্ষেত্রগুলির সর্বদা একটি সংযোগ থাকে। এবং কারণটি হ'ল কোলেশন অগ্রাধিকার। এই ক্ষেত্রগুলি [mssqlsystemresource]ডাটাবেসের একটি সারণী থেকে আসে এবং এটি প্রাথমিক কোলেশন ধরে রাখবে যদি না সুস্পষ্ট COLLATEধারা দ্বারা ওভাররাইড না করা হয় যেহেতু এর সর্বোচ্চ নজরে রয়েছে:

সুস্পষ্ট = একটি অভিব্যক্তি যা স্পষ্টতই অভিব্যক্তির একটি COLLATE ধারা ব্যবহার করে একটি নির্দিষ্ট কোলেশনে ফেলে দেওয়া হয়।

স্পষ্টতই অন্তর্নিহিতের চেয়ে অগ্রাধিকার গ্রহণ করে। অন্তর্ভুক্তটি Coercible- ডিফল্টের চেয়ে বেশি অগ্রাধিকার গ্রহণ করে:
স্পষ্টত> অন্তর্ভুক্ত> Coercible-default

এবং সম্পর্কিত প্রশ্ন:

এই কলামগুলির জোট স্থিরভাবে সেট করা আছে কেন?

এটি স্থিতিশীলভাবে সেট করা নয় বা অন্যান্য ক্ষেত্রগুলি কোনওরকম গতিশীল নয় এমন নয়। এই সমস্ত সিস্টেম ক্যাটালগ দর্শনগুলির সমস্ত ক্ষেত্রই কোলেশন অগ্রাধিকারের একই নিয়মে কাজ করে। কারণ তারা আরো অন্যান্য ক্ষেত্রের তুলনায় "স্ট্যাটিক" বলে মনে (এমনকি যদি আপনি একটি ভিন্ন ডিফল্ট কোলেশন, যেটা ঘুরে ফিরে ডিফল্ট কোলেশন সঙ্গে সিস্টেম ডাটাবেস তৈরি করে সঙ্গে SQL সার্ভার ইনস্টল অর্থাত তারা পরিবর্তন করবেন না) যে [mssqlsystemresource]ডাটাবেসের ধারাবাহিকভাবে Latin1_General_CI_AS_KS_WSএসকিউএল সার্ভারের যে কোনও ইনস্টলেশন জুড়ে একটি মিল রয়েছে (বা এটি অবশ্যই প্রদর্শিত হবে)। এবং এটি উপলব্ধি করে কারণ অন্যথায় এসকিউএল সার্ভারের পক্ষে অভ্যন্তরীণভাবে নিজেকে পরিচালনা করা কঠিন হবে (যেমন যদি অভ্যন্তরীণ লজিকের জন্য বাছাই করা এবং তুলনা করার নিয়মগুলি ইনস্টলেশনের ভিত্তিতে পরিবর্তিত হয়)।

কীভাবে এই স্পেসিফিক্সগুলি নিজের মধ্যে দেখুন

যদি আপনি এই সিস্টেমের ক্যাটালগের কোনও ভিউতে কোনও ক্ষেত্রের (গুলি) উত্স দেখতে চান তবে কেবল নিম্নলিখিতটি করুন:

  1. এসএসএমএসে একটি কোয়েরি ট্যাবে, "প্রকৃত বাস্তবায়ন পরিকল্পনা অন্তর্ভুক্ত করুন" এর কোয়েরি বিকল্পটি সক্ষম করুন ( CTRL-M)
  2. সিস্টেম ক্যাটালগ ভিউগুলির মধ্যে একটি থেকে একটি ক্ষেত্র নির্বাচন করে একটি ক্যোয়ারি সম্পাদন করুন (আমি একবারে কেবলমাত্র একটি ক্ষেত্র নির্বাচন করার পরামর্শ দিই, যেহেতু মৃত্যুদন্ড কার্যকর করার পরিকল্পনাটি কেবল একটি একক ক্ষেত্রের জন্যও হাস্যকরভাবে বড় / জটিল এবং এতে আপনি যে ক্ষেত্রগুলি সারণি করছেন তেমন কিছু ক্ষেত্রের উল্লেখও অন্তর্ভুক্ত থাকবে) টি নির্বাচন করা):

    SELECT recovery_model_desc FROM sys.databases;
  3. "এক্সিকিউশন প্ল্যান" ট্যাবে যান
  4. গ্রাফিকাল এক্সিকিউশন পরিকল্পনা অঞ্চলে ডান ক্লিক করুন এবং "এক্সিকিউশন প্ল্যান এক্সএমএল দেখান ..." নির্বাচন করুন
  5. এসএসএমএসে একটি নতুন ট্যাব এই জাতীয় শিরোনাম সহ খুলবে: Execution plan.xml
  6. যান Execution plan.xmlট্যাবে
  7. প্রথমটির জন্য অনুসন্ধান করুন <OutputList> ট্যাগের (এটি সাধারণত 10 এবং 20 লাইনের মধ্যে হওয়া উচিত)
  8. একটি হওয়া উচিত <ColumnReference> ট্যাগ । এই ট্যাগটিতে থাকা বৈশিষ্ট্যগুলি হয় একটি সারণীর নির্দিষ্ট ক্ষেত্রের দিকে নির্দেশ করতে হবে, বা পরিকল্পনার পরে সংজ্ঞায়িত কোনও অভিব্যক্তির দিকে নির্দেশ করবে।
  9. যদি বৈশিষ্ট্যগুলি একটি আসল ক্ষেত্রের দিকে নির্দেশ করে তবে আপনার সমস্ত তথ্য যেমন রয়েছে তেমনই আপনিও হয়ে গেছেন। নিম্নলিখিতটি recovery_model_descমাঠের জন্য কী দেখায় :

    <ColumnReference Database="[mssqlsystemresource]" Schema="[sys]"
                     Table="[syspalvalues]" Alias="[ro]" Column="name" />
  10. যদি বৈশিষ্ট্যগুলি কোনও অভিব্যক্তির দিকে নির্দেশ করে, যেমন আপনি পরিবর্তে state_descক্ষেত্রটি নির্বাচন করেছেন , তবে আপনি প্রাথমিকভাবে পাবেন:

    <ColumnReference Column="Expr1024" />
  11. এই ক্ষেত্রে, আপনার সংজ্ঞা Expr1024বা যাই হোক না কেন # যা আসে তার জন্য আপনার পরিকল্পনার বাকি অংশটি সন্ধান করা উচিত। কেবল মনে রাখবেন যে এর মধ্যে কয়েকটি উল্লেখ থাকতে পারে তবে সংজ্ঞাটি কোনও <OutputList>ব্লক হবে না । তবে এটিতে একটি <ScalarOperator>সহোদর উপাদান থাকবে যার সংজ্ঞা রয়েছে। নিম্নলিখিতটি state_descমাঠের জন্য কী দেখায় :

    <ScalarOperator ScalarString="CASE WHEN serverproperty('EngineEdition')=5 AND [Expr1081]=(1) THEN N'RESTORING' ELSE CASE WHEN serverproperty('EngineEdition')=5 AND CONVERT(bit,[master].[sys].[sysdbreg].[status] as [d].[status]&amp;(128),0)=(1) THEN N'COPYING' ELSE CASE WHEN serverproperty('EngineEdition')=5 AND CONVERT(bit,[master].[sys].[sysdbreg].[status] as [d].[status]&amp;(256),0)=(1) THEN N'SUSPECT' ELSE [mssqlsystemresource].[sys].[syspalvalues].[name] as [st].[name] END END END">

একইভাবে ডাটাবেস-স্তরের ক্যাটালগ দর্শনের উত্স পরীক্ষা করতেও করা যেতে পারে। এই জাতীয় কোনও বস্তুর জন্য sys.tablesএটি করা nameক্ষেত্রটি [current_db].[sys].[sysschobjs](যে কারণে এটিতে একটি ডেটাবেস-এর মিলনের সাথে মিল রয়েছে) এর lock_escalation_descক্ষেত্রটি আসে যখন ক্ষেত্রটি আসে [mssqlsystemresource].[sys].[syspalvalues](যার কারণে এটির একটি জোট রয়েছে Latin1_General_CI_AS_KS_WS)।

ক্লিপি বলেছেন, "দেখে মনে হচ্ছে আপনি একটি UNPIVOT কোয়েরি করতে চান" "

এখন আমরা কেন জানি কোলেশন প্রিলেন্সেন্স কী এবং এটি কীভাবে কাজ করে, আসুন সেই জ্ঞানটিকে UNPIVOT ক্যোয়ারিতে প্রয়োগ করি apply

কোনও UNPIVOTক্রিয়াকলাপের জন্য, এসকিউএল সার্ভারটি সত্যই পছন্দ করে বলে মনে হচ্ছে (অর্থ: প্রয়োজনীয়) যে প্রতিটি উত্স ক্ষেত্রটি একই ধরণের হয় । সাধারণত "টাইপ" বলতে বেস টাইপ (যেমন VARCHAR/ NVARCHAR/ INT/ ইত্যাদি) বোঝায় তবে এখানে এসকিউএল সার্ভারও COLLATION সহ অন্তর্ভুক্ত রয়েছে। কোলিশেশনগুলি যা নিয়ন্ত্রণ করে: এটি বর্ণনামূলক হিসাবে দেখা উচিত নয়: ভ্রচারের জন্য অক্ষর সেট (অর্থাত্ কোড পৃষ্ঠা) এবং ভাষাগত নিয়ম যা অক্ষরের সমতা এবং অক্ষরের সংমিশ্রণ নির্ধারণ করে (অর্থাত্ স্বাভাবিককরণ)। ইউনিকোড "নরমালাইজেশন" কী তার উপর নিম্নলিখিতটি মিমি-প্রাইমার রয়েছে:

PRINT '---';
IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI = N'å' COLLATE Danish_Greenlandic_100_CI_AI)
     PRINT 'Danish_Greenlandic_100_CI_AI';
IF (N'aa' COLLATE SQL_Latin1_General_CP1_CI_AI = N'å' COLLATE SQL_Latin1_General_CP1_CI_AI)
     PRINT 'SQL_Latin1_General_CP1_CI_AI';
PRINT '---';
IF (N'of' COLLATE Upper_Sorbian_100_CI_AI =  N'öf' COLLATE Upper_Sorbian_100_CI_AI)
     PRINT 'Upper_Sorbian_100_CI_AI';
IF (N'of' COLLATE German_PhoneBook_CI_AI =  N'öf' COLLATE German_PhoneBook_CI_AI)
     PRINT 'German_PhoneBook_CI_AI';
PRINT '---';

রিটার্নস:

---
Danish_Greenlandic_100_CI_AI
---
Upper_Sorbian_100_CI_AI
---

সুতরাং এখন আসুন আপনার মূল জিজ্ঞাসা শুরু করা যাক। বিভিন্ন পরিবর্তন কীভাবে ফলাফল পরিবর্তন করে তা দেখতে আমরা কয়েকটি পরীক্ষা করব এবং তারপরে আমরা দেখব যে কয়েকটি পরিবর্তন কীভাবে এটি সংশোধন করতে পারে।

  1. প্রথম ত্রুটিটি CompatibilityLevelক্ষেত্রটি সম্পর্কে , যা দ্বিতীয় ক্ষেত্রটি অপরিবর্তিত রয়েছে, এবং কেবলমাত্র সমস্ত স্ট্রিং লিটারাল যুক্ত অভিব্যক্তি হিসাবে ঘটে। কোনও ক্ষেত্রের রেফারেন্স ছাড়াই, ফলস্বরূপ জোটটিকে "coerciable-default" বলে মনে করা হয়)। Coercible- ডিফল্ট বর্তমান ডাটাবেস কোলেশন গ্রহণ, বলা যাক SQL_Latin1_General_CP1_CI_AS। পরবর্তী 20 বা ততোধিক ক্ষেত্রগুলি কেবল স্ট্রিং আক্ষরিক এবং সেহেতু এছাড়াও জবরদস্তি-পূর্বনির্ধারিত হয়, সুতরাং এগুলি দ্বন্দ্বের মধ্যে থাকা উচিত নয়। তবে আমরা যদি প্রথম ক্ষেত্রের দিকে ফিরে তাকাই recovery_model_desc, তবে এটি সরাসরি কোনও ক্ষেত্র থেকে আগত sys.databasesযা এটি একটি "অন্তর্নিহিত" কোলেশন তৈরি করে এবং এটি স্থানীয় ডিবি-র কোলেশন গ্রহণ করে না , পরিবর্তে এটি মূল মিলনটি ধরে রাখে, যা Latin1_General_CI_AS_KS_WS( কারণ এটি সত্যই [mssqlsystemresource]ডিবি থেকে আসছে )।

    সুতরাং, যদি ক্ষেত্র 1 (রিকভারি মডেল) হয় Latin1_General_CI_AS_KS_WSএবং ক্ষেত্র 2 (সামঞ্জস্যযোগ্যতা) হয় SQL_Latin1_General_CP1_CI_ASতবে আমাদের 2 Latin1_General_CI_AS_KS_WSক্ষেত্রটি ফিল্ড 1 এর সাথে ম্যাচ করতে বাধ্য করতে সক্ষম হওয়া উচিত এবং তারপরে ত্রুটিটি ফিল্ড 3 (অটোক্লোজ) এর জন্য উপস্থিত হওয়া উচিত।

    CompatibilityLevelলাইনের শেষে নিম্নলিখিতটি যুক্ত করুন :
    COLLATE Latin1_General_CI_AS_KS_WS

    এবং তারপরে কোয়েরিটি চালান। নিশ্চিতভাবেই, ত্রুটিটি এখন জানিয়েছে যে এটি সেই AutoCloseক্ষেত্রের সাথে দ্বন্দ্ব রয়েছে।

  2. আমাদের দ্বিতীয় পরীক্ষার জন্য আমাদের সবেমাত্র করা পরিবর্তনটি পূর্বাবস্থায় ফেলা দরকার (অর্থাত্ লাইনের COLLATEশেষে থেকে ধারাটি সরিয়ে ফেলুন) CompatibilityLevel

    এখন, যদি এসকিউএল সার্ভার ক্ষেত্রগুলি নির্দিষ্টভাবে ক্রম অনুসারে মূল্যায়ন করে থাকে তবে আমাদের ক্ষেত্রে ক্ষেত্র 1 (রিকভারি মডেল) সরিয়ে ফেলতে সক্ষম হওয়া উচিত যা বর্তমান ক্ষেত্র 2 (সামঞ্জস্যতাভিত্তিক) ক্ষেত্রটি যা মাস্টার কোলেশন সেট করে ফলাফল UNPIVOT। আর CompatibilityLevelক্ষেত্রটিতে কোনও দমনীয়-ডিফল্ট যা ডাটাবেসের কোলেশন লাগে, তাই প্রথম ত্রুটি হওয়া উচিত PageVerifyক্ষেত্র, যা একটি ক্ষেত্র রেফারেন্স, যা একটি অন্তর্নিহিত মূল কোলেশন, যা এই ক্ষেত্রে হয় ধারনকারী কোলেশন হয় Latin1_General_CI_AS_KS_WSএবং যা নয় বর্তমান ডিবি এর কোলেশন।

    তাই এগিয়ে যান এবং লাইন দিয়ে শুরু মন্তব্য , RecoveryModelমধ্যে SELECT(শীর্ষ প্রতি) এবং তারপর মন্তব্য RecoveryModelলাইন UNPIVOTনিচে দফা এবং জন্য নিম্নলিখিত লাইন থেকে নেতৃস্থানীয় কমা অপসারণ CompatibilityLevel, যাতে আপনি একটি বাক্য গঠন ত্রুটি পাবেন না।

    যে ক্যোয়ারী চালান। নিশ্চিতভাবেই, ত্রুটিটি এখন জানিয়েছে যে এটি PageVerifyক্ষেত্রের সাথে দ্বন্দ্ব রয়েছে।

  3. আমাদের তৃতীয় পরীক্ষার জন্য, RecoveryModelক্ষেত্রটি সরাতে আমরা যে পরিবর্তনগুলি করেছি তা পূর্বাবস্থায় ফেলা দরকার । সুতরাং এগিয়ে যান এবং কমা ফিরে দিন, এবং এই দুটি অন্যান্য লাইন uncomment।

    এখন আমরা একটি জোর জবরদস্তি দিয়ে অন্য দিকে যেতে পারি। কোয়ার্সেবল-ডিফল্ট কল্যানেশন ফিল্ডগুলির (যা তাদের বেশিরভাগের) কোলেশন পরিবর্তন করার পরিবর্তে, আমাদের আবশ্যক কোলেশন ক্ষেত্রগুলি বর্তমান ডিবি-তে পরিবর্তিত করতে সক্ষম হওয়া উচিত, তাই না?

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

    এগিয়ে যান এবং নীচের দিকে রেখার শেষে, শীর্ষে যেটি শুরু হয় , RecoveryModel: COLLATE DATABASE_DEFAULT

    যে ক্যোয়ারী চালান। নিশ্চিতভাবেই, ত্রুটিটি আবারও বলেছে যে এটি PageVerifyক্ষেত্রের সাথে দ্বন্দ্ব রয়েছে।

  4. চূড়ান্ত পরীক্ষার জন্য, আমাদের পূর্বের কোনও পরিবর্তন পূর্বাবস্থায় নেওয়ার দরকার নেই।

    এই UNPIVOTক্যোয়ারীটি ঠিক করার জন্য আমাদের এখনই যা করতে হবে তা হ'ল COLLATE DATABASE_DEFAULTবাকী অন্তর্নিহিত কোলেশন ক্ষেত্রগুলির শেষে যুক্ত করা: PageVerifyএবং RestrictedAccess। যদিও Collationক্ষেত্র এছাড়াও একটি অন্তর্নিহিত কোলেশন, যে মাঠ থেকে আসে masterডাটাবেস, যা সাধারণত "বর্তমান" ডাটাবেসের সঙ্গে সঙ্গতিপূর্ণ নয়। তবে, আপনি যদি নিরাপদ থাকতে চান যাতে এটি সর্বদা ঠিক কাজ করে, তবে COLLATE DATABASE_DEFAULTসেই ক্ষেত্রের শেষেও যুক্ত করুন ।

    যে ক্যোয়ারী চালান। নিশ্চিতভাবেই, কোনও ত্রুটি নেই। এই ক্যোয়ারীটি ঠিক করার জন্য যা কিছু করা হয়েছিল COLLATE DATABASE_DEFAULTতা 3 টি ক্ষেত্রের (অন্তর্ভুক্ত) এবং সম্ভবত আরও 1 টি (alচ্ছিক) যোগ করতে যাচ্ছিল ।

  5. ঐচ্ছিক টেস্ট: এখন যে আমরা অবশেষে UNPIVOT সঠিকভাবে কাজ ক্যোয়ারী, পরিবর্তন শুধু শুরু ক্ষেত্র সংজ্ঞা কোন এক আছে CONVERT(VARCHAR(50),পরিবর্তে হতে 51, হিসাবে: CONVERT(VARCHAR(51),

    ক্যোয়ারি চালান। আপনি The type of column "X" conflicts with the type of other columns specified in the UNPIVOT list.যে একই ত্রুটিটি পেয়েছিলেন তা একইভাবে পাওয়া উচিত যখন এটি কেবল মিলিত হয় না lation

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


কোলেশন সম্পর্কিত নির্দিষ্ট প্রশ্নের চেয়ে ক্যোয়ারির সাথে সম্পর্কিত নোট:

যেহেতু সমস্ত উত্স ক্ষেত্রটি ডেটাটাইপের হয় NVARCHAR, তাই এটি এর পরিবর্তে CONVERTসমস্ত আউটপুট ক্ষেত্রে নিরাপদ হবে । আপনি এই মুহুর্তে কোনও অ-মানক-এএসসিআইআই অক্ষরযুক্ত ডেটা নিয়ে কাজ করছেন না, তবে সিস্টেম মেটা-ডেটা তাদের এত রূপান্তরিত করার অনুমতি দেয় - যা কমপক্ষে those ক্ষেত্রগুলির মধ্যে সর্বাধিক সর্বোচ্চ দৈর্ঘ্য is গ্যারান্টি দেয় যে ভবিষ্যতে আপনার জন্য বা এই কোডটি অনুলিপি করা অন্য কারও জন্যই নেই যার সিস্টেমে ইতিমধ্যে এই অক্ষরগুলির কিছু থাকতে পারে।NVARCHARVARCHARNVARCHAR(128)


5

এই হল কার্যসংক্রান্ত প্রশ্ন করার জন্য একটি সম্পূর্ণ উত্তর নির্দিষ্ট ইস্যু বদলে জন্য। sql_variantপরিবর্তে রূপান্তর করে আপনি ত্রুটি এড়াতে পারেন varchar(50):

DECLARE @dbname SYSNAME;
SET @dbname = DB_NAME();

SELECT [Database]            = unpvt.DatabaseName
    , [Configuration Item]   = unpvt.OptionName
    , [Configuration Value]  = unpvt.OptionValue
    , [BaseType] = SQL_VARIANT_PROPERTY(unpvt.OptionValue, 'BaseType')
    , [MaxLength] = SQL_VARIANT_PROPERTY(unpvt.OptionValue, 'MaxLength')
    , [Collation] = SQL_VARIANT_PROPERTY(unpvt.OptionValue, 'Collation')
FROM (
    SELECT 
        DatabaseName = name 
        , RecoveryModel                 = CONVERT(sql_variant, d.recovery_model_desc)
        , CompatibilityLevel            = CONVERT(sql_variant, CASE d.[compatibility_level] WHEN 70 THEN 'SQL Server 7' WHEN 80 THEN 'SQL Server 2000' WHEN 90 THEN 'SQL Server 2005' WHEN 100 THEN 'SQL Server 2008' WHEN 110 THEN 'SQL Server 2012' WHEN 120 THEN 'SQL Server 2014' ELSE 'UNKNOWN' END)
        , AutoClose                     = CONVERT(sql_variant, CASE d.is_auto_close_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoCreateStatistics          = CONVERT(sql_variant, CASE d.is_auto_create_stats_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoShrink                    = CONVERT(sql_variant, CASE d.is_auto_shrink_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoUpdateStatistics          = CONVERT(sql_variant, CASE d.is_auto_update_stats_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , AutoUpdateStatisticsAsynch    = CONVERT(sql_variant, CASE d.is_auto_update_stats_async_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , CloseCursorOnCommit           = CONVERT(sql_variant, CASE d.is_cursor_close_on_commit_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DefaultCursor                 = CONVERT(sql_variant, CASE d.is_local_cursor_default WHEN 1 THEN 'LOCAL' ELSE 'GLOBAL' END)
        , ANSINULL_Default              = CONVERT(sql_variant, CASE d.is_ansi_null_default_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSINULLS_Enabled             = CONVERT(sql_variant, CASE d.is_ansi_nulls_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSIPadding_Enabled           = CONVERT(sql_variant, CASE d.is_ansi_padding_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ANSIWarnings_Enabled          = CONVERT(sql_variant, CASE d.is_ansi_warnings_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ArithmeticAbort_Enabled       = CONVERT(sql_variant, CASE d.is_arithabort_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , ConcatNullYieldsNull          = CONVERT(sql_variant, CASE d.is_concat_null_yields_null_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , CrossDBOwnerChain             = CONVERT(sql_variant, CASE d.is_db_chaining_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DateCorrelationOptimized      = CONVERT(sql_variant, CASE d.is_date_correlation_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , NumericRoundAbort             = CONVERT(sql_variant, CASE d.is_numeric_roundabort_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , [Parameterization]            = CONVERT(sql_variant, CASE d.is_parameterization_forced WHEN 0 THEN 'SIMPLE' ELSE 'FORCED' END)
        , QuotedIdentifiers_Enabled     = CONVERT(sql_variant, CASE d.is_quoted_identifier_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , RecursiveTriggers_Enabled     = CONVERT(sql_variant, CASE d.is_recursive_triggers_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , [TrustWorthy]                 = CONVERT(sql_variant, CASE d.is_trustworthy_on WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , VARDECIMAL_Storage            = CONVERT(sql_variant, 'TRUE')
        , PageVerify                    = CONVERT(sql_variant, page_verify_option_desc  )
        , BrokerEnabled                 = CONVERT(sql_variant, CASE d.is_broker_enabled WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , DatabaseReadOnly              = CONVERT(sql_variant, CASE d.is_read_only WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , EncryptionEnabled             = CONVERT(sql_variant, CASE d.is_encrypted WHEN 0 THEN 'FALSE' ELSE 'TRUE' END)
        , RestrictedAccess              = CONVERT(sql_variant, user_access_desc)
        , Collation                     = CONVERT(sql_variant, d.collation_name)
    FROM sys.databases d
    WHERE name = @dbname
        OR @dbname IS NULL
    ) src
UNPIVOT
(
    OptionValue FOR OptionName IN
    (
        RecoveryModel
        , CompatibilityLevel
        , AutoClose
        , AutoCreateStatistics 
        , AutoShrink 
        , AutoUpdateStatistics 
        , AutoUpdateStatisticsAsynch 
        , CloseCursorOnCommit 
        , DefaultCursor 
        , ANSINULL_Default 
        , ANSINULLS_Enabled 
        , ANSIPadding_Enabled 
        , ANSIWarnings_Enabled 
        , ArithmeticAbort_Enabled 
        , ConcatNullYieldsNull 
        , CrossDBOwnerChain 
        , DateCorrelationOptimized 
        , NumericRoundAbort 
        , [Parameterization] 
        , QuotedIdentifiers_Enabled 
        , RecursiveTriggers_Enabled 
        , [TrustWorthy] 
        , VARDECIMAL_Storage 
        , PageVerify 
        , BrokerEnabled 
        , DatabaseReadOnly 
        , EncryptionEnabled 
        , RestrictedAccess 
        , Collation
    )
) AS unpvt;

আমি কলামের অন্তর্নিহিত ধরণের সম্পর্কে তথ্যের জন্য তিনটি কলাম যুক্ত করেছি OptionValue

নমুনা আউটপুট

যদি ক্লায়েন্ট sql_variantডেটা পরিচালনা করতে না পারে তবে unpvt.OptionValueকলামে একটি চূড়ান্ত (শীর্ষ স্তরের) রূপান্তর করুন , যেমন nvarchar(256)


4

ঠিক আছে, তাই আমি একবার তাকান

sp_helptext [sys.databases]

তারপরে যেখানে কলামগুলি আসছিল সেগুলি ভেঙ্গে গেছে। Latin1_General_CI_AS_KS_WSকোলেশন সহ সমস্তগুলি সিস্টেম টেবিল থেকে আসছে sys.syspalvaluesযা জেনেরিক লুক টেবিল হিসাবে উপস্থিত হবে (এটি একটি সিস্টেম টেবিল, সুতরাং এটি দেখার জন্য আপনাকে ড্যাকের মাধ্যমে সংযুক্ত হতে হবে))।

আমার অনুমান যে এটি Latin1_General_CI_AS_KS_WSকোনও সম্ভাব্য লুকিংয়ের মানগুলি হ্যান্ডেল করার জন্য সেট করা হয়েছে। আমি দেখতে পাচ্ছি কিভাবে এটি বিরক্তিকর হবে।

সংজ্ঞাটি দেখার আরও একটি উপায় (মূলত একটি মন্তব্যে সর্বাধিক প্রদত্ত ):

SELECT ObjectSchema = s.name
    , ObjectName = o.name
    , ObjectDefinition = sm.definition
FROM master.sys.all_sql_modules sm
    INNER JOIN master.sys.system_objects o ON sm.object_id = o.object_id
    INNER JOIN master.sys.schemas s ON o.schema_id = s.schema_id
WHERE s.name = 'sys' 
    AND o.name = 'databases';`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.