SQL Server:为什么没有找到行?

时间:2013-06-05 10:53:32

标签: sql-server sql-server-2008

当我使用此查询时:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

如果varchar使用

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

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