Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > SQL Server

Respuesta
 
Herramientas Desplegado
Antiguo 27-may-2008, 16:34   #1 (permalink)
tintan94 ha deshabilitado el karma
 
Fecha de Ingreso: abril-2008
Mensajes: 9
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
tintan94 está desconectado   Responder Citando
Antiguo 28-may-2008, 07:23   #2 (permalink)
Colaborador
Andres95 tiene algunos puntos positivos de karma
 
Avatar de Andres95
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.146
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...
Andres95 está desconectado   Responder Citando
Antiguo 28-may-2008, 10:45   #3 (permalink)
tintan94 ha deshabilitado el karma
 
Fecha de Ingreso: abril-2008
Mensajes: 9
Respuesta: tabla como variable

Perfecto.
Gracias
Saludos
tintan94 está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 22:44.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93