2013-06-05 13 views
6

私はこのクエリを使用する場合:SQL Server:なぜ行が見つかりませんか?

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番目のクエリで検索すると、なぜそれが得られますか?

+2

'LIKEN'ВЕРТЕКСЗАО% ''は動作しますか?もしそうなら、データベースのデフォルトの照合は何ですか?とにかく列のデータ型は何ですか? –

+0

SQL Server 2012で正しい結果が得られました。データベースはどのデータベースで作成されていますか? –

答えて

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 'ВЕРТЕКС ЗАО'戻り??????? ???

これは暗黙のキャストを防ぎ、検索引数可能であるとして、それは

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

varchar使用の場合は、列はnvarchar使用LIKE N'ВЕРТЕКС ЗАО%'

ある場合。

+0

列varchar、 'LIKE CAST(N'ВЕРТЕКСЗАО% 'COLLATE SQL_Latin1_General_Cp1251_CI_AS AS VARCHAR(50)AS')でクエリが実行されません。結果には、 –

関連する問題