6

当我使用这个查询时:

SELECT TOP 20 
     f.name as f_firm_name 
FROM Firm f 
WHERE f.id_city = '73041' COLLATE SQL_Latin1_General_Cp1251_CI_AS 
ORDER BY f.name ASC

我得到这些结果:

f_firm_name
--------------------------------
 SKY  LINE STUDIO
 АНТИКВАРНЫЙ САЛОН
 БИЗОН УЛЬЯНОВСК
 ВЕРТЕКС ЗАО
 ВОЗРОЖДЕНИЕ+
 ВОЛГАСПЕЦТЕХНОЛОГИИ
 ГП СЕРВИС
 Данилов А.Б.ИП
 ИНИКОМ
 ИП МАЛАШИН В.Б.
 ИП СУЛАГАЕВ АНДРЕЙ

(20 row(s) affected)

但是如果我使用这个查询:

SELECT TOP 20 
     f.name as f_firm_name 
FROM Firm f 
WHERE f.id_city='73041'
  AND f.name LIKE 'ВЕРТЕКС ЗАО%' COLLATE SQL_Latin1_General_Cp1251_CI_AS 
ORDER BY f.name ASC

我得到这些结果:

f_firm_name
-----------------
(0 row(s) affected)

0 rows如果在第一个查询中我得到f.name并使用该结果在第二个查询中搜索,为什么我会得到?

4

2 回答 2

4

可能,f_firm_name- 中的第一个字符是空格。

所以试试这个 -

SELECT TOP 20 f_firm_name = f.name  
FROM dbo.Firm f 
WHERE f.id_city = '73041'
    AND LTRIM(f.name) LIKE 'ВЕРТЕКС ЗАО%' --<--
        COLLATE SQL_Latin1_General_Cp1251_CI_AS 
ORDER BY f.name
于 2013-06-05T11:02:48.047 回答
1

可能您的数据库的默认排序规则不支持字符串文字中的字符并且它们正在丢失。

在我的默认排序规则下SELECT 'ВЕРТЕКС ЗАО'返回??????? ???

如果nvarchar使用该列LIKE N'ВЕРТЕКС ЗАО%'

如果是varchar使用

LIKE CAST(N'ВЕРТЕКС ЗАО%' COLLATE SQL_Latin1_General_Cp1251_CI_AS AS VARCHAR(50))

因为这可以防止隐式转换并且是可预测的。

于 2013-06-05T11:13:53.553 回答