SQL Server 避免在查询中多次重复排序规则类型

Lau*_*ost 8 sql-server collation insert import bulk-insert

我有一个查询,它从源数据库 (DatabaseA) 中选择行,并将它们插入到目标数据库 (Database B) 中。数据库之间的排序规则类型不同,无法更改。我需要通过显式指定 varchar 字段的排序规则来解决查询中的排序规则差异。

目前我的查询是这样的:

INSERT INTO DatabaseB.dbo.Users(
    Id,
    UserNumber,
    FirstName,
    Surname,
    Address1,
    Address2,
    AddressTown,
    AddressCity
)
SELECT 
    Id,
    UserNumber,
    FirstName COLLATE SQL_Latin1_General_CI_AS,
    Surname COLLATE SQL_Latin1_General_CI_AS,
    Address1 COLLATE SQL_Latin1_General_CI_AS,
    Address2 COLLATE SQL_Latin1_General_CI_AS,
    AddressTown COLLATE SQL_Latin1_General_CI_AS,
    AddressCity COLLATE SQL_Latin1_General_CI_AS
FROM DatabaseA.dbo.Users
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以避免为每个基于字符串的字段键入排序规则类型吗?有没有办法可以一次为整个查询指定排序规则类型?如果这是不可能的,还有其他捷径吗?

sep*_*pic 9

您可以使用如下列定义创建视图:

FirstName COLLATE SQL_Latin1_General_CI_AS, ...
Run Code Online (Sandbox Code Playgroud)

然后,无论何时您想使用用户表,您都可以改用此视图。


Sol*_*zky 5

排序规则是每个字符串列/表达式(不包括 XML 数据类型)。所以从这个意义上说,不,不能为每个表或查询设置排序规则。

我需要通过显式指定 varchar 字段的排序规则来解决查询中的排序规则差异。

嗯,为什么?你不应该需要处理这个INSERT声明。比较两列或在UNION. 正如你可以通过下面的测试中看到(只要运行它的数据库,是不是tempdb),有两个表,每一个不同的数据库,每一个都具有不同的排序规则-一个是SQL Server排序规则和一个是Windows排序规则甚至——而且没有错误。如果您遇到错误,请在问题中提供更多详细信息。

--DROP TABLE #tmp;
CREATE TABLE #tmp (Col1 VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CI_AS);
INSERT INTO #tmp ([Col1]) VALUES ('n');

-- DROP TABLE dbo.Tmp;
CREATE TABLE dbo.Tmp (Col1 VARCHAR(50) COLLATE Hebrew_100_CS_AI);

INSERT INTO dbo.Tmp ([Col1])
  SELECT t.[Col1]
  FROM #tmp t;
Run Code Online (Sandbox Code Playgroud)