JHF*_*HFB 3 sql-server sql-server-2014
我需要了解varchar和nvarchar之间的连接何时起作用以及何时不起作用.
简要背景:我们将把许多varchar列更改为nvarchar列.我们还有数十个SSRS报告,总共有100个查询.我需要评估变更的风险 - 希望避免过度测试.
(我确实认识到,首先不应该在varchar列上进行连接,但是对于不同的日子来说这是一个不同的问题...)
我曾经传闻过varchar到nvarcher连接的问题,使用COLLATE DATABASE_DEFAULT解决问题,但我似乎无法通过两种数据类型之间的简单连接重新创建这些问题.
这种不匹配何时会导致问题?
一般来说,加入varchar和nvarchar列只是"有效",以下重要注意事项通常归结为"......但如果你能避免它,就不应该这样做":
1)查询和连接中的varchar/nvarchar不匹配会导致巨大的性能问题.因为数据库必须在JOIN或WHERE子句比较的一侧基本上执行一个函数,以便从一种类型转换为另一种类型以便比较或匹配它们,所以即使有明显适当的索引,它也可能导致表扫描.绝对建议在WHERE子句中进行比较或在JOIN子句中连接的任何列具有相同的基本类型.
2)当您在数据库中的列的排序规则与安装SQL Server时选择的排序规则不同时引用临时表时,通常会出现类型不匹配错误.这是因为临时表是在'tempdb'中创建的,它具有服务器本身使用的默认排序规则.我采用了一个策略,任何时候使用临时表,每个varchar/nvarcher列都应该用COLLATE DATABASE_DEFAULT声明,这样它创建的排序规则匹配数据库的默认排序规则,而不是tempdb的默认排序规则.这样可以消除错误,并且如果将索引放在临时表上并使用WHERE或JOIN中的列(参见上文),也可以确保正确的索引选择.