วิธีการเปลี่ยนการเปรียบเทียบของ SQL Server


27

ฉันจะเปลี่ยนการเปรียบเทียบค่าเริ่มต้นของ SQL Server 2008 R2 Express สำหรับเซิร์ฟเวอร์ทั้งหมดและฐานข้อมูลเฉพาะได้อย่างไร

มีวิธีการใช้อินเทอร์เฟซภาพของ SQL Server Management Studio หรือไม่? ในหน้าต่างคุณสมบัติเซิร์ฟเวอร์ (และในหน้าต่างคุณสมบัติฐานข้อมูลที่สอดคล้องกัน) คุณสมบัตินี้ไม่สามารถแก้ไขได้


2
หากคุณต้องการเปลี่ยนการเรียงของคอลัมน์ทั้งหมดในฐานข้อมูลดูที่สคริปต์นี้ ฉันไม่ได้ลองด้วยตัวเอง แต่หาเพื่อนร่วมงานที่ต้องการทำอย่างนั้น
Justin Dearing

2
หากคุณต้องการเปลี่ยนการจัดเรียงของฐานข้อมูลลองใช้เครื่องมือนี้: codeproject.com/KB/database/ChangeCollation.aspxมันทำงานกับ SQL Server 2005 และ 2008 และทำงานได้ดีกว่าสคริปต์ที่คุณอาจพบใน เว็บ.
เออร์วิน

คำตอบ:


25

ใช่.

คุณสามารถเปลี่ยนการจัดเรียงเริ่มต้นของอินสแตนซ์ด่วนของ SQL Server 2008 R2 และฐานข้อมูลแต่ละรายการ แต่เป็นงานที่ซับซ้อน

น่าเศร้าที่ไม่มีตัวเลือกภาพให้ทำผ่าน SSMS

SQL Server 2008 รองรับการตั้งค่าการเรียงในระดับต่อไปนี้:

  • เซิร์ฟเวอร์

  • ฐานข้อมูล

  • คอลัมน์

  • การแสดงออก

การตั้งค่าเริ่มต้นจะถูกกำหนดโดยระบบภาษา Windows การเปรียบเทียบระดับเซิร์ฟเวอร์สามารถเปลี่ยนแปลงได้ระหว่างการติดตั้งหรือโดยการเปลี่ยนโลแคลระบบ Windows ก่อนการติดตั้ง มากกว่า...

การตั้งค่าและการเปลี่ยนการจัดเรียงเซิร์ฟเวอร์ - SQL Server 2008

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

  • ส่งออกข้อมูลทั้งหมดของคุณโดยใช้เครื่องมือเช่น bcp Utility สำหรับข้อมูลเพิ่มเติมดูการนำเข้าและส่งออกข้อมูลจำนวนมาก

  • ปล่อยฐานข้อมูลผู้ใช้ทั้งหมด

  • สร้างฐานข้อมูลหลักที่ระบุการเปรียบเทียบใหม่ในคุณสมบัติ SQLCOLLATION ของคำสั่งการตั้งค่า

  • สร้างฐานข้อมูลทั้งหมดและวัตถุทั้งหมดในพวกเขา

  • นำเข้าข้อมูลทั้งหมดของคุณ

การตั้งค่าและการเปลี่ยนการจัดเรียงฐานข้อมูล - SQL Server 2008

  • ตั้งค่าCOLLATIONตัวเลือกในCREATE DATABASEคำสั่งในขณะที่สร้างฐานข้อมูลใหม่
  • ในทำนองเดียวกันตั้งค่าCOLLATIONตัวเลือกในALTER DATABASEคำสั่งเพื่อเปลี่ยนการเรียงของฐานข้อมูลที่มีอยู่

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

การตั้งค่าและการเปลี่ยนการเรียงคอลัมน์

  • การเรียงคอลัมน์บางคอลัมน์จะยังคงเหมือนเดิมแม้หลังจากที่คุณแก้ไขการเปรียบเทียบฐานข้อมูล ในกรณีนี้คุณต้องแก้ไขการเรียงของคอลัมน์แต่ละคอลัมน์

6

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


5

ฉันทำอะไรแบบนี้และมันใช้งานได้ แต่คุณต้องจำดัชนีที่ชี้ไปที่ชนิดข้อมูลเป็น text / varchar / nvarchar ต้องถูกดร็อปรันสคริปต์แล้วสร้างดัชนี

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

นี่เป็นคำตอบแรกของฉันที่โพสต์ให้อภัยฉัน


-1

การส่งออกข้อมูลทั้งหมด (รวมทั้งการเข้าสู่ระบบเซิร์ฟเวอร์ที่เชื่อมโยงงานของ บริษัท ตัวแทน SQL, การตั้งค่า DB จดหมาย ฯลฯ ) และการสร้างข้อมูลเช่นระดับบวกโหลดข้อมูลทั้งหมดของผู้ใช้เป็นจำนวนมากของการทำงาน และแม้หลังจากที่ทั้งหมดที่ยังคงมีการรับประกันว่าคุณสามารถปรับปรุงเปรียบเทียบค่าเริ่มต้นของฐานข้อมูลผ่านทางไม่มีALTER DATABASEเพราะมีเงื่อนไขหลายประการที่จะป้องกันไม่ให้การดำเนินการเสร็จสมบูรณ์ (โปรดดู"การเปลี่ยนฐานข้อมูลเปรียบเทียบ" ของALTER DATABASEเอกสารสำหรับรายละเอียด) .

มี แต่เป็นวิธีการที่ไม่มีเอกสารที่เป็นมากได้ง่ายขึ้น ข้อเสียเปรียบหลักคือว่ามันไม่ได้รับการสนับสนุน นี่ไม่ได้เป็นการบอกว่าสิ่งใดจะผิดปกติเพียง แต่ถ้ามีอะไรเกิดขึ้น Microsoft จะไม่ช่วยแก้ไข (เพราะไม่รับประกันว่าจะใช้งานได้)

วิธีที่ฉันพูดถึงทำงานsqlservr.exeด้วย-q {new_collation_name}สวิตช์ มีมากกว่านั้นอีกเล็กน้อย แต่นั่นเป็นแนวคิดพื้นฐาน เมธอดนี้เพียงอัปเดต meta-data ของระบบซึ่งมีประโยชน์และผลที่ตามมาซึ่งเป็นวิธีหลัก:

ประโยชน์ที่ได้รับ

  • ค่อนข้างเร็ว
  • หลีกเลี่ยงข้อ จำกัด ส่วนใหญ่ที่ป้องกันไม่ให้ALTER DATABASEทำงาน
  • น่าจะมีความแม่นยำมากกว่าสคริปต์ที่ผู้คนใช้ในช่วงหลายปีที่ผ่านมาเพื่อวางและสร้างวัตถุใหม่

ข้อเสีย

  • ไม่สนับสนุนหากมีสิ่งผิดปกติ
  • VARCHARข้อมูลสามารถเปลี่ยนแปลงได้หากหน้ารหัสแตกต่างกันระหว่างการเปรียบเทียบเก่าและใหม่และตัวอักษรที่มีค่า 128 - 255 (0x80 - 0xFF) มีอยู่และตัวอักษรเหล่านั้นไม่มีอยู่เหมือนตัวอักษรที่มีค่าเดียวกันกับรหัสใหม่ หน้า. ดังนั้นจึงมีโอกาสเกิดการสูญหายของข้อมูลและข้อมูลของคุณจะต้องมีการวิจัยก่อนเพื่อให้แน่ใจว่าไม่มีเงื่อนไขนี้ แต่นี่ก็หมายความว่ามีหลายกรณีที่มีเพียงอักขระที่มีค่า 0 - 127 ซึ่งไม่อันตรายใด ๆ แม้ว่าหน้ารหัสจะเปลี่ยนไปก็ตาม
  • ประเภทตารางที่ผู้ใช้กำหนดเอง (UDTT) ถูกข้ามไปและจำเป็นต้องอัพเดตด้วยตนเอง

สำหรับคำอธิบายโดยละเอียดเกี่ยวกับsqlservr.exe -qวิธีการที่ทำและไม่ได้ทำ (รวมถึงรายละเอียดเกี่ยวกับวิธีการเปรียบเทียบการทำงานในระดับต่างๆและปัญหาที่ควรระวัง) โปรดดูโพสต์ของฉัน:

การเปลี่ยนการเรียงอินสแตนซ์ฐานข้อมูลและคอลัมน์ทั้งหมดในฐานข้อมูลผู้ใช้ทั้งหมด: สิ่งที่อาจผิดพลาดได้

ในการเปลี่ยนเพียงอินสแตนซ์ (รวมฐานข้อมูลของระบบ: master, model, msdbและtempdb) และหนึ่งหรือฐานข้อมูล ( แต่ไม่ทุกฐานข้อมูล) เพียงแค่ถอดฐานข้อมูล (s) ที่คุณต้องการที่จะแยกออกจากการดำเนินการนี้แล้วกลับแนบ เมื่อการปรับปรุงการเปรียบเทียบเสร็จสมบูรณ์

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