本文转自:http://ju.outofmemory.cn/entry/191163

问题描述

在SQL Server中使用一些复杂的存储过程时,我们需要借用临时表来完成一些逻辑的处理,例如:数据的临时存储、循环处理等等。 
临时表创建后,并不是在各个数据库中存在的,而是存在于系统数据库tempdb中。 
如今在一个包含临时表的存储过程中,我们遇到了SQL Collation冲突的错误:

错误信息:

Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

检查我们的应用数据库和tempdb的Collation,发现这两个数据库的Collation是不一致的。

应用数据库的Collation是:SQL_Latin1_General_CP1_CI_AS

tempdb的Collation是:Chinese_PRC_CI_AS

解决方法

通过GUI方式修改

tempdb作为系统的数据库,它的Collation是不可以被更改的,我们可以更改应用数据库的Collation来解决这个问题。

在数据库的Properties → Options有更改数据库的Collation选项,但修改时会出现错误:

通过SQL脚本修改

SQL脚本也可以修改数据库的Collation,但是要在SINGLE_USER WITH ROLLABACK IMMEDIATE模式下修改,修改完成后再还原为MULTI_USER模式

ALTER DATABASE SampleDb SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GOALTER DATABASE SampleDb COLLATE Chinese_PRC_CI_AS GO ALTER DATABASE SampleDb SET MULTI_USER GO 

执行SQL后,数据库的Collation变更为Chinese_PRC_CI_AS

 ]

验证Collation是否修改成功

要验证Collation是否修改成功,只需要再次执行存储过程,执行后仍然会出现Collation冲突错误:

Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

检查数据库中已创建的表字段的Collation属性,仍然是SQL_Latin1_General_CP1_CI_AS。

尝试在数据库中创建一个新的Table

CREATE TABLE Collation_Test( [ID] INT IDENTITY PRIMARY KEY , [Name] NVARCHAR(30) ) GO

查看Collation_Test表字段Name的Collation属性,则是Chinese_PRC_CI_AS

结论:这说明以上修改数据库Collation的SQL脚本,确实成功修改了数据库的Collation属性,新创建的表的字段的Collation属性会继承数据库的Collation属性,但它不会影响已创建的表的字段的Collation属性。 
简单地说,修改数据库的Collation,对于已存在的表没有影响,对于新创建的表有影响。

修改表字段的Collation属性

在表字段的属性中可以修改Collation属性,但这种方式每次只能更改一个,我们已经创建了很多的表,使用这种方式不太现实。

那么如何批量地修改表字段的Collation属性呢?

执行下面一段SQL可以解决这个问题:

 Hide Code |  Copy Code
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); --期望的Collation SET @collate = 'Chinese_PRC_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 ) 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(

[转]SQL Collation冲突解决 临时表相关推荐

  1. 解决sql关键字冲突处理方法

    解决sql关键字冲突处理方法 在我们使用sql语句查询时如果表中的字段与sql关键字一致这时候都是会报错的,那么我们有2种方法可以进行处理,如下图中的NAME,NUMERIC与sql关键字冲突了 1: ...

  2. mysql 主从,主主,主主复制时的主键冲突解决

    原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...

  3. 使用RESIZE方法解决临时表空间(TEMP)过大问题

    使用RESIZE方法解决临时表空间(TEMP)过大问题 SQL> select * from v$version where rownum<2; BANNER -------------- ...

  4. Spark依赖包冲突解决

    背景: 公司选用Apache Beam 用于大数据程序开发; Apache Beam 提供了一系列通用的JAVA API, 通用是指使用Apache Beam开发的程序, 可以在不对代码做任何修改的情 ...

  5. Android Studio中架包打包和依赖冲突解决

    一.为什么使用aar打包,而不是jar 随着Android Studio的使用越来越广泛,使用aar打包这种方式也越来越可行实际. jar打包只打源代码,像资源文件不会打包,而aar恰恰是jar打包的 ...

  6. Android滑动冲突解决方法

    Android滑动冲突解决方法 滑动冲突 首先讲解一下什么是滑动冲突.当你需要在一个ScrollView中嵌套使用ListView或者RecyclerView的时候你会发现只有ScrollView能够 ...

  7. Android Studio androidx 包冲突解决方法

    Android Studio androidx 包冲突解决方法 参考文章: (1)Android Studio androidx 包冲突解决方法 (2)https://www.cnblogs.com/ ...

  8. SQL查询四舍五入 解决方法

    SQL查询四舍五入 解决方法 参考文章: (1)SQL查询四舍五入 解决方法 (2)https://www.cnblogs.com/jpfss/p/7111550.html 备忘一下.

  9. Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道

    Atitit.软件GUI按钮与仪表盘--db数据库区--导入mysql sql错误的解决之道 Keyword::截取文本文件后部分 查看提示max_allowed_packet限制 Target Se ...

  10. Java 8中HashMap冲突解决

    Java 8中HashMap冲突解决 目录(?)[+] 在Java 8 之前,HashMap和其他基于map的类都是通过链地址法解决冲突,它们使用单向链表来存储相同索引值的元素.在最坏的情况下,这种方 ...

最新文章

  1. 组合恒等式2 五个基本的组合恒等式 更复杂的技巧与例题
  2. nohub 将程序永久运行下去
  3. leetcode 977. 有序数组的平方(双指针)
  4. NameNode 启动失败 - There appears to be a gap in the edit log. We expected txid xxx, but got tx
  5. time_t转换为DateTime
  6. 【PAT乙】1085 PAT单位排行 (25分) map排序
  7. Android开发技术周报 Issue#102
  8. python web开发实战pdf 百度网盘_python web开发实战 pdf
  9. matlab倒立摆不同初始条件,倒立摆MATLAB建模
  10. 【Python密度泛函理论】
  11. 【分享】测试小白如何测试手机整机系统测试
  12. java泛型的上界和下界_java泛型中的上界(extend)和下界(super)
  13. 一门课程学习转录组调控分析和R可视化第十四期 (线上线下开课)
  14. 汽车覆盖件冲压模具铸造工艺研究
  15. 离散数学真值表(c语言编程实现),C语言 实现离散数学合式公式真值表
  16. ettercap+urlsnarf+driftnet+wireshark监听妹子上网
  17. MS17_010(永恒之蓝)漏洞复现。
  18. P2P平台投宝金融跑路?为什么我没有中雷!
  19. 考研阅卷【现场实拍】!你的分数是这样得出的!
  20. 计算机视觉发展和应用浅谈

热门文章

  1. Google API 设计指南-兼容性
  2. 类似QQ下拉出现搜索
  3. 屏幕适配 percent_库的扩展
  4. 【哈佛商评】好编辑成就内容营销
  5. flex学习笔记 富文本编辑(一)-RichEditableText
  6. Android APK 签名问题
  7. 分割 反比 权重图 梯度 灰度_numpy gradient梯度函数1
  8. DM9000驱动分析之初始化
  9. html自动get提交,html跳转,获取get提交参数
  10. python 图片对比文件夹_Python挑选文件夹里宽大于300图片的方法