ไม่สามารถแก้ไขข้อขัดแย้งการเรียงระหว่าง“ SQL_Latin1_General_CP1_CI_AS” และ“ Latin1_General_CI_AS” ในการดำเนินการเท่ากับ


345

ฉันมีรหัสต่อไปนี้

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

เมื่อเรียกใช้รหัสฉันได้รับข้อผิดพลาดในชื่อหลังจากเพิ่มตัวเชื่อมสองตัวสำหรับตาราง C ฉันคิดว่านี่อาจมีบางอย่างเกี่ยวกับความจริงที่ฉันใช้ SQL Server 2008 และกู้คืนสำเนาของ db นี้ไปที่ เครื่องของฉันซึ่งเป็น 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

มาร์ค

UPDATE: เพื่อค้นหาดัชนี fulltext ในฐานข้อมูลของคุณให้ใช้แบบสอบถามนี้ที่นี่:

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

จากนั้นคุณสามารถปล่อยดัชนี fulltext โดยใช้:

DROP FULLTEXT INDEX ON (tablename)

ขอบคุณมาร์คที่เป็นประเภทของสิ่งที่ฉันกำลังมองหาหนึ่งในตารางคือการเปรียบเทียบที่แตกต่างกันด้วยเหตุผลโง่บางอย่าง! ฉันจะลองเปลี่ยนเป็นการเปรียบเทียบมาตรฐานและดูว่าเกิดอะไรขึ้น
jhowe

มาร์คฉันได้รับสิ่งนี้: ไม่สามารถแก้ไขหรือลบคอลัมน์เนื่องจากเปิดใช้งานสำหรับการค้นหาข้อความแบบเต็ม
jhowe

1
ในกรณีนี้คุณจะต้องวางดัชนี fulltext ของคุณลงบนตารางนั้นชั่วคราวเปลี่ยนการจัดเรียงแล้วสร้างดัชนี fulltext อีกครั้งอีกครั้ง
marc_s

1
ขอบคุณ OP ฉันได้ตั้งค่าตารางชั่วคราวดังนั้นสิ่งนี้จึงช่วยได้ แต่เนื่องจากฉันไม่สามารถเปลี่ยนตารางได้ฉันต้องประกาศอย่างถูกต้องเพื่อเริ่มต้นด้วย (ดังนี้): DECLARE @Table Table (CompareMessage VARCHAR (50) COLLATE SQL_Latin1_General_CP1_CI_AS ไม่เป็นโมฆะ)
FrostbiteXIII

1
เหตุใดเราจึงไม่มีการเปรียบเทียบ 2 แบบที่ต่างกันบนโต๊ะ หากฉันมี 1 คอลัมน์เป็น nvarchar ซึ่งต้องการเฉพาะชื่อภาษาอังกฤษและคอลัมน์อื่น ๆ เป็นตัวอักษรภาษารัสเซียคอลัมน์อื่น ๆ เป็นตัวอักษรญี่ปุ่น ฉันจะจัดการสิ่งนี้ได้อย่างไร มีการเปรียบเทียบครั้งเดียวครอบคลุมทั้งหมดเหล่านี้หรือไม่
batmaci

856

ฉันทำต่อไปนี้:

...WHERE 
    fieldname COLLATE DATABASE_DEFAULT = otherfieldname COLLATE DATABASE_DEFAULT

ทำงานได้ทุกครั้ง :)


68
นี่เป็นหนึ่งในโพสต์ที่มีประโยชน์ที่สุดใน SO
Jamie Strauss

2
ใช้วิธีแก้ปัญหานี้เพราะฉันทำงานกับระบบเดิมสองระบบที่ใช้ฐานข้อมูลเดียวกันดังนั้นฉันจึงไม่แน่ใจว่าการเปลี่ยนการเรียงชุดของตารางจะทำให้ฟังก์ชันการทำงานเสียหายหรือไม่
paolobueno

5
หากมีการใช้สองฟิลด์เดียวกันร่วมกันในที่อื่น (การเปรียบเทียบสหภาพรวมกัน ฯลฯ ... ) ตรวจสอบให้แน่ใจว่าแต่ละฟิลด์นั้นมีการเปรียบเทียบที่ระบุไว้ด้วย
Zarepheth

5
มันมีประโยชน์มาก ฉันใช้ฐานข้อมูลท้องถิ่นและค้นหาเซิร์ฟเวอร์ที่เชื่อมโยงและมีการเปรียบเทียบสองแบบที่แตกต่างกัน เห็นได้ชัดว่าฉันไม่สามารถเปลี่ยนการเรียงบนเซิร์ฟเวอร์ที่เชื่อมโยงและฉันไม่ต้องการเปลี่ยนเหมืองในพื้นที่ดังนั้นนี่คือคำตอบที่ดีที่สุด
jtate

7
@ppumkin ในขณะที่มันเป็นทางออกที่ดี แต่ก็ยังคงหลีกเลี่ยงปัญหามากกว่าที่จะแก้มัน นอกจากว่าคุณต้องการเปลี่ยนการเรียงสำหรับแต่ละแบบสอบถามซึ่งน่าเบื่อและไม่ได้ทำอย่างเหมาะสม ในขณะที่มันเป็นคำตอบที่ดีคำตอบที่ยอมรับได้ฉันรู้สึกว่าเป็นคำตอบที่ดีกว่า
Rob

80

ใช้ส่วนcollateคำสั่งในแบบสอบถามของคุณ:

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

ฉันอาจไม่มีไวยากรณ์ที่ถูกต้อง (ตรวจสอบ BOL) แต่คุณสามารถทำสิ่งนี้เพื่อเปลี่ยน collation on-the-fly สำหรับแบบสอบถาม - คุณอาจต้องเพิ่มส่วนคำสั่งสำหรับการเข้าร่วมแต่ละครั้ง

แก้ไข: ฉันรู้ว่านี่ไม่ถูกต้อง - ประโยคเปรียบเทียบไปหลังจากฟิลด์ที่คุณต้องเปลี่ยน - ในตัวอย่างนี้ฉันเปลี่ยนการเรียงในtA.oldValueฟิลด์


29

ระบุเขตข้อมูลที่มีการโยนข้อผิดพลาดนี้และเพิ่มต่อไปนี้: COLLATE DATABASE_DEFAULT

มีสองตารางที่เข้าร่วมในฟิลด์รหัส:

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

อัปเดตคำถามของคุณเป็น:

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

ขอบคุณ เมื่อทำงานในฐานข้อมูลแยงเราไม่สามารถเปลี่ยนโครงสร้างฐานข้อมูลตามคำแนะนำที่ยอมรับได้เสมอ
Jennifer Wood

21

สิ่งนี้สามารถเกิดขึ้นได้อย่างง่ายดายเมื่อคุณมีฐานข้อมูลที่แตกต่างกัน 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

@Valkyrie คำตอบที่น่ากลัว คิดว่าฉันใส่เคสไว้ที่นี่เมื่อดำเนินการเหมือนกันกับแบบสอบถามย่อยข้างในกระบวนงานที่เก็บไว้เพราะฉันสงสัยว่าคำตอบของคุณใช้ได้ในกรณีนี้หรือไม่และมันก็ยอดเยี่ยม

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

12

ในเกณฑ์ที่เพิ่ม collate SQL_Latin1_General_CP1_CI_AS

มันใช้งานได้สำหรับฉัน

WHERE U.Fullname = @SearchTerm  collate SQL_Latin1_General_CP1_CI_AS

6

สาเหตุหลักคือฐานข้อมูลเซิร์ฟเวอร์ sql ที่คุณเอา schema จากนั้นมีการเปรียบเทียบที่แตกต่างจากการติดตั้งในเครื่องของคุณ หากคุณไม่ต้องการกังวลเกี่ยวกับการจัดเรียงใหม่ให้ติดตั้ง SQL Server แบบโลคัลโดยใช้การเปรียบเทียบเดียวกันกับฐานข้อมูล SQL Server 2008


มีปัญหาเดียวกันคุณต้องตรวจสอบคุณสมบัติของเซิร์ฟเวอร์และฐานข้อมูลของคุณเพื่อดูว่าพวกเขามีการเปรียบเทียบเดียวกัน
มะดัน

5

ข้อผิดพลาด (ไม่สามารถแก้ไขข้อขัดแย้งการเรียงระหว่าง .... ) มักจะเกิดขึ้นในขณะที่การเปรียบเทียบข้อมูลจากหลายฐานข้อมูล

เนื่องจากคุณไม่สามารถเปลี่ยนการเปรียบเทียบฐานข้อมูลได้ในขณะนี้ให้ใช้ COLLATE DATABASE_DEFAULT

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

นี่ไม่แตกต่างจากคำตอบที่ได้รับแล้ว: stackoverflow.com/a/1607725/479251
Pac0

4

ฉันมีอะไรแบบนี้มาก่อนและสิ่งที่เราพบคือการเปรียบเทียบระหว่าง 2 ตารางนั้นแตกต่างกัน

ตรวจสอบว่าสิ่งเหล่านี้เหมือนกัน


4

ขอบคุณคำตอบของ marc_s ฉันแก้ไขปัญหาดั้งเดิมของฉัน - ได้รับแรงบันดาลใจให้ก้าวไปอีกขั้นและโพสต์วิธีหนึ่งในการแปลงทั้งตารางในคราวเดียว - สคริปต์ tsql เพื่อสร้างคำสั่งแก้ไขคอลัมน์:

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)

ได้รับ: ALTER TABLE ALTER COLUMN myTable NVARCHAR (4000) รวบรวม Latin1_General_CI_AS ไม่เป็นโมฆะ

ฉันจะยอมรับว่าต้องงงงวยโดยจำเป็นต้องcol.max_length / 2 -


ฉันคิดว่าจำเป็นต้องหารด้วยสองเพราะความยาวจะถูกเก็บไว้เป็นจำนวนไบต์ภายใน Nvarchar ใช้เวลาสองไบต์ต่ออักขระแทนที่จะเป็น varchar
Zebi

ผลงานยอดเยี่ยมจำนวนของปริมาณการสืบค้นของ ncha ที่ได้จากแบบสอบถามทั้งหมดอาจเป็นเพราะ col.max_length / 2 -
Imran

2

สำหรับผู้ที่มีสคริปต์สร้างฐานข้อมูล (เช่นกรณีของฉัน) สำหรับฐานข้อมูลที่ทำให้เกิดปัญหานี้คุณสามารถใช้สคริปต์ CREATE ต่อไปนี้เพื่อจับคู่การเปรียบเทียบ:

-- 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

สิ่งนี้ใช้การเปรียบเทียบที่ต้องการกับตารางทั้งหมดซึ่งเป็นสิ่งที่ฉันต้องการ มันเหมาะอย่างยิ่งที่จะลองและคงการเรียงเหมือนกันสำหรับฐานข้อมูลทั้งหมดบนเซิร์ฟเวอร์ หวังว่านี่จะช่วยได้

ข้อมูลเพิ่มเติมเกี่ยวกับลิงค์ต่อไปนี้: SQL Server - การสร้างฐานข้อมูลด้วย Collation ต่าง ๆ บนเซิร์ฟเวอร์


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
SYSCOLUMNS ความยาวของคอลัมน์ nvarchar จะต้องหารด้วย 2
palota

2

ตรวจสอบระดับการเปรียบเทียบที่ไม่ตรงกัน (เซิร์ฟเวอร์, ฐานข้อมูล, ตาราง, คอลัมน์, ตัวอักษร)

ถ้าเป็นเซิร์ฟเวอร์ขั้นตอนเหล่านี้ช่วยฉันครั้งเดียว:

  1. หยุดเซิร์ฟเวอร์
  2. ค้นหาเครื่องมือ sqlservr.exe ของคุณ
  3. เรียกใช้คำสั่งนี้:

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

  4. เริ่มเซิร์ฟเวอร์ sql ของคุณ:

    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 

อ้างอิงที่นี่


โชคไม่ดีที่สิ่งนี้จะไม่เปลี่ยนการจัดเรียงสำหรับตารางที่มีอยู่ แต่จะเป็นเพียงค่าเริ่มต้นสำหรับตารางใหม่
RockScience

2

เพิ่มรหัสในคำตอบของ @ JustSteve เพื่อจัดการกับคอลัมน์ varchar และ varchar (MAX):

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

เมื่อต้องการแก้ไขปัญหานี้ในแบบสอบถามโดยไม่เปลี่ยนฐานข้อมูลใด ๆ คุณสามารถส่งนิพจน์ทางด้านอื่น ๆ ของเครื่องหมาย "=" ด้วย

COLLATE SQL_Latin1_General_CP1_CI_AS

เป็นข้อเสนอแนะที่นี่


1

ฉันมีข้อผิดพลาดที่คล้ายกัน (ไม่สามารถแก้ไขข้อขัดแย้งการเรียงระหว่าง "SQL_Latin1_General_CP1_CI_AS" และ "SQL_Latin1_General_CP1250_CI_AS" ในการดำเนินการ INTERSECT) เมื่อฉันใช้ไดรเวอร์ jdbc เก่า

ฉันแก้ไขปัญหานี้ได้ด้วยการดาวน์โหลดไดรเวอร์ใหม่จากMicrosoftหรือjTDSโครงการโอเพนซอร์ซ


1

นี่คือสิ่งที่เราทำในสถานการณ์ของเราเราต้องการแบบสอบถามเฉพาะกิจที่จะดำเนินการโดยใช้การ จำกัด วันที่ตามความต้องการและแบบสอบถามถูกกำหนดไว้ในตาราง

แบบสอบถามใหม่ของเราต้องการจับคู่ข้อมูลระหว่างฐานข้อมูลที่แตกต่างกันและรวมข้อมูลจากทั้งคู่

ดูเหมือนว่า COLLATION จะแตกต่างกันระหว่าง db ที่นำเข้าข้อมูลจากระบบ iSeries / AS400 และฐานข้อมูลการรายงานของเราซึ่งอาจเป็นเพราะประเภทข้อมูลเฉพาะ (เช่นสำเนียงกรีกในชื่อและอื่น ๆ )

ดังนั้นเราจึงใช้ข้อเข้าร่วมด้านล่าง:

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

1

คุณสามารถทำได้โดยใช้ 4 ขั้นตอนง่ายๆ

  1. สำรองฐานข้อมูลของคุณเพียงแค่ใส่หีบ
  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

คุณอาจไม่มีปัญหาการเปรียบเทียบในฐานข้อมูลของคุณ แต่ถ้าคุณกู้คืนสำเนาของฐานข้อมูลของคุณจากการสำรองข้อมูลบนเซิร์ฟเวอร์ที่มีการเปรียบเทียบที่แตกต่างจากแหล่งกำเนิดและรหัสของคุณกำลังสร้างตารางชั่วคราวตารางชั่วคราวเหล่านั้นจะสืบทอดการจัดเรียงจาก เซิร์ฟเวอร์และจะมีข้อขัดแย้งกับฐานข้อมูลของคุณ



0

ฉันมีข้อกำหนดที่คล้ายกัน; จัดทำเอกสารแนวทางของฉันที่นี่สำหรับทุกคนที่มีสถานการณ์คล้ายกัน ...

สถานการณ์

  • ฉันมีฐานข้อมูลจากการติดตั้งใหม่ทั้งหมดด้วยการเปรียบเทียบที่ถูกต้อง
  • ฉันมีฐานข้อมูลอื่นที่มีการเปรียบเทียบที่ผิด
  • ฉันต้องการอัปเดตหลังเพื่อใช้การเปรียบเทียบที่กำหนดไว้ในอดีต

สารละลาย

ใช้การเปรียบเทียบ Schema ของเซิร์ฟเวอร์ SQL (จากเครื่องมือข้อมูล SQL Server / Visual Studio) เพื่อเปรียบเทียบแหล่งที่มา (การติดตั้งใหม่ทั้งหมด) กับปลายทาง (db ที่มีการเปรียบเทียบที่ไม่ถูกต้อง)

ในกรณีของฉันฉันเปรียบเทียบฐานข้อมูลทั้งสองโดยตรง แม้ว่าคุณจะสามารถทำงานผ่านโครงการเพื่อให้คุณปรับแต่งชิ้นส่วนด้วยตนเองในระหว่าง ...

  • เรียกใช้ Visual Studio
  • สร้างโครงการ SQL Server Data ใหม่
  • คลิกเครื่องมือ, SQL Server, การเปรียบเทียบ Schema ใหม่
  • เลือกฐานข้อมูลต้นทาง
  • เลือกฐานข้อมูลเป้าหมาย
  • ตัวเลือกคลิก (⚙)
    • ภายใต้Object Typesเลือกเฉพาะประเภทที่คุณสนใจ (สำหรับฉันมันเป็นเพียงViewsและTables)
    • ภายใต้การGeneralเลือก:
      • บล็อกการสูญหายของข้อมูลที่เป็นไปได้
      • ปิดใช้งานทริกเกอร์ DDL และเปิดใช้งานอีกครั้ง
      • เพิกเฉยเส้นทางไฟล์ของผู้ให้บริการการเข้ารหัส
      • ละเว้นไฟล์ & เส้นทางของไฟล์บันทึก
      • ละเว้นขนาดไฟล์
      • ละเว้นตำแหน่งกลุ่มไฟล์
      • ละเว้นพา ธ ไฟล์ข้อความแบบเต็ม
      • ละเว้นการใส่คำหลัก
      • ละเว้น SID สำหรับเข้าสู่ระบบ
      • ละเว้นตัวระบุที่ยกมา
      • ละเว้นอายุการใช้งานของเส้นทาง
      • ดูอัฒภาคระหว่างคำสั่ง
      • ละเว้นช่องว่าง
      • โมดูลรีเฟรชสคริปต์
      • การตรวจสอบสคริปต์สำหรับข้อ จำกัด ใหม่
      • ตรวจสอบความเข้ากันได้การเปรียบเทียบ
      • ตรวจสอบการปรับใช้
  • คลิกเปรียบเทียบ
    • ยกเลิกการทำเครื่องหมายวัตถุใด ๆ ที่ถูกตั้งค่าสถานะเพื่อลบ (NB: วัตถุเหล่านั้นอาจยังมีปัญหาการเรียงหน้า แต่เนื่องจากไม่ได้กำหนดไว้ในแหล่งข้อมูล / เทมเพลต db ของเราที่เราไม่ทราบวิธีใดเราไม่ต้องการสูญเสียสิ่งต่าง ๆ ถ้าเรา การกำหนดเป้าหมายเฉพาะการเปลี่ยนแปลงการจัดเรียง) คุณสามารถยกเลิกการเลือกทั้งหมดในครั้งเดียวโดยคลิกขวาที่DELETEโฟลเดอร์และเลือกEXCLUDEโฟลเดอร์และเลือก
    • ในทำนองเดียวกันไม่รวมใด ๆ CREATEวัตถุ (ที่นี่เนื่องจากพวกเขาไม่ได้อยู่ในเป้าหมายพวกเขาไม่สามารถมีการเปรียบเทียบที่ผิดที่นั่นไม่ว่าพวกเขาควรจะมีอยู่เป็นคำถามสำหรับหัวข้ออื่น)
    • คลิกที่แต่ละวัตถุภายใต้ CHANGE เพื่อดูสคริปต์สำหรับวัตถุนั้น ใช้ส่วนต่างเพื่อให้แน่ใจว่าเรากำลังเปลี่ยนการจัดเรียงเท่านั้น (ความแตกต่างอื่น ๆ ที่ตรวจพบด้วยตนเองคุณอาจต้องการแยก / จัดการวัตถุเหล่านั้นด้วยตนเอง)
  • คลิกUpdateเพื่อผลักดันการเปลี่ยนแปลง

สิ่งนี้ยังคงเกี่ยวข้องกับความพยายามแบบแมนนวล (เช่นการตรวจสอบว่าคุณส่งผลกระทบต่อการจัดเรียงเท่านั้น) - แต่มันจะจัดการการพึ่งพาสำหรับคุณ

นอกจากนี้คุณสามารถเก็บโครงการฐานข้อมูลของสคีมาที่ถูกต้องเพื่อให้คุณสามารถใช้เท็มเพลตสากลสำหรับฐานข้อมูลของคุณได้หากคุณมีมากกว่า 1 อัปเดตสมมติว่าฐานข้อมูลเป้าหมายทั้งหมดควรจบด้วยสคีมาเดียวกัน

คุณยังสามารถใช้ค้นหา / แทนที่ไฟล์ในโครงการฐานข้อมูลหากคุณต้องการแก้ไขการตั้งค่าที่นั่น (เช่นเพื่อให้คุณสามารถสร้างโครงการจากฐานข้อมูลที่ไม่ถูกต้องโดยใช้การเปรียบเทียบ schema, แก้ไขไฟล์โครงการแล้วสลับแหล่งที่มา / เป้าหมายใน เปรียบเทียบสคีมาที่จะผลักดันการเปลี่ยนแปลงของคุณกลับไปที่ฐานข้อมูล)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.