Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

"ORDER BY" caracteres latinos

Estas en el tema de "ORDER BY" caracteres latinos en el foro de SQL Server en Foros del Web. Estoy trabajando con sql 7 y necesito un ordenamiento direfente para español castellano por cuestiones laborales asi es como sale ahorita: select * from tabla ...
  #1 (permalink)  
Antiguo 09/05/2011, 10:54
 
Fecha de Ingreso: mayo-2011
Mensajes: 5
Antigüedad: 12 años, 11 meses
Puntos: 0
"ORDER BY" caracteres latinos

Estoy trabajando con sql 7 y necesito un ordenamiento direfente para español castellano por cuestiones laborales asi es como sale ahorita:

select *
from tabla
Order by Apellido

Resultados:

APARICIO RAMIREZ CARLOS ANTONIO
CHAVEZ VARGAS AARON GUADALUPE
CONCHA CANALES MANUEL
CORTES RIOS ARMANDO
DAVILA AVENDAÑO FRANCISCO DANIEL

Necesito que al hacer el order by me los ordene por caracteres en castellano siendo la CH un caracter despues de la C, al igual que la LL y la N, el resultado debe de quedar asi:

APARICIO RAMIREZ CARLOS ANTONIO
CONCHA CANALES MANUEL
CORTES RIOS ARMANDO
CHAVEZ VARGAS AARON GUADALUPE
DAVILA AVENDAÑO FRANCISCO DANIEL


En oracle solo le das como un alter a la sesion para que cambie la forma en como lee los caracteres, pero en sql 7 no se como hacerlo, agradezco su ayuda
  #2 (permalink)  
Antiguo 09/05/2011, 12:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: "ORDER BY" caracteres latinos

Hola clammatus:

Debes recordar que de acuerdo a las nuevas reglas de la Real Academia de la Lengua Española las letras CH y LL ya no existen, por lo que se acoplan a la letra C y L respectivamente. Para ordenar como quieres debes definir una intercalación tipo Traditional_Spanish en lugar de Modern_Spanish. Checa este script:

Código SQL:
Ver original
  1. DECLARE @tabla TABLE (nombre VARCHAR(100))
  2. INSERT INTO @tabla VALUES ('ÑACA HERNANDEZ MONICA')
  3. INSERT INTO @tabla VALUES ('DAVILA AVENDAÑO FRANCISCO DANIEL')
  4. INSERT INTO @tabla VALUES ('CERVERA AGUILAR FERNANDO')
  5. INSERT INTO @tabla VALUES ('CONCHA CANALES MANUEL')
  6. INSERT INTO @tabla VALUES ('APARICIO RAMIREZ CARLOS ANTONIO')
  7. INSERT INTO @tabla VALUES ('LAMAS FERNANDEZ JUAN')
  8. INSERT INTO @tabla VALUES ('LLAMAS ROJAS JOSÉ')
  9. INSERT INTO @tabla VALUES ('CHAVEZ VARGAS AARON GUADALUPE')
  10. INSERT INTO @tabla VALUES ('LUJAN DIAZ EDGAR')
  11. INSERT INTO @tabla VALUES ('NUÑEZ ROBLEDO HUGO')
  12.  
  13. --Sin Collate
  14. SELECT nombre FROM @tabla
  15. ORDER BY nombre
  16.  
  17. --Con Collate
  18. SELECT nombre FROM @tabla
  19. ORDER BY nombre COLLATE traditional_Spanish_CI_AS

El resultado de los dos select's debería ser el siguiente:

SIN EL COLLATE
Código:
nombre
----------------------------------------------------------------------------------------------------
APARICIO RAMIREZ CARLOS ANTONIO
CERVERA AGUILAR FERNANDO
CHAVEZ VARGAS AARON GUADALUPE
CONCHA CANALES MANUEL
DAVILA AVENDAÑO FRANCISCO DANIEL
LAMAS FERNANDEZ JUAN
LLAMAS ROJAS JOSÉ
LUJAN DIAZ EDGAR
ÑACA HERNANDEZ MONICA
NUÑEZ ROBLEDO HUGO
CON EL COLLATE

Código:
nombre
----------------------------------------------------------------------------------------------------
APARICIO RAMIREZ CARLOS ANTONIO
CERVERA AGUILAR FERNANDO
CONCHA CANALES MANUEL
CHAVEZ VARGAS AARON GUADALUPE
DAVILA AVENDAÑO FRANCISCO DANIEL
LAMAS FERNANDEZ JUAN
LUJAN DIAZ EDGAR
LLAMAS ROJAS JOSÉ
NUÑEZ ROBLEDO HUGO
ÑACA HERNANDEZ MONICA
Saludos
Leo
  #3 (permalink)  
Antiguo 09/05/2011, 15:01
 
Fecha de Ingreso: mayo-2011
Mensajes: 5
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: "ORDER BY" caracteres latinos

mmmmm gracias por tu ayuda pero sigo sin poder, utilice el codigo que pusiste asi:

SELECT nb_completo
FROM t033_cAlumno
ORDER BY nb_completo COLLATE traditional_Spanish_CI_AS

y me genera el siguiente error:


Servidor: mensaje 170, nivel 15, estado 1, línea 3
Línea 3: sintaxis incorrecta cerca de 'COLLATE'.


Tambien buscando los collate vi que en algunos casos se podria asi:

SELECT nb_completo COLLATE traditional_Spanish_CI_AS
FROM t033_cAlumno
ORDER BY nb_completo

y tambien me genera un error:

Servidor: mensaje 170, nivel 15, estado 1, línea 1
Línea 1: sintaxis incorrecta cerca de 'traditional_Spanish_CI_AS'.

Ayuda please
  #4 (permalink)  
Antiguo 10/05/2011, 08:08
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: "ORDER BY" caracteres latinos

Hola de nuevo clammatus:

La versión de SQL Server que estás utilizando es muy vieja, y por lo tanto obsoleta, es más, si no mal recuerdo Microsoft ya ni siquiera le da mantenimiento. No estoy seguro de cómo sería la sintaxis para esa versión, sería cuestión de que investigues un poco más, o en su defecto que cambiaras tu motor por una versión más moderna.

Otra opción que tienes es cambiar directamente desde el diseño la intercalación que tiene para el campo nb_completo, pero ya que nunca trabajé con SQL Server 7.0 no estoy seguro de sus capacidades y limitaciones.

Saludos.
Leo.
  #5 (permalink)  
Antiguo 11/05/2011, 12:00
 
Fecha de Ingreso: mayo-2011
Mensajes: 5
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: "ORDER BY" caracteres latinos

Al parecer en SQL 7 no se pueden cambiar los collate, siempre se quedara de acuerdo al collate como se instalo el sql

me harte migre la base de datos a sql 2000 (un rollo con los store procedures) pero bueno ya pude, ahora estoy atorado en un modulo con el collate ejemplo:


select distinct t103.Nu_ExpedienteUNAM,
case
when charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 then STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
else ltrim(rtrim(t102.Nb_Completo))
end as NbCompleto,
IsNull(De_Calificacion, '00')
from t102_dAlumnoIncorporacion t102, t103_dAlumnosAsignaturas t103
where t102.Pk_CveOrigen = @PkCveOrigen
and t102.Pk_CveCicEsc = @PkCveCicEsc
and t102.Pk_CveEstatus in ('ALU01','ALU04')
and t102.Pk_CveOrigen = t103.Pk_CveOrigen
and t102.Pk_CveCicEsc = t103.Pk_CveCicEsc
and t102.Pk_Matricula = t103.Pk_Matricula
and t103.De_GrupoUNAM not in ('','9999')
and t103.De_GrupoUNAM = @PkCveGrupoUNAM
and t103.Pk_CveAsignatura = @PkCveAsignatura
-- order by t103.Pk_CveAsignatura, t103.De_GrupoNAM, rtrim(t102.Nb_Completo)
order by NbCompleto, t103.Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')

Asi si funciona el store, pero al agregar el COLLATE en nbcompleto al final

select distinct t103.Nu_ExpedienteUNAM,
case
when charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 then STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
else ltrim(rtrim(t102.Nb_Completo))
end as NbCompleto,
IsNull(De_Calificacion, '00')
from t102_dAlumnoIncorporacion t102, t103_dAlumnosAsignaturas t103
where t102.Pk_CveOrigen = @PkCveOrigen
and t102.Pk_CveCicEsc = @PkCveCicEsc
and t102.Pk_CveEstatus in ('ALU01','ALU04')
and t102.Pk_CveOrigen = t103.Pk_CveOrigen
and t102.Pk_CveCicEsc = t103.Pk_CveCicEsc
and t102.Pk_Matricula = t103.Pk_Matricula
and t103.De_GrupoUNAM not in ('','9999')
and t103.De_GrupoUNAM = @PkCveGrupoUNAM
and t103.Pk_CveAsignatura = @PkCveAsignatura
-- order by t103.Pk_CveAsignatura, t103.De_GrupoNAM, rtrim(t102.Nb_Completo)
order by NbCompleto collate traditional_spanish_CI_AS, t103.Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')

Me dice un error de order by como si no lo tuviera en el select distinct:

ORDER BY items must appear in the select list if SELECT DISTINCT is specified

funciona sin el collate cuando pongo el collate es cuando me da el error
  #6 (permalink)  
Antiguo 11/05/2011, 12:30
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: "ORDER BY" caracteres latinos

Hola clammatus:

Si decidiste migrar de BD hubieras optado por versión más actual, en lugar de SQL Server 2000, pero bueno, ese es otro rollo. Vamos a checar el problema que tienes:

Tu campo NbCompleto es un CAMPO CALCULADO y como tal no puede formar parte de la cláusula ORDER BY, es por eso que te aparece el error, aquí tienes dos opciones.

PRIMERA OPCION: calcular nuevamente el campo NbCompleto en la sección ORDER BY, quedaría más o menos así:

Código SQL:
Ver original
  1. SELECT 
  2. ...
  3. CASE
  4. WHEN charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 THEN STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
  5. ELSE ltrim(rtrim(t102.Nb_Completo))
  6. END AS NbCompleto,
  7. ...
  8. ORDER BY
  9. CASE
  10. WHEN charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 THEN STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
  11. ELSE ltrim(rtrim(t102.Nb_Completo))
  12. END, t103.Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')

Si observas se repite todo el código que tienes en tu SELECT en la parte del ORDER BY, sin poner el alias por supuesto, es lo mismo que estás haciendo para el campo IsNull(De_Calificacion, '00')

SEGUNDA OPCIÓN

Utilizar una subconsulta y ordenar en la consulta externa, es decir algo como esto:

Código SQL:
Ver original
  1. SELECT T1.* FROM
  2. (
  3. SELECT  DISTINCT t103.Nu_ExpedienteUNAM,
  4. CASE
  5. WHEN charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 THEN STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ' ,ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
  6. ELSE ltrim(rtrim(t102.Nb_Completo))
  7. END AS NbCompleto,
  8. IsNull(De_Calificacion, '00')
  9. FROM    t102_dAlumnoIncorporacion t102, t103_dAlumnosAsignaturas t103
  10. WHERE   t102.Pk_CveOrigen = @PkCveOrigen
  11. AND t102.Pk_CveCicEsc = @PkCveCicEsc
  12. AND t102.Pk_CveEstatus  IN  ('ALU01','ALU04')
  13. AND t102.Pk_CveOrigen   =   t103.Pk_CveOrigen
  14. AND t102.Pk_CveCicEsc   =   t103.Pk_CveCicEsc
  15. AND t102.Pk_Matricula   =   t103.Pk_Matricula
  16. AND t103.De_GrupoUNAM   NOT IN ('','9999')
  17. AND t103.De_GrupoUNAM   =   @PkCveGrupoUNAM
  18. AND t103.Pk_CveAsignatura   = @PkCveAsignatura
  19. ) T1
  20. ORDER BY NbCompleto, Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')


Si observas la consulta interna es la misma que pones, sólo quitando la parte del ORDER BY, el cual pones en el SELECT * externo. Y una recomendación final, evita listar tablas en el FROM y hacer las uniones en el WHERE. En lugar de esto utiliza JOIN's, es decir en lugar de poner

Código SQL:
Ver original
  1. FROM Tabla1, Tabla2 WHERE Tabla1.CampoID = Tabla2.CampoID

Utiliza JOIN's (INNER, LEFT O RIGTH según sea el caso)

Código SQL:
Ver original
  1. FROM Tabla1 INNER JOIN Tabla2 ON Tabla1.CampoID = Tabla2.CampoID

Aunque el resultado es el mismo, la diferencia en tiempos de respuesta puede ser enorme.

Saludos
Leo.
  #7 (permalink)  
Antiguo 11/05/2011, 13:16
 
Fecha de Ingreso: mayo-2011
Mensajes: 5
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: "ORDER BY" caracteres latinos

Ok muchas gracias pero, para la primer opcion que me pusiste, donde pongo el collate??? que me sigue generando el error al poner el collate y sin el collate no me ordena como necesito

perdon por tanta pregunta.... y gracias nuevamente

Respecto a los Joins, yo se que estan mal, en si yo no hice los stores, estan aqui desde hace tiempo (antes de que yo llegara) y son mas de 200 stores (es algo grande el sistema), los voy arreglando cada vez que me topo con alguno que tengo que utilizar y tengo tiempo, la verdad es algo dificil cambiar todos los stores.

Y no pude migrar a un sql mas nuevo, pues la empresa ya tenia licencias de sql 2000 (que nunca habia usado) y son muy codos/marros para comprar mas nuevas, jajaja

Última edición por clammatus; 11/05/2011 a las 14:02
  #8 (permalink)  
Antiguo 11/05/2011, 14:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: "ORDER BY" caracteres latinos

Hola de nuevo:

Mira, en estos momentos no tengo instalado algún SQL Server 2000 para hacer pruebas, pero según la documentación la sintaxis es la misma que para 2005 y 2008, checa esta página:

http://msdn.microsoft.com/es-es/libr...on124121120120.

Según lo que dice ahí esto debería funcionar:

Código:
ORDER BY
case 
when charindex('Ñ',ltrim(rtrim(t102.Nb_Completo)),1) <> 0 then STUFF(ltrim(rtrim(t102.Nb_Completo)),charindex('Ñ', ltrim(rtrim(t102.Nb_Completo)),1),1,'&')
else ltrim(rtrim(t102.Nb_Completo))
end  COLLATE traditional_spanish_CI_AS, t103.Nu_ExpedienteUNAM, IsNull(De_Calificacion, '00')
Si esto sigue sin funcionar igual y deberías probar tratar de cambiar la intercalación desde la definición de la tabla.

Aquí está aplicado el COLLATE tal y como te lo pongo en el ejemplo:

Cita:
Nivel de expresión
En expresiones utilizadas dentro del Transact-SQL se puede utilizar la instrucción COLLATE para determinar la intercalación utilizada por la expresión. Este nivel de intercalación se puede utilizar para comparaciones o para ordenamiento de columnas que operan con diferentes páginas de códigos.

SELECT *
FROM tblEmpleado
ORDER BY f_codigo COLLATE French_CI_AI
SELECT *
FROM tblEmpleado ORDER BY f_codigo = f_codigo_ant COLLATE Modern_Spanish_CS_AS
y también está explicado como puedes cambiar la intercalación a los campos de tu tabla:

Cita:
Modificación
Después de crear una base de datos o una tabla, es posible modificar la intercalación utilizada por estos objetos, para realizar estas modificaciones se utiliza la instrucción ALTER del lenguaje T-SQL, dependiendo del objeto a modificar.

ALTER DATABASE DbPrueba COLLATE SQL_Latin1_General_CP1_CI_AS
ALTER TABLE tblCiudad ALTER COLUMN f_pais varchar (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
Sería cuestión de que pruebes... si no funciona con la primer opción que te puse, utiliza la segundo, ahora sí que sería prueba-error hasta que funcione jejeje... En cuanto a las licencias, si tus jefes no quieren invertir en BD, pues igual y deberías proponerles alguna alternativa gratuita, como PostgreSQL. Igual y si logras la migración hasta un aumento te dan jejeje, explícales que con lo que tienen actualmente tienen un atraso de 10 años en la tecnología, pero bueno, esa ya es harina de otro costal.

Saludos y ojalá pronto encuentres la solución a tu problema.
Leo.
  #9 (permalink)  
Antiguo 11/05/2011, 14:52
 
Fecha de Ingreso: mayo-2011
Mensajes: 5
Antigüedad: 12 años, 11 meses
Puntos: 0
Respuesta: "ORDER BY" caracteres latinos

Muchas gracias por la ayuda, tuve que cambiar el collation del campo, pues seguia sin funcionar no se porque, pero al final quedo bien asi.

Ahora tendre que revisar todos las tablas donde cambiar igual el campo(Pues como viste, si el SQL esta mal hecho, no te quiero ni comentar como estan las tablas...... mil datos duplicados,,,,,) jajaja pero bueno

Muchisimas gracias por tu ayuda

  #10 (permalink)  
Antiguo 11/05/2011, 15:16
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: "ORDER BY" caracteres latinos

No tienes nada que agradecer clammatus, me alegra haber ayudado en algo...

Por lo que cuentas la BD tiene bastantes problemas, por lo que la opción de hacer una re-ingeniería completa igual y sería más conveniente que andar modificando tablas y procedimientos, pero eso es cuestión de los jefes, nosotros simples DBA's a veces ni las manos podemos meter jejeje, y lo peor es que hay que estar corrigiendo los errores de otros no

Saludos
Leo.

Etiquetas: caracteres, latinos, order
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:33.