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

Ayuda con consulta SQL

Estas en el tema de Ayuda con consulta SQL en el foro de SQL Server en Foros del Web. Buenas tardes, estoy intentando ejecutar una consulta SQL y no consigo hacerla funcionar. Me suelta un error en la variable @servicio. Este es el código: ...
  #1 (permalink)  
Antiguo 31/01/2011, 09:35
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Ayuda con consulta SQL

Buenas tardes,

estoy intentando ejecutar una consulta SQL y no consigo hacerla funcionar. Me suelta un error en la variable @servicio. Este es el código:

DECLARE @contador int, @contS int, @servicio varchar(100)
SET @contador = 1
SELECT @contS = COUNT(Uid) FROM VERIFICACION_VENTAS.dbo.Servicios
WHILE (@contador < @contS)
BEGIN
SELECT @servicio = Servicio FROM VERIFICACION_VENTAS.dbo.Servicios WHERE Uid = @contador
SET @contador = @contador + 1
INSERT INTO VERIFICACION_VENTAS.dbo.VerificacionV(ID_PRESENCE, Agente, Nombre_agente, Fecha_venta, TelefonoServicio, Movil, Operador,
OperadorADSL, TodoEnUno, TitularLinea, TipoDocumento, Nif, Pasaporte, FechaNacimiento, Calle, Portal, Piso, Puerta, Poblacion, Provincia,
CPostal, Correo, TitularCuenta, NIF_Cuenta, ENTIDAD_CuentaBancaria, SUCURSAL_CuentaBancaria, DCONTROL_CuentaBancaria, NCUENTA_CuentaBancaria,
Ampliado, Promocion, Permanencia, Otras, DigitalPlus, ContrataGolTV, ServicioContratado, Verificada, Observaciones_venta)
SELECT [email protected] as ID_PRESENCE, [email protected] as Agente, [email protected] as Nombre_agente,
[email protected] as Fecha_venta, [email protected], [email protected],
[email protected], [email protected], [email protected], [email protected],
[email protected], [email protected] as Nif, [email protected],
[email protected], [email protected], [email protected], [email protected],
[email protected], [email protected], [email protected]_Venta as Provincia,
[email protected]_Venta, [email protected], [email protected], [email protected]_Cuenta,
[email protected]_CuentaBancaria, [email protected]_CuentaBancaria, [email protected]_CuentaBancaria,
[email protected]_CuentaBancaria, [email protected], [email protected],
[email protected], [email protected], [email protected], [email protected],
[email protected], 'NO', [email protected] as Observaciones_venta
FROM SQLPR1.@servicio
WHERE [email protected] = 'SI'
AND [email protected] IS NOT NULL
END
  #2 (permalink)  
Antiguo 31/01/2011, 09:41
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 5 meses
Puntos: 8
Respuesta: Ayuda con consulta SQL

si lo que intentas es usar un linked, lo estas haciendo mal, quita la @ de servicio, espero no ser un ignorante je je je.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #3 (permalink)  
Antiguo 31/01/2011, 09:48
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Sigue sin ejecutarse, ya que no reconoce la variable servicio al no llevar el @.
  #4 (permalink)  
Antiguo 31/01/2011, 09:53
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 5 meses
Puntos: 8
Respuesta: Ayuda con consulta SQL

Esto SQLPR1 es el nombre de un linked server?

servicio es la variable que tienes declarada en la parte superior de tu query o es una tabla?
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #5 (permalink)  
Antiguo 31/01/2011, 09:55
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Es el nombre de la base de datos.
  #6 (permalink)  
Antiguo 31/01/2011, 10:18
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Ayuda con consulta SQL

Imagino que la variable @servicio contiene el nombre de la tabla, ademas del propietario de esta.
Si es asi, entonces debes usar SQL dinamico, aunque no me parece buena idea usarlo teniendo en cuenta que esta dentro de un while.
Explicanos que deseas realizar, quizas se pueda resolver sin usar while.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 31/01/2011, 12:17
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Necesito meter el nombre de una tabla en una variable para después hacer un insert con ella. Está dentro del while ya que tengo varias tablas y necesito que haga un insert de cada una ya que esa transacción sql ira dentro de un job que se ejecutará cada 10 minutos.
  #8 (permalink)  
Antiguo 31/01/2011, 13:25
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Ayuda con consulta SQL

Para hacer lo del nombre de la tabla en una variable seria asi:

Código SQL:
Ver original
  1. @DECLARE TABLE_NAME VARCHAR(200),
  2. query VARCHAR(MAX)
  3.  
  4. SET @TABLE_NAME='tabla'
  5. SET @query='select * from ' + @tabla
  6. EXEC Sp_sqlExec @query

Saludos!
  #9 (permalink)  
Antiguo 01/02/2011, 08:03
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Me podrías explicar más o menos como funciona esto, ya que SQL dinámico no lo controlo mucho que digamos. Muchas gracias.
  #10 (permalink)  
Antiguo 01/02/2011, 08:57
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Ayuda con consulta SQL

--declaras una variable de tipo varchar que contendra el nombre de la tabla a buscar
@declare table_name varchar(200),
--tambien se declara una variable para almacenar la consulta
query varchar(max)


--seteas el valor del nombre de tu tabla en este caso "tabla"
SET @table_name='tabla'
--en la variable query pones tu sentencia que seria en este caso select * from tabla
--nada mas que en vez de poner el nombre de tu tabla como tal pones el valor de la
--variable @tabla
SET @query='select * from ' + @tabla
--executas tu query
exec Sp_sqlExec @query

:)

Saludos!
  #11 (permalink)  
Antiguo 01/02/2011, 12:33
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Eso lo entiendo, pero lo que yo tengo es lo siguiente:

- Una tabla donde se volcarán los datos (en una base).
- X numero de tablas de donde cogeré los datos (en otra base diferente). Pueden ser una, dos, tres....tablas.
- En la misma base donde se vuelcan los datos hay una tabla que contiene los nombres de las tablas que contienen los datos a volcar.

Ahora lo que quiero es asignar a la variable @servicio, el nombre de la tabla que tengo con el nombre de las tablas de la base que contiene los datos.
  #12 (permalink)  
Antiguo 01/02/2011, 12:40
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Ayuda con consulta SQL

Ya lo dijeron los compañeros y es bien claro, debes ocupar QUERY DINAMICO.
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 01/02/2011, 12:54
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Ahora mismo tengo esto y me sigue saltando el error en @servicio.

DECLARE @contador int, @contS int, @servicio varchar(100), @query varchar(max)
SET @contador = 1
SELECT @contS = COUNT(Uid) FROM VERIFICACION_VENTAS.dbo.Servicios
WHILE (@contador <= @contS)
BEGIN
SET @servicio = (SELECT Servicio FROM VERIFICACION_VENTAS.dbo.Servicios WHERE Uid = @contador)
SET @query = 'select * from ' + @servicio
EXEC Sp_sqlExec @query
SET @contador = @contador + 1
INSERT INTO VERIFICACION_VENTAS.dbo.VerificacionV(ID_PRESENCE, Agente, Nombre_agente, Fecha_venta, TelefonoServicio, Movil, Operador,
OperadorADSL, TodoEnUno, TitularLinea, TipoDocumento, Nif, Pasaporte, FechaNacimiento, Calle, Portal, Piso, Puerta, Poblacion, Provincia,
CPostal, Correo, TitularCuenta, NIF_Cuenta, ENTIDAD_CuentaBancaria, SUCURSAL_CuentaBancaria, DCONTROL_CuentaBancaria, NCUENTA_CuentaBancaria,
Ampliado, Promocion, Permanencia, Otras, DigitalPlus, ContrataGolTV, ServicioContratado, Verificada, Observaciones_venta)
SELECT [email protected] as ID_PRESENCE, [email protected] as Agente, [email protected] as Nombre_agente,
[email protected] as Fecha_venta, [email protected], [email protected],
[email protected], [email protected], [email protected], [email protected],
[email protected], [email protected] as Nif, [email protected],
[email protected], [email protected], [email protected], [email protected],
[email protected], [email protected], [email protected]_Venta as Provincia,
[email protected]_Venta, [email protected], [email protected], [email protected]_Cuenta,
[email protected]_CuentaBancaria, [email protected]_CuentaBancaria, [email protected]_CuentaBancaria,
[email protected]_CuentaBancaria, [email protected], [email protected],
[email protected], [email protected], [email protected], [email protected],
[email protected], 'NO', [email protected] as Observaciones_venta
FROM SQLPR1.@servicio
WHERE [email protected] = 'SI'
AND [email protected] IS NOT NULL
END
  #14 (permalink)  
Antiguo 01/02/2011, 14:47
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ayuda con consulta SQL

Hola eloy_ameneiros:

Según tu declaración, la variable @Servicio es de tipo varchar, por lo tanto la asignación debes hacerla así:

Código SQL:
Ver original
  1. SET @servicio = '(SELECT Servicio FROM VERIFICACION_VENTAS.dbo.Servicios WHERE Uid = ' + @contador + ')'
  2.  
  3. SET @query = 'select * from ' + @servicio
  4.  
  5. EXEC sp_executesql @query

Es decir, en el SET @servicio falta ponerle las comillas simples.

No le veo mucho caso a utilizar dos variables para formar tu consulta, pero eso depende de tu lógica de negocio. También hay otro detalle, si no mal recuerdo el procedimiento almacenad SP_EXECUTESQL recibe como parámetro una variable tipo UNICODE, por lo que el tipo debería ser NVARCHAR. No estoy seguro si marca error o no, pero es cuestión de que lo pruebes.

Saludos
Leo.
  #15 (permalink)  
Antiguo 02/02/2011, 13:45
 
Fecha de Ingreso: julio-2010
Mensajes: 93
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Ayuda con consulta SQL

Sigue dándome el error en @servicio. Buscaré otra manera de hacerlo haber si lo consigo, de todos modos, muchas gracias a todos los que me han ayudado. Un saludo.
  #16 (permalink)  
Antiguo 02/02/2011, 16:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Ayuda con consulta SQL

Hay otro error, no había reparado en él y es que tu variable contador es de tipo entero (int), por lo tanto no puede ser concatenada, hay que convertirla primero a varchar, de tal manera que quedaría más o menos así

Código SQL:
Ver original
  1. DECLARE @contador INT, @contS INT, @servicio VARCHAR(100), @query VARCHAR(MAX)
  2. SET @contador = 1
  3. SELECT @contS = 5 --COUNT(Uid) FROM VERIFICACION_VENTAS.dbo.Servicios
  4. WHILE (@contador <= @contS)
  5. BEGIN
  6. SET @servicio = '(SELECT Servicio FROM VERIFICACION_VENTAS.dbo.Servicios WHERE Uid = ' + CAST(@Contador AS VARCHAR) + ') T1'
  7. SET @query = 'select * from ' + @servicio
  8. SET @contador = @contador + 1
  9. PRINT @query
  10. END

Para fines de prueba el límite del contador lo estoy poniendo en 5 (sólo habría que quitar la linea comentada del COUNT) y no estoy ejecutando la sentencia, solo la estoy mostrando... También agregué un alias a tu subconsulta, primero prueba esto y después vas agregando las líneas que faltan, de tal manera que puedas determinar más fácilmente donde existen errores.

Saludos
Leo.

Etiquetas: sql
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 06:02.