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最初のクエリで if を取得f.nameし、その結果を使用して 2 番目のクエリを検索するのはなぜですか?

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 に答える