"এসকিউএল_ল্যাটিন 1_ জেনারাল_সিপি 1_সিআই_এএস" এবং "ল্যাটিন 1_ জেনারাল_সিআই_এএস" এর মধ্যে সমান ক্রিয়াকলাপটি অপারেশনের সমানতে সমাধান করতে পারে না


343

আমার কাছে নিম্নলিখিত কোড রয়েছে

SELECT tA.FieldName As [Field Name],
       COALESCE(tO_A.[desc], tO_B.[desc], tO_C.Name, tA.OldVAlue) AS [Old Value],
       COALESCE(tN_A.[desc], tN_B.[desc], tN_C.Name, tA.NewValue) AS [New Value],
       U.UserName AS [User Name],
       CONVERT(varchar, tA.ChangeDate) AS [Change Date] 
  FROM D tA
       JOIN 
       [DRTS].[dbo].[User] U 
         ON tA.UserID = U.UserID
       LEFT JOIN 
       A tO_A 
         on tA.FieldName = 'AID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_A.ID)
       LEFT JOIN 
       A tN_A 
         on tA.FieldName = 'AID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_A.ID)
       LEFT JOIN 
       B tO_B 
         on tA.FieldName = 'BID' 
        AND tA.oldValue = CONVERT(VARCHAR, tO_B.ID)
       LEFT JOIN 
       B tN_B 
         on tA.FieldName = 'BID' 
        AND tA.newValue = CONVERT(VARCHAR, tN_B.ID)
       LEFT JOIN 
       C tO_C 
         on tA.FieldName = 'CID' 
        AND tA.oldValue = tO_C.Name
       LEFT JOIN 
       C tN_C 
         on tA.FieldName = 'CID' 
        AND tA.newValue = tN_C.Name
 WHERE U.Fullname = @SearchTerm
ORDER BY tA.ChangeDate

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

উত্তর:


307

আপনার টেবিলে দুটি পৃথক জোটের মিল নেই। এই কোয়েরিটি ব্যবহার করে আপনি আপনার টেবিল (গুলি) এর প্রতিটি কলামে কী কোলেশন রয়েছে তা পরীক্ষা করতে পারেন:

SELECT
    col.name, col.collation_name
FROM 
    sys.columns col
WHERE
    object_id = OBJECT_ID('YourTableName')

স্ট্রিংগুলি অর্ডার ও তুলনা করার সময় কলশনগুলি প্রয়োজনীয় এবং ব্যবহৃত হয়। আপনার ডাটাবেস জুড়ে একটি একক, অনন্য কোলেশন ব্যবহার করা সাধারণত ভাল ধারণা - একটি টেবিল বা ডাটাবেসের মধ্যে বিভিন্ন কোলিশন ব্যবহার করবেন না - আপনি কেবল সমস্যার জন্য জিজ্ঞাসা করছেন ....

একবার আপনি একটি একক জোটের জন্য স্থির হয়ে গেলে, আপনি এই কমান্ডটি ব্যবহার করে এখনও মেলে না এমন টেবিল / কলামগুলি পরিবর্তন করতে পারেন:

ALTER TABLE YourTableName
  ALTER COLUMN OffendingColumn
    VARCHAR(100) COLLATE Latin1_General_CI_AS NOT NULL

আঙ্গুরের ছিরড়া

আপডেট: আপনার ডাটাবেসে পূর্ণ পাঠ্য সূচকগুলি খুঁজতে, এই ক্যোয়ারীটি এখানে ব্যবহার করুন:

SELECT
    fti.object_Id,
    OBJECT_NAME(fti.object_id) 'Fulltext index',
    fti.is_enabled,
    i.name 'Index name',
    OBJECT_NAME(i.object_id) 'Table name'
FROM 
    sys.fulltext_indexes fti
INNER JOIN 
    sys.indexes i ON fti.unique_index_id = i.index_id

তারপরে আপনি ফুলটেক্সট সূচীটি ব্যবহার করে ड्रপ করতে পারেন:

DROP FULLTEXT INDEX ON (tablename)

ধন্যবাদ মার্ক যে আমি ঠিক সেই ধরণের জিনিসটি খুঁজছিলাম, সেগুলির মধ্যে একটি হ'ল কিছু নির্বোধ কারণে আলাদা কোলেশন! আমি স্ট্যান্ডার্ড কোলেশন পরিবর্তনের চেষ্টা করব এবং দেখুন কী ঘটে see
jhowe

মার্ক আমি এখন এটি পাচ্ছি: কলাম পরিবর্তন বা ড্রপ করতে পারে না কারণ এটি পূর্ণ-পাঠ্য অনুসন্ধানের জন্য সক্ষম।
jhowe

1
সেক্ষেত্রে আপনাকে সেই টেবিলটিতে অস্থায়ীভাবে আপনার
পুরো পাঠ্যসূচিটি

1
ধন্যবাদ ওপি, আমি একটি অস্থায়ী টেবিল স্থাপন করছিলাম যাতে এটি সাহায্য করেছিল, তবে আমি টেবিলটি পরিবর্তন করতে না পারায়, (কেবল নীচে) দিয়ে শুরু করার জন্য আমার ঠিক এটি সঠিকভাবে প্রকাশ করা দরকার: @ টেবিল টেবিল (তুলনা মেসেজ ভিচারার (50) কল SQL_Latin1_General_CP1_CI_AS না শূন্য)
FrostbiteXIII

1
কেন আমরা একই টেবিলে 2 টি পৃথক কোলেশন করতে পারি না। আমার যদি এনভারচর হিসাবে 1 টি কলাম থাকে তবে কেবলমাত্র ইংরেজী নাম এবং রাশিয়ান বর্ণ হিসাবে অন্যান্য কলাম, জাপানি অক্ষর হিসাবে অন্যান্য কলাম দরকার letters আমি কীভাবে এই ব্যবস্থা করব? একটি একক কোলেশন কি এই সমস্ত কভার?
ব্যাটম্যাকি

855

আমি নিম্নলিখিতটি করি:

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

প্রতিবার কাজ করে। :)


68
এটি এসও
জেমি স্ট্রস

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

5
যদি একই দুটি ক্ষেত্র অন্য স্থানে (তুলনা, ইউনিয়ন, কৌলেসেস, ইত্যাদি ...) একসাথে ব্যবহার করা হয় তবে নিশ্চিত হয়ে নিন যে সেগুলির প্রত্যেকটিরও জোট নির্দিষ্ট করা আছে।
জেরেফেথ

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

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

80

collateআপনার ক্যোয়ারিতে ধারাটি ব্যবহার করুন :

LEFT JOIN C tO_C on tA.FieldName = 'CID' AND tA.oldValue COLLATE Latin1_General_CI_AS = tO_C.Name  

আমার কাছে সিনট্যাক্সটি ঠিক ঠিক না থাকতে পারে (বিওএল পরীক্ষা করুন), তবে ক্যোয়ারির জন্য ফ্লাইটটি অন-দ্য ফ্লাইটটি পরিবর্তন করতে আপনি এটি করতে পারেন - আপনার প্রতিটি জোনের জন্য ক্লজ যুক্ত করতে হবে।

সম্পাদনা করুন: আমি বুঝতে পেরেছিলাম যে এটি ঠিক ছিল না - কোলেটের ধারাটি আপনার যে ক্ষেত্রটি পরিবর্তন করতে হবে তার পরে চলে যায় - এই উদাহরণে আমি tA.oldValueমাঠে থাকা জোটটি পরিবর্তন করেছি ।


29

যে ক্ষেত্রগুলির জন্য এটি এই ত্রুটিটি ছুঁড়েছে তা সনাক্ত করুন এবং সেগুলিতে নিম্নলিখিতগুলি যুক্ত করুন: DATABASE_DEFAULT কল করুন

কোড ফিল্ডে দুটি সারণী যোগদান করেছে:

...
and table1.Code = table2.Code
...

আপনার ক্যোয়ারী এতে আপডেট করুন:

...
and table1.Code COLLATE DATABASE_DEFAULT = table2.Code COLLATE DATABASE_DEFAULT
...

ধন্যবাদ। কোনও প্রোড ডাটাবেসে কাজ করার সময় আমরা সর্বদা গ্রহণযোগ্য উত্তরের প্রস্তাবিত ডাটাবেস কাঠামো পরিবর্তন করতে পারি না।
জেনিফার উড

20

এটি সহজেই ঘটতে পারে যখন আপনার কাছে 2 টি পৃথক ডাটাবেস এবং 2 টি আলাদা আলাদা সার্ভার থেকে বিশেষত 2 টি পৃথক ডাটাবেস থাকে। সেরা বিকল্প হ'ল এটি একটি সাধারণ সংগ্রহে পরিবর্তন করা এবং যোগদান বা তুলনা করা।

SELECT 
   *
FROM sd
INNER JOIN pd ON sd.SCaseflowID COLLATE Latin1_General_CS_AS = pd.PDebt_code COLLATE Latin1_General_CS_AS

13

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

...WHERE fieldname COLLATE DATABASE_DEFAULT in (
          SELECT DISTINCT otherfieldname COLLATE DATABASE_DEFAULT
          FROM ...
          WHERE ...
        )


6

এর মূল কারণ হ'ল যে স্কিএল সার্ভার ডাটাবেস থেকে আপনি স্কিমাটি নিয়েছেন তাতে একটি কোলেশন রয়েছে যা আপনার স্থানীয় ইনস্টলেশন থেকে পৃথক। আপনি যদি কোলেশন সম্পর্কে চিন্তা করতে না চান তবে স্থানীয়ভাবে এসকিউএল সার্ভার ২০০২ ডাটাবেস হিসাবে একই কোলেশন ব্যবহার করে স্থানীয়ভাবে এসকিউএল সার্ভার ইনস্টল করুন।


একই সমস্যা থাকলে আপনার প্রথমে আপনার সার্ভার এবং ডাটাবেস সম্পত্তিটি পরীক্ষা করে দেখতে হবে তাদের একই মিল রয়েছে কিনা
মদন

5

ত্রুটি (.... এর মধ্যে কোলেশন বিরোধের সমাধান করতে পারে না) সাধারণত একাধিক ডাটাবেস থেকে ডেটা তুলনা করার সময় ঘটে।

যেহেতু আপনি এখন ডেটাবেসগুলির কোলেশন পরিবর্তন করতে পারবেন না, তাই COLLATE DATABASE_DEFAULT ব্যবহার করুন।

----------
AND db1.tbl1.fiel1 COLLATE DATABASE_DEFAULT =db2.tbl2.field2 COLLATE DATABASE_DEFAULT 

: এই আরেকটি ইতিমধ্যে দেওয়া উত্তর থেকে কোন পার্থক্য নাই stackoverflow.com/a/1607725/479251
Pac0


4

মার্ক_স এর উত্তরের জন্য ধন্যবাদ আমি আমার মূল সমস্যাটি সমাধান করেছি - এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে এবং একবারে পুরো টেবিলকে রূপান্তরিত করার জন্য একটি পদ্ধতির পোস্ট করার জন্য অনুপ্রাণিত করেছি - টিএসকিউএল স্ক্রিপ্ট পরিবর্তন করে কলামের বিবৃতি উত্পন্ন করতে:

DECLARE @tableName VARCHAR(MAX)
SET @tableName = 'affiliate'
--EXEC sp_columns @tableName
SELECT  'Alter table ' + @tableName + ' alter column ' + col.name
        + CASE ( col.user_type_id )
            WHEN 231
            THEN ' nvarchar(' + CAST(col.max_length / 2 AS VARCHAR) + ') '
          END + 'collate Latin1_General_CI_AS ' + CASE ( col.is_nullable )
                                                    WHEN 0 THEN ' not null'
                                                    WHEN 1 THEN ' null'
                                                  END
FROM    sys.columns col
WHERE   object_id = OBJECT_ID(@tableName)

পায়: টেবিলের অধিভুক্ত ALLOL মাই টেবিল এনভিচারার (4000) কল করুন ল্যাটিন 1_ জেনারেল_সিআই_এই নন

আমি কল.ম্যাক্স_এই লেন্থ / ২ - এর প্রয়োজনীয়তা দেখে আশ্চর্য হয়েছি তা স্বীকার করব -


আমি মনে করি দুটি দ্বারা বিভাজন প্রয়োজন কারণ দৈর্ঘ্য অভ্যন্তরীণভাবে বাইট সংখ্যা হিসাবে সংরক্ষণ করা হয়। এনভারচর বর্ণের পরিবর্তে একটি চরিত্রের পরিবর্তে দুটি বাইট নেয়।
জেবি

দুর্দান্ত কাজ, কীভাবে উপরে কোয়েরি নন্টি ডেটা টাইপের জন্য গণনা সম্ভবত কল.ম্যাক্স_সৌধ / 2 -
ইমরান

2

এই সমস্যাটি সৃষ্টি করছে এমন ডাটাবেসগুলির জন্য যাদের কাছে একটি ক্রিয়েট ডেটাবেস স্ক্রিপ্ট রয়েছে (যেমন আমার ক্ষেত্রে ছিল) আপনি কোলেশনের সাথে মিলে নিম্নলিখিত ক্রিয়েট স্ক্রিপ্টটি ব্যবহার করতে পারেন:

-- Create Case Sensitive Database
CREATE DATABASE CaseSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CS_AS -- or any collation you require
GO
USE CaseSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

অথবা

-- Create Case In-Sensitive Database
CREATE DATABASE CaseInSensitiveDatabase
COLLATE SQL_Latin1_General_CP1_CI_AS -- or any collation you require
GO
USE CaseInSensitiveDatabase
GO
SELECT *
FROM sys.types
GO
--rest of your script here

এটি সমস্ত টেবিলগুলিতে কাঙ্ক্ষিত কোলেশন প্রয়োগ করে, যা আমার প্রয়োজন ছিল what সার্ভারে থাকা সমস্ত ডেটাবেজের জন্য কোলেশনটি একইরূপে চেষ্টা করা এবং রাখা আদর্শ। আশাকরি এটা সাহায্য করবে.

নিম্নলিখিত লিঙ্কে আরও তথ্য: এসকিউএল সার্ভার - সার্ভারে বিভিন্ন কোলেশন সহ ডেটাবেস তৈরি করা


2

আমি এই সাইট থেকে সামগ্রীটি নিম্নলিখিত স্ক্রিপ্ট তৈরি করতে ব্যবহার করেছি যা সমস্ত টেবিলের সমস্ত কলামের জোট পরিবর্তন করে:

CREATE PROCEDURE [dbo].[sz_pipeline001_collation] 
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


SELECT 'ALTER TABLE [' + SYSOBJECTS.Name + '] ALTER COLUMN [' + SYSCOLUMNS.Name + '] ' +
SYSTYPES.name + 
    CASE systypes.NAME
    WHEN 'text' THEN ' '
    ELSE
    '(' + RTRIM(CASE SYSCOLUMNS.length
    WHEN -1 THEN 'MAX'
    ELSE CONVERT(CHAR,SYSCOLUMNS.length)
    END) + ') ' 
    END

    + ' ' + ' COLLATE Latin1_General_CI_AS ' + CASE ISNULLABLE WHEN 0 THEN 'NOT NULL' ELSE 'NULL' END
    FROM SYSCOLUMNS , SYSOBJECTS , SYSTYPES
    WHERE SYSCOLUMNS.ID = SYSOBJECTS.ID
    AND SYSOBJECTS.TYPE = 'U'
    AND SYSTYPES.Xtype = SYSCOLUMNS.xtype
    AND SYSCOLUMNS.COLLATION IS NOT NULL
    AND NOT ( sysobjects.NAME LIKE 'sys%' )
    AND NOT ( SYSTYPES.name LIKE 'sys%' )

END

1
Nvarchar কলামের SYSCOLUMNS.length 2 ভাগে ভাগ করা উচিত নয়
Palota

2

মিলে যায় না এমন কোলেশন স্তরটি পরীক্ষা করুন (সার্ভার, ডাটাবেস, টেবিল, কলাম, চরিত্র)।

যদি এটি সার্ভার হয় তবে এই পদক্ষেপগুলি আমাকে একবার সহায়তা করেছিল:

  1. সার্ভারটি বন্ধ করুন
  2. আপনার sqlservr.exe সরঞ্জামটি সন্ধান করুন
  3. এই আদেশটি চালান:

    sqlservr -m -T4022 -T3659 -s"name_of_insance" -q "name_of_collation"

  4. আপনার এসকিএল সার্ভারটি শুরু করুন:

    net start name_of_instance

  5. আবার আপনার সার্ভারের কোলেশন পরীক্ষা করুন।

এখানে আরও তথ্য:

https://www.mssqltips.com/sqlservertip/3519/changing-sql-server-collation-after-installation/


2

এটি যদি আপনার পুরো ডিবি জুড়ে দেখা দেয় তবে আপনার ডিবি কোলেশনটি এভাবে পরিবর্তন করা ভাল:

USE master;  
GO  
ALTER DATABASE MyOptionsTest  
COLLATE << INSERT COLATION REQUIRED >> ;  
GO  

--Verify the collation setting.  
SELECT name, collation_name  
FROM sys.databases  
WHERE name = N'<< INSERT DATABASE NAME >>';  
GO 

এখানে রেফারেন্স


দুর্ভাগ্যক্রমে এটি বিদ্যমান টেবিলগুলির জন্য
জোট

2

ভারচার এবং ভারচার (ম্যাক্স) কলামগুলি মোকাবেলায় @ জাস্টস্টিভের উত্তরটিতে কোড যুক্ত করা হয়েছে:

DECLARE @tableName VARCHAR(MAX)
SET @tableName = 'first_notes'
--EXEC sp_columns @tableName
SELECT  'Alter table ' + @tableName + ' alter column ' + col.name
        + CASE ( col.user_type_id )
            WHEN 231
            THEN ' nvarchar(' + CAST(col.max_length / 2 AS VARCHAR) + ') '
            WHEN 167
            THEN ' varchar(' + CASE col.max_length 
                                WHEN -1 
                                THEN 'MAX'
                                ELSE 
                                CAST(col.max_length AS VARCHAR)
                                end
                                 + ') '
          END + 'collate Latin1_General_CI_AS ' + CASE ( col.is_nullable )
                                                    WHEN 0 THEN ' not null'
                                                    WHEN 1 THEN ' null'
                                                  END
FROM    sys.columns col
WHERE   object_id = OBJECT_ID(@tableName)

2

উভয় ডাটাবেস পরিবর্তন না করেই ক্যোয়ারিতে এই সমস্যাটি সমাধান করার জন্য, আপনি "=" এর সাথে সাইন এর অন্য দিকে প্রকাশ করতে পারেন cast

COLLATE SQL_Latin1_General_CP1_CI_AS

এখানে প্রস্তাবিত হিসাবে ।


1

আমার পুরানো জেডিবিসি ড্রাইভার ব্যবহার করার সময় আমার অনুরূপ ত্রুটি হয়েছিল (ইন্টারন্যাশনাল অপারেশনে "এসকিউএল_ল্যাটিন 1_ জেনারাল_সিপি 1_সিআই_এএস" এবং "এসকিউএল_ল্যাটিন 1_ জেনারাল_সিপি 1250_CI_AS" এর মধ্যে কোলেশন বিরোধের সমাধান করতে পারছি না)।

আমি মাইক্রোসফ্ট বা ওপেন-সোর্স প্রকল্প জেটিডিএস থেকে নতুন ড্রাইভার ডাউনলোড করে এটি সমাধান করেছি


1

এখানে আমরা যা করেছি তা এখানে রয়েছে, আমাদের পরিস্থিতিতে আমাদের চাহিদার উপর তারিখের সীমাবদ্ধতা ব্যবহার করে কার্যকর করার জন্য একটি অ্যাডহক কোয়েরি প্রয়োজন এবং কোয়েরিটি একটি সারণীতে সংজ্ঞায়িত করা হয়েছে।

আমাদের নতুন ক্যোয়ারিতে বিভিন্ন ডাটাবেসের মধ্যে ডেটা মেলাতে হবে এবং সেগুলির দুটি থেকে ডেটা অন্তর্ভুক্ত করা দরকার।

দেখে মনে হচ্ছে যে আইবিএস / এএস 400 সিস্টেম থেকে ডেটা আমদানি করা ডিবি এবং আমাদের রিপোর্টিং ডেটাবেস - এর মধ্যে পৃথক পৃথক রয়েছে - এটি নির্দিষ্ট ডেটা ধরণের কারণে (যেমন নামগুলিতে গ্রীক অ্যাকসেন্ট ইত্যাদি) হতে পারে।

সুতরাং আমরা নীচের যোগদানের ধারাটি ব্যবহার করেছি:

...LEFT Outer join ImportDB..C4CTP C4 on C4.C4CTP COLLATE Latin1_General_CS_AS=CUS_Type COLLATE Latin1_General_CS_AS

1

আপনি সহজেই 4 টি সহজ পদক্ষেপ ব্যবহার করে এটি করতে পারেন

  1. আপনার ডাটাবেস ব্যাকআপ, ঠিক incase
  2. ডাটাবেস কোলেশন পরিবর্তন করুন: ডানদিকের ডাটাবেস ক্লিক করুন, বৈশিষ্ট্য নির্বাচন করুন, বিকল্পগুলিতে যান এবং প্রয়োজনীয় কোলেশনে কোলেশন পরিবর্তন করুন।
  3. আপনার সমস্ত ডাটাবেস অবজেক্টগুলি ড্রপ এবং পুনরুদ্ধারে স্ক্রিপ্ট তৈরি করুন: আপনার ডাটাবেসটিতে ডান ক্লিক করুন, কার্যগুলি নির্বাচন করুন, স্ক্রিপ্ট উত্পন্ন করুন ... (নিশ্চিত করুন যে আপনি উইজার্ডের উন্নত বিকল্পগুলিতে ড্রপ এবং তৈরি নির্বাচন করেছেন, এছাড়াও স্কিমা এবং ডেটা নির্বাচন করুন)
  4. উপরে তৈরি স্ক্রিপ্টটি চালান

1
INSERT INTO eSSLSmartOfficeSource2.[dbo].DeviceLogs  (DeviceId,UserId,LogDate,UpdateFlag) 
SELECT DL1.DeviceId ,DL1.UserId COLLATE DATABASE_DEFAULT,DL1.LogDate 
,0 FROM eSSLSmartOffice.[dbo].DeviceLogs DL1 
WHERE  NOT EXISTS 
(SELECT DL2.DeviceId ,DL2.UserId COLLATE DATABASE_DEFAULT
,DL2.LogDate ,DL2.UpdateFlag 
FROM eSSLSmartOfficeSource2.[dbo].DeviceLogs DL2    
WHERE  DL1.DeviceId =DL2.DeviceId
 and DL1.UserId collate  Latin1_General_CS_AS=DL2.UserId collate  Latin1_General_CS_AS
  and DL1.LogDate =DL2.LogDate )

0

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



0

আমারও একই রকম প্রয়োজন ছিল; অনুরূপ দৃশ্যের সাথে কারও কাছে আমার পদ্ধতির ডকুমেন্টিং ...

দৃশ্যপট

  • সঠিক কোলেশন সহ ক্লিন ইনস্টল থেকে আমার কাছে একটি ডাটাবেস রয়েছে।
  • আমার অন্য একটি ডাটাবেস রয়েছে যা ভুল কোলেশন রয়েছে।
  • পূর্বের উপর সংজ্ঞায়িত কোলেশনগুলি ব্যবহার করার জন্য আমার উত্তরোত্তরটি আপডেট করতে হবে।

সমাধান

গন্তব্য (অবৈধ কোলেশন সহ ডিবি) উত্সের সাথে (ক্লিন ইনস্টল) তুলনা করতে এসকিউএল সার্ভার স্কিমা তুলনা ( এসকিউএল সার্ভার ডেটা সরঞ্জাম / ভিজ্যুয়াল স্টুডিও থেকে) ব্যবহার করুন।

আমার ক্ষেত্রে আমি দুটি ডিবি সরাসরি তুলনা করেছি; যদিও আপনি কোনও প্রকল্পের মাধ্যমে আপনাকে ম্যানুয়ালি টুকরো টুকরো টুকরো করার সুযোগ দিতে পারে ...

  • চালান ভিজ্যুয়াল স্টুডিও
  • একটি নতুন এসকিউএল সার্ভার ডেটা প্রকল্প তৈরি করুন
  • সরঞ্জামগুলি, এসকিউএল সার্ভার, নতুন স্কিমা তুলনা ক্লিক করুন
  • উত্স ডাটাবেস নির্বাচন করুন
  • লক্ষ্য ডাটাবেস নির্বাচন করুন
  • বিকল্পগুলি ক্লিক করুন (⚙)
    • Object Typesআপনার আগ্রহী কেবল সেই ধরণেরগুলি নির্বাচন করুন (আমার জন্য এটি কেবল Viewsএবং কেবল Tables)
    • অধীনে Generalনির্বাচন করুন:
      • সম্ভাব্য ডেটা ক্ষতিতে অবরুদ্ধ করুন
      • ডিডিএল ট্রিগারগুলি অক্ষম করুন এবং পুনরায় সক্ষম করুন
      • ক্রিপ্টোগ্রাফিক সরবরাহকারী ফাইল পাথ উপেক্ষা করুন
      • ফাইল এবং লগ ফাইলের পথ উপেক্ষা করুন
      • ফাইলের আকার উপেক্ষা করুন
      • ফাইলগোষ্ঠী স্থাপনা উপেক্ষা করুন
      • পূর্ণ পাঠ্য ক্যাটালগ ফাইলের পথ উপেক্ষা করুন
      • কীওয়ার্ড কেসিং উপেক্ষা করুন
      • লগইন এসআইডি উপেক্ষা করুন
      • উদ্ধৃত শনাক্তকারীদের উপেক্ষা করুন
      • রুটটি আজীবন উপেক্ষা করুন
      • বিবৃতিগুলির মধ্যে সেমিকোলন উপেক্ষা করুন
      • সাদা স্থান উপেক্ষা করুন
      • স্ক্রিপ্ট রিফ্রেশ মডিউল
      • নতুন সীমাবদ্ধতার জন্য স্ক্রিপ্ট বৈধতা
      • কোলেশন সামঞ্জস্যতা যাচাই করুন
      • স্থাপনা যাচাই করুন
  • তুলনা ক্লিক করুন
    • মুছে ফেলার জন্য চিহ্নিত করা কোনও বস্তুটি আনচেক করুন (এনবি: সেগুলিতে এখনও কোলেশন সংক্রান্ত সমস্যা থাকতে পারে; তবে যেহেতু তারা আমাদের উত্স / টেমপ্লেট ডিবিতে আমাদের সংজ্ঞায়িত না করা হয়েছে; যেভাবেই হোক, আমরা জিনিস হারাতে চাই না যদি আমরা শুধুমাত্র লক্ষ্যবস্তু পরিবর্তনের পরিবর্তন)। DELETEফোল্ডারে ডান ক্লিক করে এবং নির্বাচন করে আপনি একবারে সমস্ত আনচেক করতে পারেন EXCLUDE
    • তেমনিভাবে কারও জন্য বাদ দিন CREATE বস্তুর (এখানে যেহেতু তারা লক্ষ্যমাত্রায় উপস্থিত না থেকে তাদের সেখানে ভুল কোলেশন থাকতে পারে না; তাদের উপস্থিতি থাকা উচিত কিনা তা অন্য কোনও বিষয়ের জন্য প্রশ্ন)।
    • সেই অবজেক্টের স্ক্রিপ্ট দেখতে CHANGE এর অধীনে প্রতিটি বস্তুতে ক্লিক করুন। আমরা কেবল কোলেশন পরিবর্তন করছি তা নিশ্চিত করার জন্য ডিফটি ব্যবহার করুন (ম্যানুয়ালি অন্য যে কোনও পার্থক্য সনাক্ত করা হয়েছে আপনি সম্ভবত সেই বিষয়গুলি ম্যানুয়ালি বাদ দিতে / পরিচালনা করতে চান)।
  • Updateপরিবর্তনগুলি ঠেকাতে ক্লিক করুন

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

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

আপনি সেখানে ডাটাবেস প্রকল্পের ফাইলগুলি সন্ধান / প্রতিস্থাপন ব্যবহার করতে পারেন আপনার যদি সেখানে বৃহত্তর সেটিংস সংশোধন করতে চান (উদাহরণস্বরূপ আপনি স্কিমার তুলনা করে প্রকল্পের ফাইলটিকে সংশোধন করতে পারেন, প্রকল্পের সংশোধন করতে পারেন, তারপরে উত্স / টার্গেট টগল করুন আপনার পরিবর্তনগুলি ডিবি-তে ফিরিয়ে দিতে স্কিমাটি তুলনা করুন)।

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