无法解决与 Temp Table 的归类冲突错误
Cannot resolve the collation conflict error with Temp Table
我正在尝试列出数据库中丢失的一些记录,as described in my unanswered question here
我现在正尝试用应该检查的数据填充临时 table,并将其与数据库中的数据进行比较。我的查询如下:
create table #Temp
(
Component nvarchar(50),
AssetType nvarchar(50)
)
Insert Into #Temp (Component, AssetType) VALUES
('0990.LB00.000.06', '0738.D100.M00.60_03.03'),
('0738.D100.L00.55', '9211.D108.D07.01_02.02');
WITH DBD AS (
Select distinct C.Code Comp, AT.Code AssetType From astComponents C
Join astAssetTypes AT ON AT.Id = C.AssetTypeId
Where (C.Code = '0990.LB00.000.06' And AT.Code = '0738.D100.M00.60_03.03') OR (C.Code = '0738.D100.L00.55' And AT.Code = '9211.D108.D07.01_02.02')
),
Compare AS
(
Select T.* FROM #Temp T
Left Join DBD ON DBD.Comp = T.Component AND DBD.AssetType = T.AssetType
Where DBD.Comp is null
)
Select * From Compare
预期输出如下,因为数据库中不存在这个组件-资产类型组合
Component Asset Type
0990.LB00.000.06 0738.D100.M00.60_03.03
但是,我遇到了错误
Msg 468, Level 16, State 9, Line 22
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_BIN" in the equal to operation.
排序规则定义了一种比较字符串的方法。每当您在字符串类型之间进行比较(排序也需要比较)时,您需要应用相同的标准,这就是归类类型。
CREATE TABLE #StringLatin (
String VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS)
CREATE TABLE #StringBIN (
String VARCHAR(100) COLLATE Latin1_General_BIN)
SELECT
'Oops!!!'
FROM
#StringLatin AS L
INNER JOIN #StringBIN AS B ON L.String = B.String
Msg 468, Level 16, State 9, Line 5 Cannot resolve the collation
conflict between "Latin1_General_BIN" and
"SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
这里的问题是 L.String = B.String
,因为两者都是使用不同的排序规则类型创建的。
您可以通过更改 table 的创建语句中的排序规则(以便它匹配您稍后加入的任何一个)或直接在 SELECT
内的比较中解决此问题。
SELECT
'Works'
FROM
#StringLatin AS L
INNER JOIN #StringBIN AS B ON L.String = B.String COLLATE SQL_Latin1_General_CP1_CI_AS
默认排序规则可能因服务器而异,它会影响所有未指定特定排序规则的 table,这在使用不同的数据库时可能会带来麻烦。要查找默认排序规则,您可以使用:
SELECT SERVERPROPERTY('collation');
我正在尝试列出数据库中丢失的一些记录,as described in my unanswered question here
我现在正尝试用应该检查的数据填充临时 table,并将其与数据库中的数据进行比较。我的查询如下:
create table #Temp
(
Component nvarchar(50),
AssetType nvarchar(50)
)
Insert Into #Temp (Component, AssetType) VALUES
('0990.LB00.000.06', '0738.D100.M00.60_03.03'),
('0738.D100.L00.55', '9211.D108.D07.01_02.02');
WITH DBD AS (
Select distinct C.Code Comp, AT.Code AssetType From astComponents C
Join astAssetTypes AT ON AT.Id = C.AssetTypeId
Where (C.Code = '0990.LB00.000.06' And AT.Code = '0738.D100.M00.60_03.03') OR (C.Code = '0738.D100.L00.55' And AT.Code = '9211.D108.D07.01_02.02')
),
Compare AS
(
Select T.* FROM #Temp T
Left Join DBD ON DBD.Comp = T.Component AND DBD.AssetType = T.AssetType
Where DBD.Comp is null
)
Select * From Compare
预期输出如下,因为数据库中不存在这个组件-资产类型组合
Component Asset Type
0990.LB00.000.06 0738.D100.M00.60_03.03
但是,我遇到了错误
Msg 468, Level 16, State 9, Line 22
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_BIN" in the equal to operation.
排序规则定义了一种比较字符串的方法。每当您在字符串类型之间进行比较(排序也需要比较)时,您需要应用相同的标准,这就是归类类型。
CREATE TABLE #StringLatin (
String VARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS)
CREATE TABLE #StringBIN (
String VARCHAR(100) COLLATE Latin1_General_BIN)
SELECT
'Oops!!!'
FROM
#StringLatin AS L
INNER JOIN #StringBIN AS B ON L.String = B.String
Msg 468, Level 16, State 9, Line 5 Cannot resolve the collation conflict between "Latin1_General_BIN" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
这里的问题是 L.String = B.String
,因为两者都是使用不同的排序规则类型创建的。
您可以通过更改 table 的创建语句中的排序规则(以便它匹配您稍后加入的任何一个)或直接在 SELECT
内的比较中解决此问题。
SELECT
'Works'
FROM
#StringLatin AS L
INNER JOIN #StringBIN AS B ON L.String = B.String COLLATE SQL_Latin1_General_CP1_CI_AS
默认排序规则可能因服务器而异,它会影响所有未指定特定排序规则的 table,这在使用不同的数据库时可能会带来麻烦。要查找默认排序规则,您可以使用:
SELECT SERVERPROPERTY('collation');