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)
我的问题是,我可以避免为每个基于字符串的字段键入排序规则类型吗?有没有办法可以一次为整个查询指定排序规则类型?如果这是不可能的,还有其他捷径吗?
您可以使用如下列定义创建视图:
FirstName COLLATE SQL_Latin1_General_CI_AS, ...
Run Code Online (Sandbox Code Playgroud)
然后,无论何时您想使用用户表,您都可以改用此视图。
排序规则是每个字符串列/表达式(不包括 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)
| 归档时间: |
|
| 查看次数: |
4233 次 |
| 最近记录: |