完全なライブラリーは、既存のSQL Server照合順序を変更します

あなたがバックアップ後に発生し、SQL Serverの矛盾の照合を復元することがあり、今回は統一照合することによって解決することができます。次のように詳細な動作は以下のとおりです。

データベースエラーメッセージ:
「順序SQL_Latin1_General_CP1_CI_AS」と「Chinese_PRC_CI_AS」の間の照合順序の競合での動作に等しい解決することができません。
:競合照合を解決するために、照合を直接次のようにクエリミスを回避することができ、一致するフィールドに応じて変化させることができる
ALTER TABLE [表]のALTER COLUMN [フィールド名]のnvarchar(256)COLLATE Chinese_PRC_CI_AS '

しかし、多くのデータベースは、「順序SQL_Latin1_General_CP1_CI_AS」フィールドとして注文があり、一つ一つを変更する場合は、数百のワークロードが想像できるのであれば、その後、数十の分野も、考えることができます。我々は現在、以下のように、などに対応するテーブル名、フィールド名、照合、フィールドの種類、ならびに対応する長さを、照会、データベースを変更するために必要な最初のクエリのフィールドを次のことができます。

SELECT 
 t.name [表]と、
 [列] AS c.name、
 [照合] AS c.collat​​ion_name、
 [型名]としてTYPE_NAME(c.system_type_id)
 [TypeLength]とc.max_length 
sys.columnsがCからの
 RIGHT JOIN SYS.TABLESトンON c.object_id = t.object_id 
c.collat​​ion_nameがNULLでない場合

 

上記のステートメントを実行する、あなたはいくつかのより多くの行を見つけることができ、変更の過度の量を手動でゆっくりと変更することは基本的に不可能である、あなたは、SQLクエリの結果を通じて統一変更する必要があります。ブログの友人は公園が一時テーブルを循環させることにより、幹部は次のように各レコードのスプライシング、特定のコードを変更するSQL文を実行し、一時テーブルに結果セットをしますお勧めします。

@table NVARCHAR(128)を宣言-環状アイテムテーブル
DECLAREの@Column NVARCHAR(128) -環状項目フィールド名
DECLAREの@type NVARCHAR(128) -対応するフィールドのタイプ、CHAR、NCHAR、VARCHAR、等NVARCHAR 
DECLARE @ typeLenght NVARCHAR(128) -対応するタイプの長さ、NCHAR、NVARCHAR値が2で除算される必要
DECLAREの@sql NVARCHAR(MAX)を-スプライシング実行するSQLステートメント

 
SET ROWCOUNT 0 

SELECT NULL MYKEY、
 c.NAME、
 t.nameをAS [表]、
 c.NAME AS [列]、
 AS [照合]、c.collat​​ion_name 
 TYPE_NAME(c.system_type_id)AS [型名]、
 AS [TypeLength] c.max_length 
INTOが#TEMP 
sys.columns C FROM 
 RIGHT SYSをJOINをTは.tables 
 c.object_id = t.object_id ON 
NOT NULL IS c.collat​​ion_name WHERE  
テストにProductテーブルを-
-そしてt.name = 'Product'に
 
。SETのROWCOUNT 1 
。SET UPDATE #TEMP 1 = MYKEY 

WHILE @@ ROWCOUNT> 0 
 BEGIN 
 のSET ROWCOUNT 0を

 各問い合わせレコードの、対応する変数に割り当てられた最初のは- 
 [@table SELECT =表]、
 @Column = [列]、
 @Type型名=、
 @typeLenght = TypeLength 
 #TEMP FROM 
 WHERE = MYKEY。1 

 --nchar、NVARCHAR 2要求値に加えて、
 CONVERT(INT、@typeLenght)IFザを> 0 AND(@ =タイプ'はnvarchar' @type = OR 'NCHAR')
 BEGIN 
 SETを@ = typeLenght CONVERT(NVARCHAR(128)、CONVERT(INT、@typeLenght)/ 2)
 END 
 
 IF @typeLenght = '-1' 
 BEGIN 
 @ = 'SET typeLenghtを最大" 
 END 

 -スプライシングSQL、グループカテゴリーを避けるために、[]、などとフィールド名をそのテーブル名を注意してください 
 SETする@ SQL =' ALTER TABLEを[ '+ @table +'] ALTER COLUMNの[]を
 + @Column + ']' + @type + '(' + @typeLenght 
 + ')COLLATE Chinese_PRC_CI_AS' 


 --try执行
 BEGIN TRYの
 EXEC(@sql)
 ENDのTRYは
 --Catch查询异常结果
 CATCHをBEGIN 
 AS [ASLを@sql SELECT ]、
 MSGのAS ERROR_MESSAGE()
 ENDキャッチ

 #TEMPをDELETE 
 WHEREにmykey = 1 

 SET ROWCOUNT 1 

 のUPDATE #TEMPの
 SETにmykey = 1つの
 ENDの

SETのROWCOUNT 0 

DROPテーブル#TEMP

SQLを実行し、更新エラーは、我々はいくつかのフィールドのほんの一握りを手動で変更する必要があり、これらの変更は、1回の調査によって、その上の1ので、関連する外部キーのほとんどが失敗したとことを見ることができますキャッチクエリ結果がリストに表示されてみてください。この時点で、SQLは自動的に大幅に作業負荷を軽減、フィールドのほとんどを変更します。

 

原作者のおかげで:  https://www.cnblogs.com/Ken-Blogs/p/6676006.html

おすすめ

転載: www.cnblogs.com/fjzhang/p/11250019.html
おすすめ