Ver Mensaje Individual
  #2 (permalink)  
Antiguo 28/05/2008, 07:23
Avatar de Andres95
Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: tabla como variable

Tu problema es de conflicto de collation (metodo de intercalacion de sql).

Una solucion es agregar el collation en la tabla temporal que estas utilizando, tomando el mismo que tiene tu tabla fisica a la que le estas haciendo el select, en este caso creo que es losdepartamentos el campo eltrabajador.

Para ver el collation de un campo solo ejecuta el siguiente comando sobre la tabla en cuestion, en la lista de campos al final viene una columna con el collation correspondiente. Ese mismo es el que debes manejar en la comparacion o en la definicion del campo de tu tabla temporal...

Código:
sp_help 'losdepartamentos'
te anexo ejemplo... espero te sea de utilidad...

Código:
--------------------------------------------------
-- Antes de crear una temporal de sesion se debe 
-- verificar que no exista si existe la eliminamos
--------------------------------------------------
If object_id('tempdb..#tablatemporal') is null drop table #tablatemporal

----------------------------------------------------------------------
-- Se define como llave primaria ya que sabemos que no se repetira
-- y optimizamos la consulta con dicha tabla
----------------------------------------------------------------------
CREATE TABLE #tablatemporal (trabajador char(6) Primary Key)

----------------------------------------------------------------------
-- Usamos Group by en lugar de distinct
----------------------------------------------------------------------
Set @subconsulta = 'SELECT ELtrabajador FROM todoslostrabajadores group by ELtrabajador '
SET @InserSubConsulta = 'INSERT INTO #tablatemporal (trabajador) '+ @subconsulta
EXEC (@InserSubConsulta)

----------------------------------------------------------------------
-- Debido a que eltrabajador y trabajador tienen diferente collation
-- se especifica el collate que debe ser usado al compararlos.
-- Si no se quiere o no se puede poner aqui el collation se puede 
-- definir la tabla temporal con el mismo collate que tiene el campo
-- eltrabajador en la tabla losdepartamentos. p.e.
-- CREATE TABLE #tablatemporal (trabajador char(6) collate Latin1_General_CI_AI Primary Key)
----------------------------------------------------------------------
SET @SQL = @SQL + ' SELECT departamento '
SET @SQL = @SQL + ' FROM losdepartamentos '
SET @SQL = @SQL + ' WHERE eltrabajador collate Latin1_General_CI_AI IN '
SET @SQL = @SQL + ' (SELECT trabajador collate Latin1_General_CI_AI FROM #tablatemporal)'
EXEC (@SQL)

--------------------------------------------------
-- despues de terminar de usar la temporal 
-- la eliminamos explicitamente
--------------------------------------------------
If object_id('tempdb..#tablatemporal') is null drop table #tablatemporal
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.