全庫修改SQL Server現有排序規則

2022-01-20 12:54:41 字數 2910 閱讀 8888

sql server備份還原後可能遇到排序規則不一致的問題,此時通過統一排序規則可以解決。詳細操作如下:

資料庫報錯資訊:

無法解決 equal to 運算中 "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 [table],

c.name as [column],

c.collation_name as [collation],

type_name( c.system_type_id) as [typename],

c.max_length as [typelength]

from sys.columns c

right join sys.tables t on c.object_id = t.object_id

where c.collation_name is not null

執行上述語句,可能發現行數比較多,過多的修改量基本上是不可能手動去慢慢修改的,需要通過sql查詢結果統一修改。網友推薦將結果集插入到臨時表中,在通過迴圈臨時表,exec執行拼接sql語句去修改每乙個記錄,具體**如下:

declare @table nvarchar(128)--迴圈item表名

declare @column nvarchar(128)--迴圈item欄位名

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 [table],

c.name as [column],

c.collation_name as [collation],

type_name(c.system_type_id) as [typename],

c.max_length as [typelength]

into #temp

from sys.columns c

right join sys.tables t

on c.object_id = t.object_id

where c.collation_name is not null

--先測試product表

--and t.name='product'

set rowcount 1

update #temp set mykey = 1

while @@rowcount > 0

begin

set rowcount 0

--每次查詢第一條記錄並賦值到對應變數中

select @table = [table],

@column = [column],

@type = typename,

@typelenght = typelength

from #temp

where mykey = 1

--nchar、nvarchar需要將數值除於2

if convert(int, @typelenght) > 0 and ( @type = 'nvarchar' or @type = 'nchar' )

begin

set @typelenght=convert(nvarchar(128), convert(int, @typelenght) / 2)

endif @typelenght = '-1'

begin

set @typelenght='max'

end

--拼接sql,注意表名、欄位名要帶,避免group等關鍵字

set @sql=' alter table [' + @table + '] alter column ['

+ @column + '] ' + @type + '(' + @typelenght

+ ') collate chinese_prc_ci_as'

--try執行

begin try

exec(@sql)

end try

--catch查詢異常結果

begin catch

select @sql as [asl],

error_message() as msg

end catch

delete #temp

where mykey = 1

set rowcount 1

update #temp

set mykey = 1

endset rowcount 0

drop table #temp

執行sql,更新出錯的try catch查詢結果顯示在列表中,我們可看到只有寥寥的幾個字段需要通過手動去修改,這些修改不成功的大部分是由於外來鍵關聯等原因,逐個排查即可。 至此,sql已自動修改了大部分字段,大大的減少了工作量。

SQLServer還原全庫備份

查詢源庫匯出的全庫備份對應的資料檔案和日誌檔案的logicalname restore filelistonly from disk opt mssql full.bak 查詢新建的資料庫對應的資料檔案和日誌檔案 select a.name 邏輯檔名 case when charindex log ...

sqlserver 全庫查詢 帶架構

網上現有的全庫查詢,無法識別自定義架構的資料庫結構 declare str nvarchar 10 declare tablename varchar 50 declare colname varchar 50 declare counts intdeclare sql nvarchar 2000 ...

BCG現有VC工程修改

在 中做以下更改 loadstdprofilesettings setregistrybase t settings 多文件把mainframe.h mainframe.cpp中cmdiframewnd修改為cbcgpmdiframewnd。多文件把cframewnd修改為cbcgpframewnd...