¿Cómo ordenar carpetas de Windows por nombre en SQL Server? ¿Qué es el algoritmo y cómo ordenarlo?
"No se puede resolver el conflicto de intercalación de la operación igual".
Análisis de errores:
p>
Este error se debe a una inconsistencia causada por las reglas de clasificación. Hagamos una prueba, por ejemplo:
Crear tabla #t1(
nombre varchar(20) collate Albanian_CI_AI_WS,
valor int) p>
Crear tabla #t2 (
nombre varchar(20) organiza chino,
valor int)
Después de construir la tabla, ejecute la consulta de conexión:
seleccione * de # t 1 A . nombre = B . combinación interna en nombre #t2 B
De esta manera, se produce el error:
Servidor: Mensaje 446, nivel 16, estado 9, línea 1.
No se puede resolver el conflicto de intercalación para la operación igual.
La forma más sencilla de deshacerse de este error es especificar la intercalación al unir las tablas para que el error no vuelva a ocurrir. El contenido de la declaración es el siguiente:
Seleccione *
De #t1 A unión interna #t2 B
Organizar chino
II. Introducción a la clasificación:
¿Qué son las reglas de clasificación? MS lo describe de esta manera: "En Microsoft SQL Server 2000, el almacenamiento físico de cadenas está controlado por reglas de intercalación. Las reglas de intercalación especifican los patrones de bits que representan cada carácter y las reglas para almacenar y comparar caracteres.
Ejecute la siguiente declaración en el Analizador de consultas para obtener todas las intercalaciones admitidas por SQL SERVER
select * from::fn_helpcollations()
Los nombres de las intercalaciones constan de dos partes. el conjunto de caracteres admitido por la clasificación
Por ejemplo:
Chinese_PRC_CS_AI_WS
La primera mitad: se refiere al conjunto de caracteres UNICODE, puntero Chinese_PRC_ La regla de clasificación. apunta al carácter chino simplificado UNICODE
La segunda mitad de la regla de clasificación significa el sufijo:
_Clasificación binaria
_CI (CS). distingue entre mayúsculas y minúsculas, CI no distingue entre mayúsculas y minúsculas, CS distingue entre mayúsculas y minúsculas, AI no distingue entre mayúsculas y minúsculas y también _KI (tipo Kana), KI no distingue, KS distingue
. Ya sea que _WI(WS) distinga el ancho, WI no distinga, WS distinga entre mayúsculas y minúsculas: si desea comparar letras mayúsculas y minúsculas se tratan como desiguales, seleccione esta opción. desea que la comparación trate los caracteres acentuados y sin acentos como desiguales. Si se selecciona esta opción, la comparación también tratará los caracteres acentuados como desiguales. Las diferentes letras se tratan como desiguales.
Distinguir kana: seleccione esta opción. desea que la comparación trate las sílabas japonesas de Katakana e Hiragana como desiguales
Distinguir ancho: seleccione esta opción si desea que la comparación trate los caracteres de ancho medio y de ancho completo como desiguales
.Tres aplicaciones de clasificación:
SQLSERVER proporciona una serie de reglas de clasificación específicas de WINDOWS y SQL SERVER, pero los desarrolladores a menudo ignoran su aplicación.
Ejemplo 1: Ordenar el contenido de la columna de nombre de la tabla por pinyin
Crear tabla #t(id int, name varchar(20))
Insertar #t seleccione 1, '中'
Unión todo seleccione 2, "País"
Unión todo seleccione 3, '人'
Unión todo seleccione 4, ' A '
seleccionar * de # t ordenar por nombre intercalar Chinese_PRC_CS_AS_KS_WS
Eliminar tabla #t
/*Resultado:
id nombre
- -
4 a
2 países
Tres personas
en 1
p>
*/
Ejemplo 2: Ordenar el contenido de la columna de nombre de la tabla por los trazos del apellido:
Crear tabla #t(id int, name varchar(20) )
Inserte #t para seleccionar 1, 'tres'
Unión selecciona los 2, ' b '
Unión selecciona los 3, 'dos'
La unión selecciona los 4, 'uno'
La unión selecciona los 5, 'diez'
selecciona * de # t ordena por nombre collate中文_PRC_Stroke_CS_AS_KS_WS
Eliminar tabla #t
/*Resultado:
nombre de identificación
- -
4Fácil
2 b
3 dos
50 diez puntos
1 San
*/ p>
Cuatro. Ampliación de la aplicación de la intercalación en la práctica
Las reglas de clasificación de caracteres chinos en SQL SERVER se pueden ordenar por pinyin y trazos. Entonces, ¿cómo utilizar esta función para solucionar algunos problemas difíciles de los caracteres chinos? Permítame darle un ejemplo:
Uso de las funciones de reglas de clasificación para calcular los trazos de los caracteres chinos
Para calcular los trazos de los caracteres chinos, primero debe hacer los preparativos. Sabemos que los caracteres chinos multinacionales de WINDOWS y UNICODE contienen actualmente un total de 20.902 caracteres chinos
. El valor UNICODE de los caracteres chinos del código GBK simplificado comienza en 19968.
Primero, utilizamos el método SQLSERVER para obtener todos los caracteres chinos. Si no hay un diccionario, simplemente podemos usar la instrucción SQL para obtener:
seleccione el código superior 20902 = identidad(int, 19968, 1) en #t de las columnas del sistema a, columnas del sistema b
Usando la siguiente declaración, obtenemos todos los caracteres chinos ordenados por valor UNICODE:
Seleccione el código de #t, nchar(código) como CNWord
Luego, usamos las declaraciones SELECT que son ordenados por trazos.
Seleccione código, nchar (código) como CNWord
Revise Chinese_PRC_Stroke_CS_AS_KS_WS desde #t
Ordene por nchar (código), código
Resultado:
Código CNWord
- -
19968 I
2008
20022 sa
p>20031
20032 oye
20033
20057 b
20058ya
20059
p>20101
19969 D
..........
Podemos ver claramente en los resultados anteriores, los códigos para un trazo de caracteres chinos son del 19968 al 20101, de pequeño a grande, pero cuando el primer carácter de dos trazos de caracteres chinos es "ding" y el código es 19969, el orden comienza de nuevo. Con este resultado, podemos usar fácilmente sentencias SQL para obtener el primer o último carácter chino de cada clasificación de caracteres chinos.
Utilice la siguiente oración para obtener el último carácter chino:
Crear tabla #t1(id int identidad, código int, cnword nvarchar(2))
Insertar # t1 (código, cnword)
Seleccionar código de #t, nchar (código) como CNWord
Ordenar por nchar (código) Revisar Chinese_PRC_Stroke_CS_AS_KS_WS, código
Seleccione una palabra
de #t1 A
donde A.id=B.id-1 y A.code ltb.code
donde B. code está vacío
Ordenar por número
Se obtienen 36 caracteres chinos. Cada carácter chino se ordena de acuerdo con la regla de clasificación Chinese_PRC_Stroke_CS_AS_KS_WS de cada número de trazo.
El último carácter chino:
龙, 祁guiya, 小生, Jiao, dragón, estanque, estanque, estanque, estanque, estanque, estanque, estanque, estanque.
Como se puede ver en lo anterior, "Mo" es el último carácter después de ordenar todos los caracteres chinos, "Li" es el último carácter después de ordenar los dos caracteres chinos... y así en.
Pero al mismo tiempo, también descubrí que los trazos después del carácter chino número 33 "Zhu (33 trazos)" son un poco desordenados e incorrectos. Pero no importa. Sólo hay cuatro caracteres chinos más que los trazos "Zhu". Agregamos manualmente: 35 trazos, 36 trazos, 39 trazos y 64 trazos.
Crear tabla de trazos de caracteres chinos (TAB _ HZBH);
Crear tabla tab_hzbh(id int identidad, cnword nchar(1))
-Primero inserte el primeros 33 caracteres chinos
Insertar pestaña caracter_hzbh
Seleccione las primeras 33 palabras
De #t1 A
En A.id= B .id-1 y A.code ltb.code
Donde B.code está vacío
Ordenar por número
: agregue los últimos cuatro caracteres chinos.
establezca identidad_insert tab_hzbh en
Ir
insertar tab_hzbh(id, cnword)
Seleccione 35, N '
Unión todos seleccione 36, N'
Unión todos seleccione 39, Norte ˠ'
Unión todos seleccione 64, N'
Ir
Desactiva Identity_insert tab_hzbh
Ir
Hasta ahora, podemos obtener este resultado, por ejemplo, queremos obtener los trazos del carácter chino "国": p>
Declaración @a nchar(1)
Establecer @a=' país '
Seleccione la 1 identificación principal
De tab_hzbh
donde cnword gt=@a intercalar Chinese_PRC_Stroke_CS_AS_KS_WS
Ordenar por id
Identificación (identificación)
-
Ocho< /p >
(Resultado: el número de trazos en el carácter chino "国" es 8)
Todo el proceso de preparación anterior consiste en escribir la siguiente función, dejar a un lado todas las tablas temporales y arreglarlas. tablas creadas anteriormente. Para facilitar la versatilidad y la transferencia de código, escriba el contenido de la tabla tab_hzbh en la declaración y luego calcule el número total de trazos de una cadena de caracteres chinos ingresados por el usuario:
Crear la función fun_getbh(@str nvarchar(4000))
Devolver entero
Como
Inicio
Declarar @word nchar(1) , @n int
set @n=0
mientras len(@str)>0
Inicio
set @word= left(@str, 1)
-Si no es un carácter chino, los trazos se cuentan como 0.
Establezca @n=@n (caso en que Unicode(@word) esté entre 19968 y 19968 20901
Luego (seleccione el 1 id superior de(
Seleccione 1 como id y N' como palabras.
'Unión todos seleccionan 2, N'
Unión todos seleccionan 3, N' caballo'
Unión todos seleccionan 4, N' viento'
Todas las alianzas eligen 5, N 'Dragón'
Todas las uniones eligen 6, N' qi'
La unión elige las 7, N 'Tortuga'
Unión todos selecciona 8, N 'dientes'
' Unión todos selecciona 9, N '
Unión todos selecciona 10, N '
Unión todos seleccione 11, N 'nicho'
Unión todo seleccione 12, N'
Unión todo seleccione 13, N'
Unión todo seleccione 14, N' encía '
Unión todos seleccionan 15, N 'urgente'
Unión todos seleccionan 16, N 'dragón'
Unión todos seleccionan 17, N'
Unión todos seleccionan 18, N'
Unión todos seleccionan 19, N' pang '
' Unión todos seleccionan 20, N'
Unión todos seleccionan 21, N '
Unión todos seleccionan 22, N '
Unión todos seleccionan 23, N '
' Unión todos seleccionan 24, N '
' Unión todos seleccione 25, N '
Unión todo seleccione 26, N '
Unión todo seleccione 27, N '
Unión Seleccione todos los 28, N '
Unión todos seleccione 29, N '
Unión todos seleccione 30, N '澾'
Unión todos seleccione 31, N' Kun '
Unión todos seleccionan 32, N '
Unión todos seleccionan 33, N '
Unión todos seleccionan 35, N '
Unión todos seleccione 36, N '
Unión todos seleccione 39, Norte'
Unión todos seleccione 64, N '
)T
Donde palabra gt=@palabra intercalar Chinese_PRC_Stroke_CS_AS_KS_WS
Ordenar por ID ASC) de lo contrario terminar con 0)
set @str=right(@str, len(@str) -1 )
Fin
return @n
Fin
-Ejemplo de llamada de función:
Seleccione dbo .fun_getbh ('República Popular de China'), dbo.fun_getbh('República Popular de China').
Resultados de la ejecución: el número total de trazos es 39 y 46 respectivamente, y son aceptables tanto los trazos chinos simplificados como los tradicionales.
Por supuesto, también puede cambiar los caracteres chinos y los trazos en "Unir todo" arriba a una tabla fija, crear un índice agrupado en la columna de caracteres chinos y establecer la regla de clasificación de columnas en:
Chinese_PRC_Stroke_CS_AS_KS_WS
Esto es más rápido. Si utilizas un sistema operativo con código BIG5, también deberás utilizar el mismo método para generar caracteres chinos. Pero hay una cosa que recordar: estos caracteres chinos se seleccionan mediante declaraciones SQL, no se ingresan manualmente ni se obtienen buscando en un diccionario, porque después de todo, el diccionario Xinhua es diferente del conjunto de caracteres UNICODE, y los resultados de buscar el El diccionario será incorrecto.
Utiliza las características de las reglas de clasificación para obtener la primera letra del Pinyin chino
Usando el mismo método para obtener el número total de trazos, también podemos escribir una función para obtener la primera Letra de Pinyin chino. Como se muestra a continuación:
Crear función fun_getPY(@str nvarchar(4000))
Devolver nvarchar(4000)
Como
Inicio
Declare @word nchar(1), @PY nvarchar(4000)
set @PY= ' '
mientras len(@str)>0
Inicio
set @word=left(@str, 1)
-Si no es un carácter chino, devuelve la palabra original.
Establezca @PY=@PY (caso en que Unicode(@word) esté entre 19968 y 19968 20901
Luego (seleccione el 1 PY principal de(
Seleccione 'A' como PY, N' ao' como palabra
Unión todos seleccionan 'B', N' libro'
Unión todos seleccionan "C", N 'Error' p>
Unión todos seleccionan 'D', N 'año'
Unión todos seleccionan 'E', N' pin'
Unión todos seleccionan 'F', N' Kun '
Unión todos seleccionan 'G', N '
Unión todos seleccionan 'H', N' a '
Unión todos seleccionan 'J', N ' '.
Unión todos seleccionan 'K ', N '
Unión todos seleccionan 'L ', N'gue '
Unión todos seleccionan 'M ', N '
Unión todos seleccionan 'N', N' bang '
Unión todos seleccionan 'O', N' Lu '
Unión todos seleccionan 'P', N 'exposición'
Unión todos seleccionan 'preguntar', N 'huan'
Unión todos seleccionan 'R', N'
Unión todos seleccionan 'T', N'
Unión todos seleccionan 'W', N' u'
Unión todos seleccionan 'X', N'
Unión todos seleccionan 'Y ', N ' rima
Unión todos seleccionan "Z", N "bang"
)T
Donde palabra gt=@palabra intercalar中文_PRC_CS_AS_KS_WS
ordenar por PY ASC) else @word end)
set @str=right( @str, len(@str)-1)
Fin
Regresar @PY
Fin
-Ejemplo de llamada de función:
Seleccione dbo.fun_getPY('República Popular de China' ), dbo.fun_getPY('República Popular China').
Los resultados son todos: ZHRMGHG
Si estás interesado, también puedes utilizar el mismo método para ampliar la función de obtener el pinyin completo de los caracteres chinos, e incluso obtener la pronunciación. y tonos del pinyin completo, pero la mayoría de las categorías tienen ortografía completa. Lo mejor es utilizar una tabla de búsqueda para obtener la ortografía completa. La velocidad de búsqueda de más de 20.000 caracteres chinos es muy rápida. El uso de la tabla de comparación puede aprovechar al máximo el índice de la tabla.