Procedimientos Almacenados, pasarle nombre Tabla

25/06/2004 - 10:24 por Alf | Informe spam
Tengo unas tablas en un base de datos. Pongamos por ejemplo:

TablaA
TablaB

son identicas tienen la misma estructura.

Un procedimiento almacenado realiza unas consultas sobre otras tablas y al
fina llena una tabla con una sería de datos.

¿Como le puedo pasar como parametro, que tabla ha de llenar?

Muchas gracias de antemano. Un saludo.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
25/06/2004 - 11:46 | Informe spam
La única forma es hacerlo a través de sql dinámico, pero desde luego en
tu caso no te lo recomiendo. La única ventaja que se saca de todo esto es
para el programador, no para el gestor de la base de datos. Es mucho mejor
poner un IF que inserte en una tabla o en otra, ejecutando una instrucción u
otra según el caso.


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Alf" escribió en el mensaje
news:
Tengo unas tablas en un base de datos. Pongamos por ejemplo:

TablaA
TablaB

son identicas tienen la misma estructura.

Un procedimiento almacenado realiza unas consultas sobre otras tablas y al
fina llena una tabla con una sería de datos.

¿Como le puedo pasar como parametro, que tabla ha de llenar?

Muchas gracias de antemano. Un saludo.









Respuesta Responder a este mensaje
#2 Isaías
25/06/2004 - 17:02 | Informe spam
Hola Carlos

Como siempre, es un placer leer tus recomendaciones, he
leido en mas de una ocasion NO UTILIZAR QUERY's DINAMICOS.

¿Como hacer una busqueda de un catalogo de CLIENTE?, si el
usuario tiene opciones de busqueda por:

NOMBRE+APATERNO
CODIGO POSTAL
COLONIA
POBLACION
CIUDAD

En mi caso, recibo estos parametros (que algunos pueden
ser null), verifico que parametro es mayor en su LEN y
ejecuto la estructura en un query dinamico

DECLARE @SQLString NVARCHAR(300), @MyWHERE NVARCHAR(100)

SET @SQLString = N'SELECT ..DATOS DEL CLIENTE FROM
CLIENTE '

IF LEN(NOMBRE+APATERNO)> 0
BEGIN
SET @NOMBRE = '%'+@NOMBRE+'%'
SET @PATERNO = '%'+@PATERNO+'%'
SET @MyWHERE = N'WHERE NOMBRE LIKE '+@NOMBRE+' AND
PATERNO LIKE '+@PATERNO
END

IF LEN(@CODIGO_POSTAL) > 0
SET @MyWHERE = N'WHERE CODIGO_POSTAL = '+ @CODIGO_POSTAL

...Demas instrucciones.

SET @SQLString = @SQLString+@MyWHERE
EXEC sp_executesql @SQLString


Alguna sugerencia o comentario.

Gracias.
Respuesta Responder a este mensaje
#3 Javier Loria
26/06/2004 - 17:00 | Informe spam
Hola:
Si Carlos me permite, mis comentarios.
Antes de discutir Queries Dinamicos debes replantearte para que
necesitas Procedimientos Almacenados?. Las razones mas importante son:
Seguridad y Desempeno (hay otras). Las consultas dinamicas atentan contra
ambos objetivos, porque requieren otorgar permisos sobre los objetos que se
usan y porque no reutilizan sus planes de ejecucion como el resto de los
procedimientos, sin contar con otros problemas.
Algunas alternativas:
a) Construir en el Cliente la Sintaxis de SQL. Con frecuencia en la
actualidad los usuarios requieren permisos de SELECT sobre las tablas para
usar herramientas como Tablas Pivote de Excel, Reportes de Crystal/
Reporting Services, y otros. Es mejor dar permisos sobre la tabla y en el
cliente construir el SELECT.
b) Construir un Procedimiento para cada tipo de Consulta. Ideal cuando
la cantidad de filtros son pocos y conocidos. La mas segura y rapida pero no
siempre posible.
c) Usar una forma:
== SELECT ...
FROM Cliente
WHERE
(CASE WHEN LEN(@Nombre+@APaterno)=0
THEN 1
WHEN Nombre LIKE @Nombre
AND APaterno LIKE @APaterno
THEN 1
ELSE 0 END=1)
AND
(CASE WHEN LEN(@Codigo_Postal)=0
THEN 1
WHEN Codigo_Postal LIKE @Codigo_Postal
THEN 1
ELSE 0 END=1)
AND -- Otros Filtros
.
Esta forma es posible usarla cuando la tabla no tiene demasiadas
filas. Porque no es eficiente en el uso de indices.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Isaías escribio:
Hola Carlos

Como siempre, es un placer leer tus recomendaciones, he
leido en mas de una ocasion NO UTILIZAR QUERY's DINAMICOS.

¿Como hacer una busqueda de un catalogo de CLIENTE?, si el
usuario tiene opciones de busqueda por:

NOMBRE+APATERNO
CODIGO POSTAL
COLONIA
POBLACION
CIUDAD

En mi caso, recibo estos parametros (que algunos pueden
ser null), verifico que parametro es mayor en su LEN y
ejecuto la estructura en un query dinamico

DECLARE @SQLString NVARCHAR(300), @MyWHERE NVARCHAR(100)

SET @SQLString = N'SELECT ..DATOS DEL CLIENTE FROM
CLIENTE '

IF LEN(NOMBRE+APATERNO)> 0
BEGIN
SET @NOMBRE = '%'+@NOMBRE+'%'
SET @PATERNO = '%'+@PATERNO+'%'
SET @MyWHERE = N'WHERE NOMBRE LIKE '+@NOMBRE+' AND
PATERNO LIKE '+@PATERNO
END

IF LEN(@CODIGO_POSTAL) > 0
SET @MyWHERE = N'WHERE CODIGO_POSTAL = '+ @CODIGO_POSTAL

...Demas instrucciones.

SET @SQLString = @SQLString+@MyWHERE
EXEC sp_executesql @SQLString


Alguna sugerencia o comentario.

Gracias.
Respuesta Responder a este mensaje
#4 MAXI
26/06/2004 - 18:39 | Informe spam
Hola, primero quiero decir que estoy totalmente de acuerdo con el amigo
Javier :-), si usas SqlDinamico estas atentando contra el espiritu de lo que
es un SP.

No deben tratar de reducirle trabajo al programador sino al Sql y que ademas
sea seguro, muy seguro!!

Por lo cual tienes las alternativas que te comento Javier, a mi
particularmente cuando hago estas cosas a una misma tabla las hago asi:

CREATE PROC PEPITO @ID CHAR(10),@NOMBRE CHAR(20) AS
IF LEN(@ID) = 0
BEGIN
@ID ='%'
END

IF LEN(@NOMBRE)=0
BEGIN
@NOMBRE = '%'
END

SELECT CAMPOS FROM TABLA WHERE
ID LIKE @ID AND NOMBRE LIKE @NOMBRE

=
Tengo 2 SP, uno para los AND y otro para los OR.

Bye




Maxi

Buenos Aires - Argentina

Desarrollador .NET 3 Estrellas

Mail: Maxi_accotto[arroba]speedy.com.ar

MSN:


"Alf" escribió en el mensaje
news:
Tengo unas tablas en un base de datos. Pongamos por ejemplo:

TablaA
TablaB

son identicas tienen la misma estructura.

Un procedimiento almacenado realiza unas consultas sobre otras tablas y al
fina llena una tabla con una sería de datos.

¿Como le puedo pasar como parametro, que tabla ha de llenar?

Muchas gracias de antemano. Un saludo.









Respuesta Responder a este mensaje
#5 Carlos Sacristan
28/06/2004 - 08:39 | Informe spam
¿Permiso a mí? Javier, creo que te lo has ganado más que merecidamente.
No hay respueta tuya en la que no se aprenda algo ;-)


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Javier Loria" escribió en el mensaje
news:#
Hola:
Si Carlos me permite, mis comentarios.
Antes de discutir Queries Dinamicos debes replantearte para que
necesitas Procedimientos Almacenados?. Las razones mas importante son:
Seguridad y Desempeno (hay otras). Las consultas dinamicas atentan contra
ambos objetivos, porque requieren otorgar permisos sobre los objetos que


se
usan y porque no reutilizan sus planes de ejecucion como el resto de los
procedimientos, sin contar con otros problemas.
Algunas alternativas:
a) Construir en el Cliente la Sintaxis de SQL. Con frecuencia en la
actualidad los usuarios requieren permisos de SELECT sobre las tablas para
usar herramientas como Tablas Pivote de Excel, Reportes de Crystal/
Reporting Services, y otros. Es mejor dar permisos sobre la tabla y en el
cliente construir el SELECT.
b) Construir un Procedimiento para cada tipo de Consulta. Ideal cuando
la cantidad de filtros son pocos y conocidos. La mas segura y rapida pero


no
siempre posible.
c) Usar una forma:
==> SELECT ...
FROM Cliente
WHERE
(CASE WHEN LEN(@Nombre+@APaterno)=0
THEN 1
WHEN Nombre LIKE @Nombre
AND APaterno LIKE @APaterno
THEN 1
ELSE 0 END=1)
AND
(CASE WHEN LEN(@Codigo_Postal)=0
THEN 1
WHEN Codigo_Postal LIKE @Codigo_Postal
THEN 1
ELSE 0 END=1)
AND -- Otros Filtros
.
Esta forma es posible usarla cuando la tabla no tiene demasiadas
filas. Porque no es eficiente en el uso de indices.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Isaías escribio:
> Hola Carlos
>
> Como siempre, es un placer leer tus recomendaciones, he
> leido en mas de una ocasion NO UTILIZAR QUERY's DINAMICOS.
>
> ¿Como hacer una busqueda de un catalogo de CLIENTE?, si el
> usuario tiene opciones de busqueda por:
>
> NOMBRE+APATERNO
> CODIGO POSTAL
> COLONIA
> POBLACION
> CIUDAD
>
> En mi caso, recibo estos parametros (que algunos pueden
> ser null), verifico que parametro es mayor en su LEN y
> ejecuto la estructura en un query dinamico
>
> DECLARE @SQLString NVARCHAR(300), @MyWHERE NVARCHAR(100)
>
> SET @SQLString = N'SELECT ..DATOS DEL CLIENTE FROM
> CLIENTE '
>
> IF LEN(NOMBRE+APATERNO)> 0
> BEGIN
> SET @NOMBRE = '%'+@NOMBRE+'%'
> SET @PATERNO = '%'+@PATERNO+'%'
> SET @MyWHERE = N'WHERE NOMBRE LIKE '+@NOMBRE+' AND
> PATERNO LIKE '+@PATERNO
> END
>
> IF LEN(@CODIGO_POSTAL) > 0
> SET @MyWHERE = N'WHERE CODIGO_POSTAL = '+ @CODIGO_POSTAL
>
> ...Demas instrucciones.
>
> SET @SQLString = @SQLString+@MyWHERE
> EXEC sp_executesql @SQLString
>
>
> Alguna sugerencia o comentario.
>
> Gracias.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida