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

[SOLUCIONADO] Problemas con query dinámica

Estas en el tema de Problemas con query dinámica en el foro de SQL Server en Foros del Web. Tengo una query que debe crearse de forma dinámica (las tablas van cambiando), pero no logro ejecutarla con distintas tablas. Utilizo una query de este ...
  #1 (permalink)  
Antiguo 23/05/2016, 16:50
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Problemas con query dinámica

Tengo una query que debe crearse de forma dinámica (las tablas van cambiando), pero no logro ejecutarla con distintas tablas.

Utilizo una query de este estilo

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. SET @SQL = ' SELECT col1, col2, col3 FROM dbo.' + quotename(@tblname) WHERE keycol = @KEY
  3. EXEC sp_executesql @SQL, N'@key varchar(10)', @KEY


El problema es que @tblname debe estar declarada antes de realizar el Set @sql , por lo que luego de ejecutar (EXEC) no puedo volver a "crear" la variable @sql con otra tabla (Realizar un Set @tblname y luego un EXEC nuevamente pero que obtenga los datos de la nueva tabla)...


Es posible? estoy realizando algo mal??
  #2 (permalink)  
Antiguo 24/05/2016, 08:14
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: Problemas con query dinámica

O sea como? quieres hacer un nuevo set pero no puedes hacer el set? o como??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 24/05/2016, 10:45
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Problemas con query dinámica

la query del select es siempre la misma, cambia solo las clausalas WHERE dependiendo de la tabla usada.


Es por eso que declaro @SQL antes de todo... la idea de ejecución es así:


Declaro @SQL
Hago el set de @SQL con el select
Declaro @tblname
Ejecuto la query apuntando a la tabla @tblname
Redeclaro @tblname con otro nombre de tabla
Ejecuto la query apuntando a la nueva tabla @tblname

El problema es que cuando hago el set de @SQL el valor de la tabla debe estar declarado, y luego no lo puedo pasar como parámetro al sp_executesql para que lo modifique.
  #4 (permalink)  
Antiguo 24/05/2016, 11:16
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: Problemas con query dinámica

Creo que ya entendi, estas ejecutando

Código SQL:
Ver original
  1. EXEC sp_executesql @SQL, N'@key varchar(10)', @KEY

Mandando el valor del parametro y el tipo de dato desde el sp_executesql, ahora porque no lo haces de esta manera:

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. SET @SQL = ' SELECT col1, col2, col3 FROM dbo.' + quotename(@tblname) + ' WHERE keycol  = ' +  @KEY
  3. EXEC sp_executesql @SQL

Aqui si ocupas otra columna que no sea keycol pues la puedes cambiar directamente:

Código SQL:
Ver original
  1. SET @KEY='mi_nuevo_valor'
  2. SET @SQL = ' SELECT col1, col2, col3 FROM dbo.' + quotename(@tblname) + ' WHERE another_column  = ' + CHAR(39) +   @KEY +  CHAR(39)
  3. EXEC sp_executesql @SQL

O eso no es lo que necesitas???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 24/05/2016, 13:40
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Problemas con query dinámica

Yo he podido modificar el valor de @KEY

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. SET @KEY = '1'
  3. SET @SQL = ' SELECT col1, col2, col3 FROM dbo.' + quotename(@tblname) + ' WHERE keycol  = ' +  @KEY
  4. EXEC sp_executesql @SQL
  5. SET @KEY = '2'
  6. EXEC sp_executesql @SQL

Con lo anterior tendría 2 query que retornan los datos de la columnas en 1 y 2 si??

Lo que no puedo es hacer eso mismo pero cambiando el valor de la tabla (EL FROM)
  #6 (permalink)  
Antiguo 24/05/2016, 14: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: Problemas con query dinámica

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. SET @KEY = '1'
  3. SET @SQL = ' SELECT col1, col2, col3 FROM dbo.' + quotename(@tblname) + ' WHERE keycol  = ' +  @KEY
  4. EXEC sp_executesql @SQL
  5.  
  6. SET @tblname='Nuevatabla'
  7. SET @SQL = ' SELECT col1, col2, col3 FROM dbo.' + quotename(@tblname) + ' WHERE keycol  = ' +  @KEY
  8. SET @KEY = '2'
  9. EXEC sp_executesql @SQL

Y asi no funciona o donde esta el problema del segundo nombre de tabla??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 24/05/2016, 14:29
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Problemas con query dinámica

El problema es que quiero saber si es posible hace exactamente eso pero sin realizar el SET @SQL cada vez que cambie un parámetro. La query es bastante grande por lo que quiero evitar copiarla cada vez que necesite cambiar el nombre de la tabla.
  #8 (permalink)  
Antiguo 24/05/2016, 14:39
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: Problemas con query dinámica

Si te explicas se entiende ;):

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. DECLARE @SELECT Nvarchar(MAX)
  3. DECLARE @WHERE Nvarchar(MAX)
  4.  
  5. SET @KEY = '1'
  6. SET @query= ' SELECT col1, col2, col3 FROM dbo.'
  7. SET @WHERE= ' WHERE keycol  = '
  8.  
  9. SET @SQL = @SELECT + quotename(@tblname) + @WHERE +  @KEY
  10. EXEC sp_executesql @SQL
  11.  
  12. SET @tblname='Nuevatabla'
  13. SET @KEY = '2'
  14.  
  15. SET @SQL = @SELECT + quotename(@tblname) + @WHERE +  @KEY
  16. EXEC sp_executesql @SQL
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 24/05/2016, 14:54
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Problemas con query dinámica

Cuando ejecuto esa ese código (con las tablas respectivas) y la query retorna

Command(s) completed successfully.

Es lo que me pasaba en un principio, no muestra los datos solo que se ejecutó la query
  #10 (permalink)  
Antiguo 24/05/2016, 15:00
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: Problemas con query dinámica

Hazle un print a la variable @sql antes de ejecutarla para que veas que es lo que trae, quizas se te esta escapando algun valor :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 24/05/2016, 15:42
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Problemas con query dinámica

Si también lo hice, no muestra nada en la consola de resultados.

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. DECLARE @SELECT Nvarchar(MAX)
  3. DECLARE @WHERE Nvarchar(MAX)
  4. DECLARE @KEY Nvarchar(MAX)
  5. DECLARE @query Nvarchar(MAX)
  6. DECLARE @tblname Nvarchar(MAX)
  7.  
  8. SET @KEY = '1'
  9. SET @query= ' SELECT top 5 * FROM dbo.'
  10. --SET @WHERE= ' WHERE 1  = '
  11.  
  12. SET @tblname = 'PERSONAS'
  13. SET @SQL = @SELECT + quotename(@tblname)-- + @WHERE +  @KEY
  14. print @SQL
  15. EXEC sp_executesql @SQL
  16.  
  17. SET @tblname='TRANSACCION'
  18. SET @KEY = '1'
  19. SET @SQL = @SELECT + quotename(@tblname)-- + @WHERE +  @KEY
  20. EXEC sp_executesql @SQL


El resultado es

  #12 (permalink)  
Antiguo 24/05/2016, 15:46
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: Problemas con query dinámica

Error de dedo de mi lado....

Código SQL:
Ver original
  1. DECLARE @SQL nvarchar(MAX)
  2. DECLARE @SELECT Nvarchar(MAX)
  3. DECLARE @WHERE Nvarchar(MAX)
  4. DECLARE @KEY Nvarchar(MAX)
  5. DECLARE @query Nvarchar(MAX)
  6. DECLARE @tblname Nvarchar(MAX)
  7.  
  8. SET @KEY = '1'
  9. SET @SELECT= ' SELECT top 5 * FROM dbo.'
  10. --SET @WHERE= ' WHERE 1  = '
  11.  
  12. SET @tblname = 'PERSONAS'
  13. SET @SQL = @SELECT + quotename(@tblname)-- + @WHERE +  @KEY
  14. print @SQL
  15. EXEC sp_executesql @SQL
  16.  
  17. SET @tblname='TRANSACCION'
  18. SET @KEY = '1'
  19. SET @SQL = @SELECT + quotename(@tblname)-- + @WHERE +  @KEY
  20. EXEC sp_executesql @SQL

si te fijas no presenta nada porque la variable @select no estaba seteada......ahora prueba e imprime la consulta :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 25/05/2016, 07:12
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 12 años, 10 meses
Puntos: 15
Respuesta: Problemas con query dinámica

Error mio que también se me ha pasado xD

Muchas gracias ^^

Etiquetas: query, sql, tabla
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 07:32.