6

私は以下を含む機能を持っています:

SELECT @pString = CAST(@pString AS VARCHAR(255)) COLLATE SQL_Latin1_General_Cp1251_CS_AS

これは、たとえば、フランス語のアクセントを削除するのに役立ちます。例えば:

UPPER(CAST('Éléctricité' AS VARCHAR(255)) COLLATE SQL_Latin1_General_Cp1251_CS_AS)

を与えELECTRICITEます。

しかし、使用COLLATEすると関数が非決定論的になるため、列の計算された永続値として使用できません。

Q1. 決定論的関数を使用して、このようなアクセントを削除する別の (迅速かつ簡単な) 方法はありますか?

Q2. (おまけの質問) この計算された永続列を使用する理由は、検索するためです。たとえば、ユーザーが顧客の姓を 'Gagne' または 'Gagné' または 'GAGNE' または 'GAGNÉ' として入力すると、アプリは永続化された計算列を使用してそれを検索します。これを行うより良い方法はありますか?

編集: SQL Server 2012 と SQL-Azure を使用します。

4

2 に答える 2

1

実際には決定論的であることがわかります。照合しようとしている文字に応じて動作が異なるだけです。

受け入れられる文字と受け入れられない文字の動作については、Windows 1251 エンコーディングのページを確認してください。

これは Cyrillic_General_CI_AI の照合表です。これはコードページ 1251 で、大文字と小文字は区別されず、アクセントも区別されません。これにより、この照合順序内で許容されるすべての文字のマッピングが表示されます。

検索の質問については、Keith が言ったように、検索対象の列に全文索引を付けることを検討します。

于 2013-10-03T00:22:54.667 に答える