Colección de citas famosas - Frases célebres - ¿Cómo ordenar carpetas de Windows por nombre en SQL Server? ¿Qué es el algoritmo y cómo ordenarlo?

¿Cómo ordenar carpetas de Windows por nombre en SQL Server? ¿Qué es el algoritmo y cómo ordenarlo?

Las reglas de clasificación de SQL SERVER no se usan comúnmente y es posible que muchos principiantes no estén familiarizados con ellas. Sin embargo, hay un error que se debe encontrar a menudo: cuando la base de datos de SQL SERVER está conectada y consulta en múltiples bases de datos, si el carácter predeterminado. los conjuntos de las dos bases de datos son diferentes. El sistema devolverá el siguiente error:

"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)

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

*/

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 "国":

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'

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.