SQL सर्वर कोलाज को कैसे बदलें


27

मैं पूरे सर्वर और एक विशेष डेटाबेस के लिए SQL Server 2008 R2 एक्सप्रेस डिफ़ॉल्ट Collation कैसे बदल सकता हूं?

वहाँ SQL सर्वर प्रबंधन स्टूडियो के दृश्य इंटरफ़ेस का उपयोग करने का एक तरीका है? सर्वर गुण विंडो में (और संबंधित डेटाबेस गुण विंडो में), यह संपत्ति संपादन के लिए उपलब्ध नहीं है।


2
यदि आप डेटाबेस के सभी कॉलमों को बदलना चाहते हैं तो इस स्क्रिप्ट को देखें । मैंने इसे स्वयं करने की कोशिश नहीं की है, लेकिन मैंने इसे एक सहकर्मी के लिए खोजा जो कि बस करना चाहता था।
जस्टिन डियरिंग

2
यदि आप किसी डेटाबेस के कोलाज को बदलना चाहते हैं, तो इस टूल को देखें: codeproject.com/KB/database/ChangeCollation.aspx यह SQL Server 2005 और 2008 के साथ काम करता है और इसने मेरे लिए उन स्क्रिप्ट्स से बेहतर काम किया है जो आपको मिल सकती हैं। वेब।
इरविन

जवाबों:


25

हाँ।

आप SQL Server 2008 R2 एक्सप्रेस आवृत्ति और अलग-अलग डेटाबेसों के डिफ़ॉल्ट टकराव को बदल सकते हैं, लेकिन यह एक जटिल कार्य है।

अफसोस की बात है, SSMS के माध्यम से इसे करने के लिए कोई दृश्य विकल्प नहीं है।

SQL सर्वर 2008 निम्न स्तरों पर सेटिंग कोलेशन का समर्थन करता है:

  • सर्वर

  • डेटाबेस

  • स्तंभ

  • अभिव्यक्ति

डिफ़ॉल्ट स्थापना सेटिंग्स विंडोज सिस्टम लोकेल द्वारा निर्धारित की जाती हैं। सर्वर-लेवल कॉलेशन को या तो सेटअप के दौरान बदला जा सकता है, या इंस्टॉलेशन से पहले विंडोज सिस्टम लोकेल को बदलकर। अधिक...

सर्वर Collation की स्थापना और परिवर्तन - SQL सर्वर 2008

  • सुनिश्चित करें कि आपके पास अपने उपयोगकर्ता डेटाबेस और उन सभी वस्तुओं को फिर से बनाने के लिए आवश्यक सभी जानकारी या स्क्रिप्ट हैं।

  • Bcp यूटिलिटी जैसे टूल का उपयोग करके अपने सभी डेटा को निर्यात करें। अधिक जानकारी के लिए, थोक डेटा आयात और निर्यात करना देखें।

  • सभी उपयोगकर्ता डेटाबेस ड्रॉप करें।

  • सेटअप आदेश के SQLCOLLATION गुण में नए कोलाज निर्दिष्ट करने वाले मास्टर डेटाबेस का पुनर्निर्माण करें

  • सभी डेटाबेस और उन में सभी ऑब्जेक्ट बनाएँ।

  • अपने सभी डेटा आयात करें।

डेटाबेस Collation की स्थापना और परिवर्तन - SQL सर्वर 2008

  • नया डेटाबेस बनाते समय कथन COLLATIONमें विकल्प सेट करें CREATE DATABASE
  • इसी तरह, मौजूदा डेटाबेस के कोलाजेशन को बदलने के COLLATIONलिए ALTER DATABASEस्टेटमेंट में विकल्प सेट करें ।

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

स्तंभ Collation को बदलना और बदलना

  • स्तंभ के कुछ परिवर्तन डेटाबेस के बदलने के बाद भी समान रहेंगे। उस स्थिति में, आपको अलग-अलग कॉलम के कोलाज को संशोधित करना होगा।

6

सुनिश्चित करें कि आप वास्तव में उपर्युक्त उत्तर में उल्लिखित उपयोगकर्ता डेटाबेस को "ड्रॉप" करना चाहते हैं। आप बस डेटाबेस को "अलग" कर सकते हैं। या वास्तव में, आप कुछ भी नहीं कर सकते हैं क्योंकि मास्टर प्रभावी रूप से उपयोगकर्ता डेटाबेस के किसी भी लिंक को हटा देता है। कई बार डेटाबेस वांछित डेटाबेस में बनाए जाते हैं, लेकिन सर्वर नहीं है। आप इस मामले में अपने सभी उपयोगकर्ता डेटाबेस को बैकअप से पुनर्प्राप्त नहीं करना चाहेंगे।


5

मैंने ऐसा कुछ किया और यह काम कर गया लेकिन आपको उन अनुक्रमणिकाओं को ध्यान में रखना होगा जो डेटा प्रकार को इंगित कर रहे हैं जैसे कि पाठ / 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}। इससे थोड़ा अधिक है, लेकिन यह मूल विचार है। यह विधि बस सिस्टम मेटा-डेटा को अपडेट करती है, जिसमें लाभ और परिणाम होते हैं, जिनमें से मुख्य हैं:

लाभ

  • काफ़ी जल्दी
  • अधिकांश प्रतिबंधों को बायपास करें जो ALTER DATABASEकाम करने से रोकते हैं
  • किसी भी स्क्रिप्ट की तुलना में कहीं अधिक सटीक होने की संभावना है कि लोग वस्तुओं को छोड़ने और फिर से बनाने के लिए वर्षों से साथ आए हैं

कमियां

  • अगर कुछ गलत हो जाता है, तो असमर्थित
  • VARCHARडेटा बदल सकता है, यदि पुराने और नए टकराव के बीच कोड पृष्ठ अलग है, और 128 - 255 (0x80 - 0xFF) के मान वाले वर्ण मौजूद हैं, और वे वर्ण समान कोड वाले समान वर्ण के साथ मौजूद नहीं हैं पृष्ठ। इसलिए डेटा हानि के लिए क्षमता मौजूद है, और यह सुनिश्चित करने के लिए आपके डेटा को पहले शोध करने की आवश्यकता है कि यह स्थिति मौजूद नहीं है। लेकिन, इसका अर्थ यह भी है कि केवल 0 - 127 के मान वाले बहुत से मामले हैं जो किसी भी खतरे में नहीं हैं, भले ही कोड पृष्ठ बदल जाए।
  • उपयोगकर्ता-परिभाषित तालिका प्रकार (UDTTs) को छोड़ दिया जाता है और मैन्युअल रूप से अपडेट करने की आवश्यकता होती है।

sqlservr.exe -qविधि क्या करती है और क्या नहीं करती है, इसके विस्तृत विवरण के लिए (विभिन्न स्तरों पर टकराव कैसे काम करते हैं, और संभावित मुद्दों के बारे में विवरण सहित), कृपया मेरी पोस्ट देखें:

सभी उपयोगकर्ता डेटाबेस में इंस्टेंस, डेटाबेस, और सभी कॉलम के परिवर्तन को बदलना: क्या गलत तरीके से गलत हो सकता है?

(सिस्टम डेटाबेस सहित: केवल उदाहरण को बदलने के लिए master, model, msdb, और tempdb) और एक या अधिक डेटाबेस (लेकिन सभी डेटाबेस), बस डेटाबेस (रों) अलग है कि आप इस आपरेशन से बाहर करना चाहते, और फिर उन्हें फिर से संलग्न एक बार टकराव अद्यतन पूरा हो गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.