跨库关联数据表时使用COLLATE会永久修改排序规则吗?
关于COLLATE DATABASE_DEFAULT的生效范围解答
嗨,我来帮你把这个问题理清楚!
首先可以明确告诉你:使用COLLATE DATABASE_DEFAULT仅在查询执行期间临时生效,绝对不会修改两张表的实际排序规则。
具体解释:
当你在跨库关联的查询里加上这个子句,本质上是告诉SQL Server:在执行当前这个查询的过程中,临时将指定列的排序规则切换到当前执行查询所在数据库的默认排序规则,以此来消除两个列之间的排序规则冲突,让关联操作可以正常完成。
举个你场景下的示例查询:
SELECT ps.*, ci.* FROM SalesDB.dbo.ProductSales ps JOIN CustomerDB.dbo.CustomerInfo ci ON ps.CustomerID COLLATE DATABASE_DEFAULT = ci.CustomerID COLLATE DATABASE_DEFAULT
在这个查询里,COLLATE DATABASE_DEFAULT只是在执行JOIN的比较逻辑时临时生效,查询结束后,SalesDB.dbo.ProductSales和CustomerDB.dbo.CustomerInfo里的CustomerID列,它们的原始排序规则(比如你提到的Latin1_General_CI_AS)不会有任何变化,完全不会被持久化修改。
如果你真的想永久修改列的排序规则
那你需要使用ALTER TABLE语句来修改表结构,比如:
-- 修改SalesDB中ProductSales表的CustomerID列排序规则 ALTER TABLE SalesDB.dbo.ProductSales ALTER COLUMN CustomerID uniqueidentifier COLLATE YourTargetCollation NOT NULL;
不过这会改变表的持久化结构,影响后续所有针对该列的操作,和临时解决查询冲突的COLLATE DATABASE_DEFAULT完全是两回事。
所以放心用COLLATE DATABASE_DEFAULT来解决你当前的跨库关联冲突就好,不用担心会改动表的原始设置~
内容的提问来源于stack exchange,提问作者Ken Latwork
相关产品推荐
相关产品推荐

