什么时候可以将 varchar 连接到 nvarchar
when can you join a varchar to an nvarchar
我需要了解 varchar 和 nvarchar 之间的连接何时有效,何时无效。
简要背景:我们会将许多 varchar 列更改为 nvarchar 列。我们还有几十个 SSRS 报告,总共有 100 个左右的查询。我需要评估更改的风险 - 希望避免过度测试。
(我确实认识到首先不应在 varchar 列上进行联接,但那是另一天的不同问题...)
过去我曾注意到 varchar 到 nvarcher 连接的问题,使用 COLLATE DATABASE_DEFAULT 来解决问题,但我似乎无法通过两种数据类型之间的简单连接来重现此类问题。
这种不匹配何时会导致问题?
一般来说,加入 varchar 和 nvarchar 列 'just works',有以下重要警告,通常归结为“......但如果可以避免,你不应该这样做”:
1) 查询和连接中 varchar/nvarchar 不匹配会导致巨大的性能问题。因为数据库基本上必须在 JOIN 或 WHERE 子句比较的一侧执行功能以从一种类型转换为另一种类型以便比较或匹配它们,所以它可能导致 table 扫描,即使有明显合适的可用的索引。绝对建议在 WHERE 子句中比较或在 JOIN 子句中连接的任何列都具有相同的基本类型。
2) 你提到的类型不匹配错误一般发生在引用temp tables 时,当数据库中列的排序规则与SQL Server 时选择的排序规则不同已安装。这是因为 temp tables 是在 'tempdb' 中创建的,它具有服务器本身使用的默认排序规则。我采用了一项策略,即任何时候使用 temp table,每个 varchar/nvarcher 列都应使用 COLLATE DATABASE_DEFAULT 声明,以便创建它的排序规则与默认排序规则相匹配数据库的排序规则,而不是 tempdb 的默认排序规则。这消除了错误,并且如果您将索引放在临时 table 上并使用 WHERE 或 JOIN 中的列(见上文),还可以确保正确选择索引。
我需要了解 varchar 和 nvarchar 之间的连接何时有效,何时无效。
简要背景:我们会将许多 varchar 列更改为 nvarchar 列。我们还有几十个 SSRS 报告,总共有 100 个左右的查询。我需要评估更改的风险 - 希望避免过度测试。
(我确实认识到首先不应在 varchar 列上进行联接,但那是另一天的不同问题...)
过去我曾注意到 varchar 到 nvarcher 连接的问题,使用 COLLATE DATABASE_DEFAULT 来解决问题,但我似乎无法通过两种数据类型之间的简单连接来重现此类问题。
这种不匹配何时会导致问题?
一般来说,加入 varchar 和 nvarchar 列 'just works',有以下重要警告,通常归结为“......但如果可以避免,你不应该这样做”:
1) 查询和连接中 varchar/nvarchar 不匹配会导致巨大的性能问题。因为数据库基本上必须在 JOIN 或 WHERE 子句比较的一侧执行功能以从一种类型转换为另一种类型以便比较或匹配它们,所以它可能导致 table 扫描,即使有明显合适的可用的索引。绝对建议在 WHERE 子句中比较或在 JOIN 子句中连接的任何列都具有相同的基本类型。
2) 你提到的类型不匹配错误一般发生在引用temp tables 时,当数据库中列的排序规则与SQL Server 时选择的排序规则不同已安装。这是因为 temp tables 是在 'tempdb' 中创建的,它具有服务器本身使用的默认排序规则。我采用了一项策略,即任何时候使用 temp table,每个 varchar/nvarcher 列都应使用 COLLATE DATABASE_DEFAULT 声明,以便创建它的排序规则与默认排序规则相匹配数据库的排序规则,而不是 tempdb 的默认排序规则。这消除了错误,并且如果您将索引放在临时 table 上并使用 WHERE 或 JOIN 中的列(见上文),还可以确保正确选择索引。