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

Crear tabla temporal con un collation especifico.

Estas en el tema de Crear tabla temporal con un collation especifico. en el foro de SQL Server en Foros del Web. Buenas foreros !!! Vereis, estoy creando una tabla temporal en la que estoy metiendo registros. Y despues quiero hacer un inner join en una consulta ...
  #1 (permalink)  
Antiguo 26/01/2009, 04:35
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 7 meses
Puntos: 7
Crear tabla temporal con un collation especifico.

Buenas foreros !!!

Vereis, estoy creando una tabla temporal en la que estoy metiendo registros.

Y despues quiero hacer un inner join en una consulta en la uqe metere varias tablas en la consulta, además de esta temporal.

Sin embargo, al hacer esa select, me está dando fallo por que la tabla temporal se ha creado con un "COLLATION" distinto al de las demas tablas.

¿Como podría crear la temporal con el mismo collation que las otras?


ACTUALMENTE TENGO LA SENTENCIA ASI:
Código:
CREATE TABLE #TBAREMOS_DETALLE (COD_ACTOMEDICO CHAR(12))

--relleno la tabla

SELECT * FROM SI_ACTOS_MEDICOS
                INNER JOIN #TBAREMOS_DETALLE . . . .
Y el error que me está dando es el siguiente:
Código:
Msg 468, Level 16, State 9, Line 45
Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Latin1_General_CI_AS" in the equal to operation.
Por favor, agradecería que me hecharan una mano en lo posible...

Desde ya, muchas gracias por su tiempo.

Saludos.
__________________
Charlie.
  #2 (permalink)  
Antiguo 26/01/2009, 05:24
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 2 meses
Puntos: 85
Respuesta: Crear tabla temporal con un collation especifico.

Las tablas temporales se crean en la Tempdb, y a menos que se indique lo contrario, heredan el valor de COLLATE o juego de caracteres de dicha base, es en esta posible conversión de caracteres donde se producen los problemas. Hay dos opciones, forzar la creación de la tabla temporal a un COLLATE específico, o bien que herede el COLLATE de la base de datos desde donde se esta creando la tabla.

Opción 1

Código:
create table #t1 (id numeric(8), data varchar(30) collate Modern_Spanish_CI_AS) 
insert into #t1 values (1,'data1')
select * from #t1
drop table #t1
go
Opción 2

Código:
create table #t2 (id numeric(8), data varchar(30) collate database_default) 
insert into #t2 values (2,'data2')
select * from #t2
drop table #t2
go
En lo particular, prefiero la opción 2, ya que tu aplicación podría soportar varios COLLATE y si ese es el caso, no tienes que preocuparte por modificar el código.

Nota, esto también aplica a los tipos de datos TABLE.

Saludos
  #3 (permalink)  
Antiguo 26/01/2009, 05:46
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 7 meses
Puntos: 7
Respuesta: Crear tabla temporal con un collation especifico.

Bueno, en prmer lugar, muchisimas gracias por contestarme... estoy en el trabajo y estoy atascadisimo con esto...

Verás hice lo que me comentaste, probé con las dos formas y a la hora de hacer una consulta cruzada con esta tabla, me está dando el mismo mensaje:

He probado de estas formas
Código:
--Se que es este collate el que tengo que convertir, ya me fije en las tablas
CREATE TABLE #TBAREMOS_DETALLE (COD_ACTOMEDICO CHAR(12), DES_ACTOMEDICO NVARCHAR(300), IND_REQUIEREAUTORIZACION CHAR(1),
								[COD_ESTADO] [char](6) NULL,
								[IMP_PRECIO] [numeric](9, 2) NULL, [IND_VISIBLESOLICITUD] [CHAR](1),
								[IND_BAREMOEDITABLE] [CHAR](1), [DES_PROCEDENCIA] [VARCHAR](20) collate SQL_Latin1_General_CP1_CI_AS)



-- Y CON LA BASE DE DATOS DEFAULT:
CREATE TABLE #TBAREMOS_DETALLE (COD_ACTOMEDICO CHAR(12), DES_ACTOMEDICO NVARCHAR(300), IND_REQUIEREAUTORIZACION CHAR(1),
								[COD_ESTADO] [char](6) NULL,
								[IMP_PRECIO] [numeric](9, 2) NULL, [IND_VISIBLESOLICITUD] [CHAR](1),
								[IND_BAREMOEDITABLE] [CHAR](1), [DES_PROCEDENCIA] [VARCHAR](20) collate database_default)

Sin embargo, me sale exactamente el mismo error. Una vez he creado la tabla temporal. Ejecuto dos sentencias. Una de insercción que la hace correcta y la segunda de actualización, qeu es donde me falla.

Código:
--DROP TABLE #TBAREMOS_DETALLE
CREATE TABLE #TBAREMOS_DETALLE (COD_ACTOMEDICO CHAR(12), DES_ACTOMEDICO NVARCHAR(300), IND_REQUIEREAUTORIZACION CHAR(1),
								[COD_ESTADO] [char](6) NULL,
								[IMP_PRECIO] [numeric](9, 2) NULL, [IND_VISIBLESOLICITUD] [CHAR](1),
								[IND_BAREMOEDITABLE] [CHAR](1), [DES_PROCEDENCIA] [VARCHAR](20) collate SQL_Latin1_General_CP1_CI_AS)

--OK
INSERT INTO #TBAREMOS_DETALLE
		SELECT	SAM.COD_ACTOMEDICO, SAM.DES_ACTOMEDICO, SAM.IND_REQUIEREAUTORIZACION,
				SB.COD_ESTADO, 
				IMP_PRECIO, SAM.IND_VISIBLESOLICITUD,
				SAM.IND_BAREMOEDITABLE, '2' DES_PROCEDENCIA
				FROM SALUD.dbo.SI_BAREMOS_DETALLES SB
					RIGHT JOIN SALUD.dbo.SI_ACTOS_MEDICOS SAM 
						ON SB.COD_ACTOMEDICO= SAM.COD_ACTOMEDICO
						AND (SB.COD_BAREMO IS NULL or  SB.COD_BAREMO = @COD_BAREMO)

				WHERE (SAM.COD_GRUPO=@COD_GRUPO AND SAM.COD_ESPECIALIDAD_FACTURACION=@COD_ESPECIALIDAD
												 AND SAM.COD_SUBESPECIALIDAD_FACTURACION=@COD_SUBESPECIALIDAD) 
												 AND SAM.COD_ESTADO='ATOACT'  
												 AND (sb.cod_estado='BARACT' OR sb.cod_estado IS NULL)

--FALLA
		UPDATE #TBAREMOS_DETALLE     SET TBD.IMP_PRECIO=SBD.IMP_PRECIO,
										 TBD.DES_PROCEDENCIA='1'
									 FROM #TBAREMOS_DETALLE TBD
									 INNER JOIN SI_BAREMOS_DETALLES SBD
											ON SBD.COD_ACTOMEDICO=TBD.COD_ACTOMEDICO
											AND TBD.COD_ESTADO='BARACT'
									 INNER JOIN SI_BAREMOS SB
											ON  SBD.COD_BAREMO=SB.COD_BAREMO
											AND SB.IND_GENERAL='S'
											AND SB.COD_DELEGACION=@COD_DELEGACION
											AND FEC_COBERTURADESDE >= @FECHA_ACTUAL
											AND FEC_COBERTURAHASTA <= @FECHA_ACTUAL
¿Alguna idea?
__________________
Charlie.
  #4 (permalink)  
Antiguo 26/01/2009, 05:50
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 2 meses
Puntos: 85
Respuesta: Crear tabla temporal con un collation especifico.

El collate se define para cada campo de caracter de la tabla temporal, por ejemplo

Código:
create table #t1 
(id numeric(8),
data1 varchar(30) collate ...,
data2 char(30) collate ...,
data3 nvarchar(30) collate ...)
Saludos
  #5 (permalink)  
Antiguo 26/01/2009, 05:54
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 7 meses
Puntos: 7
Respuesta: Crear tabla temporal con un collation especifico.

Bueno, lo solucione, poniendo el collate en la definicion de cada campo. Amigo, mucisimas gracias por la ayuda, de verdad.

P.D.: En el update del final... ¿En teoria no debería encontrarme el campo TBD.IMP_PRECIO? Me dice uqe no lo encuentra...
__________________
Charlie.
  #6 (permalink)  
Antiguo 26/01/2009, 07:24
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 7 meses
Puntos: 7
Respuesta: Crear tabla temporal con un collation especifico.

jejeje, ok matanga, justo publicamos a la vez, parece ser.

Muchas gracias, ya solucioné todos los problemas.

Un abrazo gente !!!
__________________
Charlie.
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 23:51.