什么时候可以将varchar加入nvarchar

时间:2015-03-09 01:50:35

标签: sql-server sql-server-2014

我需要了解varchar和nvarchar之间的连接何时起作用,何时不起作用。

简要背景:我们将把许多varchar列更改为nvarchar列。我们还有数十个SSRS报告,总共有100个查询。我需要评估变更的风险 - 希望避免过度测试。

(我确实认识到,首先不应该在varchar列上进行连接,但是对于不同的日子来说这是一个不同的问题......)

我过去曾经注意到varchar到nvarcher连接的问题,使用COLLATE DATABASE_DEFAULT来解决问题,但我似乎无法通过两种数据类型之间的简单连接重新创建这些问题。

这种不匹配何时会导致问题?

1 个答案:

答案 0 :(得分:8)

一般来说,加入varchar和nvarchar列只是“有效”,以下重要注意事项通常归结为“......但如果可以避免,则不应该这样做”:

1)查询和联接中的varchar / nvarchar不匹配会导致巨大的性能问题。因为数据库必须在JOIN或WHERE子句比较的一侧基本上执行一个函数,以便从一种类型转换为另一种类型以便比较或匹配它们,所以即使有明显适当的索引,它也可能导致表扫描。绝对建议在WHERE子句中进行比较或在JOIN子句中连接的任何列具有相同的基本类型。

2)当数据库中列的排序规则与安装SQL Server时选择的排序规则不同时,通常会在引用临时表时发生类型不匹配错误。这是因为临时表是在'tempdb'中创建的,它具有服务器本身使用的默认排序规则。我采用了一个策略,任何时候使用临时表,每个varchar / nvarcher列都应该用COLLATE DATABASE_DEFAULT声明,这样它创建的排序规则匹配数据库的默认排序规则,而不是tempdb的默认排序规则。这样可以消除错误,并且如果将索引放在临时表上并使用WHERE或JOIN中的列(参见上文),也可以确保正确的索引选择。