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」的字段,如果逐個去改,幾個十幾個字段的話還可以考慮,要是幾十上百個工作量可想而知。我們可以先查詢當前資料庫的需要修改的字段,查詢對應的表名、欄位名、排序規則、字段型別、以及對應的長度等等,如下:
selectt.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...