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

tabla como variable

Estas en el tema de tabla como variable en el foro de SQL Server en Foros del Web. Hola, tengo el siguiente problema: Estoy creando queries y los ejecuto con la sentencia EXEC en un Stored procedure, por ejemplo: SET @SQL = 'SELECT ...
  #1 (permalink)  
Antiguo 27/05/2008, 16:34
 
Fecha de Ingreso: abril-2008
Mensajes: 9
Antigüedad: 16 años
Puntos: 0
De acuerdo tabla como variable

Hola, tengo el siguiente problema:
Estoy creando queries y los ejecuto con la sentencia EXEC en un Stored procedure, por ejemplo:

SET @SQL = 'SELECT departamento FROM losdepartamentos
WHERE eltrabajador = '''+@trabajador+''''
EXEC (@SQL)

Ahora, el problema es que puede ser más de un trabajador y en mi stored, yo estoy recibiendo una cadena que es la subconsulta que trae los trabajadores que se necesitan. Por default, recibo esta cadena y no hay forma de cambiarlo.
Supongamos:
@subconsulta = 'SELECT DISTINCT ELtrabajador FROM todoslostrabajadores'

Entonces mi query quedaría:
SET @SQL = 'SELECT departamento FROM losdepartamentos
WHERE eltrabajador IN ('''+@subconsulta+''')'
EXEC (@SQL)

el problema es que mi query es bastante extenso y la subconsulta también. Entonces una solución sería crear otro query para insertar la subconsulta en una tabla temporal

CREATE TABLE tablatemporal (trabajador char(6))
SET @InserSubConsulta = 'INSERT INTO tablatemporal '+@subconsulta
EXEC @InserSubConsulta

SET @SQL = 'SELECT departamento FROM losdepartamentos
WHERE eltrabajador IN (SELECT trabajador FROM tablatemporal)'
EXEC (@SQL)

Esto ta güeno, pero a mi me gustaría no utilizar una tabla, sino una tabla temporal, es decir #tablatemporal que se eliminaría automáticamente acabando el Stored

CREATE TABLE #tablatemporal (eltrabajador char(6))
.
.
.

pero cuando ejecuto el Stored me regresa el error:
Cannot resolve the collation conflict between "Latin1_General_CI_AI" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation

tons, estaba pensando en declara una variable de tabla es decir:

DECALRE @tablatemporal TABLE (eltrabajador char(6))
.
.
.
Pero me aparece el error
Must declare the table variable "@tabletemporal".



¿¿¿¿¿Alguien tiene alguna sugerencia????
Gracias de antemano.
Saludos a todos y todas
  #2 (permalink)  
Antiguo 28/05/2008, 07:23
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 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.
  #3 (permalink)  
Antiguo 28/05/2008, 10:45
 
Fecha de Ingreso: abril-2008
Mensajes: 9
Antigüedad: 16 años
Puntos: 0
Respuesta: tabla como variable

Perfecto.
Gracias
Saludos
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 18:19.