SQL Server の全テーブルの全カラムの照合順序を変更する
2023-10-27 04:07:52
質問
あるデータベースをインポートして、別のデータベースと比較するために、いくつかのデータをインポートしました。
ターゲットデータベースは照合順序が
Latin1_General_CI_AS
で、ソースデータベースは
SQL_Latin1_General_CP1_CI_AS
.
私は、ソースデータベースの照合順序を全般的に
Latin1_General_CI_AS
に変更しました。しかし、中のテーブルとカラムは、古い照合順序のままです。
を使用してカラムを変更できることは知っています。
ALTER TABLE [table]
ALTER COLUMN [column] VARCHAR(100) COLLATE Latin1_General_CI_AS
しかし、私はすべてのテーブルと内部のすべてのカラムに対してこれを行う必要があります。
私はすべてのテーブルと内部のすべての列の型を読み取るストアドプロシージャを記述するために開始することを知っている前に
varchar
とテーブルと列のカーソルループでそれらを変更するストアドプロシージャを書き始める前に...
誰かもっと簡単な方法を知っていますか、それともプロシージャですべてのテーブルを実行するスクリプトでこれを行う唯一の方法ですか?
どのように解決するのですか?
私は適切な方法を見つけられなかったので、それを行うためのスクリプトを書きましたので、必要な人のためにここでそれを共有します。このスクリプトは、すべてのユーザー テーブルを実行し、カラムを収集します。もしカラムの型がchar型であれば、指定された照合順序に変換しようとします。
これが動作するためには、列はインデックスと制約がないことが必要です。
もし誰かがまだこれに対するより良い解決策を持っているなら、それを投稿してください!
DECLARE @collate nvarchar(100);
DECLARE @table nvarchar(255);
DECLARE @column_name nvarchar(255);
DECLARE @column_id int;
DECLARE @data_type nvarchar(255);
DECLARE @max_length int;
DECLARE @row_id int;
DECLARE @sql nvarchar(max);
DECLARE @sql_column nvarchar(max);
SET @collate = 'Latin1_General_CI_AS';
DECLARE local_table_cursor CURSOR FOR
SELECT [name]
FROM sysobjects
WHERE OBJECTPROPERTY(id, N'IsUserTable') = 1
OPEN local_table_cursor
FETCH NEXT FROM local_table_cursor
INTO @table
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE local_change_cursor CURSOR FOR
SELECT ROW_NUMBER() OVER (ORDER BY c.column_id) AS row_id
, c.name column_name
, t.Name data_type
, c.max_length
, c.column_id
FROM sys.columns c
JOIN sys.types t ON c.system_type_id = t.system_type_id
LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE c.object_id = OBJECT_ID(@table)
ORDER BY c.column_id
OPEN local_change_cursor
FETCH NEXT FROM local_change_cursor
INTO @row_id, @column_name, @data_type, @max_length, @column_id
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@max_length = -1) OR (@max_length > 4000) SET @max_length = 4000;
IF (@data_type LIKE '%char%')
BEGIN TRY
SET @sql = 'ALTER TABLE ' + @table + ' ALTER COLUMN ' + @column_name + ' ' + @data_type + '(' + CAST(@max_length AS nvarchar(100)) + ') COLLATE ' + @collate
PRINT @sql
EXEC sp_executesql @sql
END TRY
BEGIN CATCH
PRINT 'ERROR: Some index or constraint rely on the column' + @column_name + '. No conversion possible.'
PRINT @sql
END CATCH
FETCH NEXT FROM local_change_cursor
INTO @row_id, @column_name, @data_type, @max_length, @column_id
END
CLOSE local_change_cursor
DEALLOCATE local_change_cursor
FETCH NEXT FROM local_table_cursor
INTO @table
END
CLOSE local_table_cursor
DEALLOCATE local_table_cursor
GO
関連
-
[解決済み] SQL Server の更新コマンドでエラー - "現在のコマンドで深刻なエラーが発生しました".
-
[解決済み] SQL Server の .sql ファイルとは何ですか?
-
[解決済み] SQL ServerでCreateステートメントを使用してtempテーブルを作成する方法は?
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] データベース内の全テーブルのサイズを取得する
-
[解決済み] カラムの変更:NULLをNOT NULLに変更する
-
[解決済み] SQL Serverでレコードを削除した後、IDシードをリセットする。
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] try catch ブロックで @@trancount > 0 を確認する必要があるのはどのような場合ですか?
-
[解決済み] SQL Server 2012 エラー: オブジェクト参照がオブジェクトのインスタンスに設定されていない
-
[解決済み] 結果を分割するためのSQLの小数点以下の値
-
[解決済み] SQL Server : ログインに成功しましたが、「データベース [dbName] にアクセスできません。(ObjectExplorer) "と表示されました。
-
[解決済み] COUNTフィールドが正しくないか、構文エラーです。
-
[解決済み] 監査失敗、クレデンシャル検証 4776
-
[解決済み] SQL Serverで文字列からすべてのスペースを削除する
-
[解決済み] SQL ServerのIsNull()関数に相当するOracleは何ですか?
-
[解決済み] SQL ServerでRegExを使用する
-
[解決済み] データベースとスキーマの違い