Comment utiliser ORDER BY, plus bas dans SQL Server 2008 avec des données non-unicode

StackOverflow https://stackoverflow.com/questions/2543074

  •  23-09-2019
  •  | 
  •  

Question

La question est sur le point d'Arménie. J'utilise SQL Server 2005, le classement SQL_Latin1_General_CP1_CI_AS, les données sont la plupart du temps en arménien et nous ne pouvons pas utiliser unicode.

Je l'ai testé sur MS SQL 2008 avec un classement de fenêtres pour la langue Armenian (Cyrillic_General_100_), je l'ai trouvé ici, ( http://msdn.microsoft.com/en-us/library/ms188046.aspx ) mais il n'a pas aidé.

J'ai une fonction, que les valeurs hexagonales de commandes et une fonction inférieure, qui prend chaque caractère dans chaque chaîne et la convertit en sa forme inférieure, mais ce n'est pas une solution acceptable, il fonctionne vraiment lent, appelant qui fonctionne sur toutes les colonnes de une table énorme.

Y at-il solution à ce problème ne pas utiliser unicode et ne fonctionne pas avec les valeurs hexagonales manuellement?

Mise à jour:

Sur le côté gauche sont des mots de cas mixtes, classés dans l'ordre et avec des représentations minuscules sur le côté droit. Espérons que cela vous aidera. Merci. Les mots sont écrits en unicode.

  1. ԱբԳդԵզ -> աբգդեզ

  2. ԱգԳսԴԼ -> ագգսդլ

  3. ԲաԴֆդԴ -> բադֆդդ

  4. ԳԳԼասա -> գգլասա

  5. ԴմմլօՏ -> դմմլօտ

  6. ԵլԲնՆն -> ելբննն

  7. ԶՎլուտ -> զվլուտ

  8. էԹփձջՐ -> էթփձջր

  9. ԸխԾդսՂ -> ըխծդսղ

  10. ԹԶէըԿր -> թզէըկր

Était-ce utile?

La solution

Une solution serait de créer une colonne calculée pour chaque colonne de texte qui convertit la valeur en collation arménienne et met à Minuscules comme ceci:

Alter Table TableName
    Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED

Une fois que vous faites cela, vous pouvez mettre des index sur ces colonnes et requête pour eux.

Si ce n'est pas votre saveur du thé, puis une autre solution serait une vue indexée où vous créez une vue avec SCHEMABINDING qui jette chacune des différentes colonnes en minuscules et à la collation à droite, puis mettre des index sur ce point de vue .

EDIT Je remarque dans vos exemples, que vous utilisez un insensible à la casse, Accent sensibles. Peut-être la solution simple à vos problèmes de commande serait d'utiliser Latin1_General_CS_AS ou Cyrillic_General_100_CS_AS si elle est disponible.

EDIT

Ouf. Après un peu de recherche, je pense avoir une réponse qui peut malheureusement pas vous voulez. Tout d'abord, oui, je peux copier le texte que vous avez fourni en code ou quelque chose comme Notepad ++ parce StackOverflow est codé en utilisant UTF-8 et arménien s'intégrera dans UTF-8. En second lieu, cette allusion à ce que vous essayez d'atteindre: le stockage UTF-8 dans SQL Server. Malheureusement, SQL Server 2008 (ou toute version antérieure) ne prend pas en charge en mode natif UTF-8. Afin de stocker des données en UTF-8, vous avez une poignée de choix:

  1. Magasin en binaire et le convertir en UTF-8 sur le client (ce qui élimine à peu près tout le tri effectué sur le serveur)
  2. Magasin en Unicode et le convertir en UTF-8 sur le client. Il convient de noter que le pilote SQL Server déjà convertir la plupart des chaînes en Unicode et votre exemple ne fonctionne bien en Unicode. L'inconvénient évident est qu'il mange deux fois l'espace.
  3. Créer un type défini par l'utilisateur CLR dans SQL Server pour stocker des valeurs UTF-8. Microsoft fournit un exemple qui est fourni avec SQL Server pour faire exactement cela. Vous pouvez télécharger les échantillons de CodePlex d'ici . Vous pouvez également trouver plus d'informations sur l'échantillon dans cet article dans la section

Autres conseils

Avez-vous une erreur comme ça?

Msg 448, Level 16, State 1, Line 1
Invalid collation 'Cyrillic_General_100_'.

Essayez:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

Ou choisir celui que vous préférez dans cette liste:

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
scroll top