Limitacion en CREATE PROCEDURE?

29/04/2005 - 13:38 por Schramm | Informe spam
Hola a todos,
alguien sabe la manera de utlizar una tabla como parametro en un
procedimiento?
algo así como:

CREATE PROCEDURE Pro
@Tabla VARCHAR(40)
AS
SELECT * FROM @Tabla

y ejecutarlo con:
EXEC Pro 'Tabla1'

Lo que pasa es que quiero ejecutar una serie de sentencias (todas iguales)
sobre diferentes tablas, y las sentencia de arriba no lo acepta. Hay algun
modo de hacerlo?

Gracias.

Preguntas similare

Leer las respuestas

#1 Maxi
29/04/2005 - 14:22 | Informe spam
Hola, la unica forma de hacerlo es con Sql-dinamico sp_executesql, pero
debes saber que no es una recomendacion mia y no creo que la sea de muchos
otros, queda a tu criterio el uso del mismo sabiendo los enormes riesgos que
puede tener el sql-dinamico.

Es mas, yo me preguntaria, para que hacer un sp's que sea variable con
sqldinamico? no hagas sp' s si pensas hacer asi las cosas, es preferible que
lo ejecutes desde aplicacion


Salu2
Maxi


"Schramm" escribió en el mensaje
news:d4t6bj$obb$
Hola a todos,
alguien sabe la manera de utlizar una tabla como parametro en un
procedimiento?
algo así como:

CREATE PROCEDURE Pro
@Tabla VARCHAR(40)
AS
SELECT * FROM @Tabla

y ejecutarlo con:
EXEC Pro 'Tabla1'

Lo que pasa es que quiero ejecutar una serie de sentencias (todas iguales)
sobre diferentes tablas, y las sentencia de arriba no lo acepta. Hay algun
modo de hacerlo?

Gracias.


Respuesta Responder a este mensaje
#2 Alejandro Mesa
29/04/2005 - 14:27 | Informe spam
SQL Server no acepta variables de tipo tabla como parametros de un
procedimiento almacenado. Una opcion seria usar sql dinamico, o sea, pasar el
nombre de la tabla como parametro y armar la sentencia de forma dinamica,
ejecutando esta sentencia usando EXEC(...) o el procedimineto almacenado
sp_executesql.

Ejemplo:

create procedure dbo.usp_proc1
@ts sysname = N'dbo',
@tn sysname
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'select c1, c2, c3 from ' + quotename(@ts) + N'.' + quotename(@tn)

exec sp_executesql @sql

return @@error
go

exec dbo.usp_proc1 @tn = N'tabla1'
exec dbo.usp_proc1 @tn = N'tabla2'
go

Aca te paso un link donde puedes leer sobre los pros y cons cuando usas sql
dinamico.

The Curse and Blessings of Dynamic SQL
http://www.sommarskog.se/dynamic_sql.html


AMB

"Schramm" wrote:

Hola a todos,
alguien sabe la manera de utlizar una tabla como parametro en un
procedimiento?
algo así como:

CREATE PROCEDURE Pro
@Tabla VARCHAR(40)
AS
SELECT * FROM @Tabla

y ejecutarlo con:
EXEC Pro 'Tabla1'

Lo que pasa es que quiero ejecutar una serie de sentencias (todas iguales)
sobre diferentes tablas, y las sentencia de arriba no lo acepta. Hay algun
modo de hacerlo?

Gracias.



Respuesta Responder a este mensaje
#3 Schramm
02/05/2005 - 17:59 | Informe spam
Muchas gracias por la contestación, ha resultado! Aunque no he entendido del
todo el código, lo investigaré.

Saludos!!
Sergio.


"Alejandro Mesa" escribió en el
mensaje news:
SQL Server no acepta variables de tipo tabla como parametros de un
procedimiento almacenado. Una opcion seria usar sql dinamico, o sea, pasar
el
nombre de la tabla como parametro y armar la sentencia de forma dinamica,
ejecutando esta sentencia usando EXEC(...) o el procedimineto almacenado
sp_executesql.

Ejemplo:

create procedure dbo.usp_proc1
@ts sysname = N'dbo',
@tn sysname
as
set nocount on

declare @sql nvarchar(4000)

set @sql = N'select c1, c2, c3 from ' + quotename(@ts) + N'.' +
quotename(@tn)

exec sp_executesql @sql

return @@error
go

exec dbo.usp_proc1 @tn = N'tabla1'
exec dbo.usp_proc1 @tn = N'tabla2'
go

Aca te paso un link donde puedes leer sobre los pros y cons cuando usas
sql
dinamico.

The Curse and Blessings of Dynamic SQL
http://www.sommarskog.se/dynamic_sql.html


AMB

"Schramm" wrote:

Hola a todos,
alguien sabe la manera de utlizar una tabla como parametro en un
procedimiento?
algo así como:

CREATE PROCEDURE Pro
@Tabla VARCHAR(40)
AS
SELECT * FROM @Tabla

y ejecutarlo con:
EXEC Pro 'Tabla1'

Lo que pasa es que quiero ejecutar una serie de sentencias (todas
iguales)
sobre diferentes tablas, y las sentencia de arriba no lo acepta. Hay
algun
modo de hacerlo?

Gracias.



Respuesta Responder a este mensaje
#4 Don Roque
02/05/2005 - 23:54 | Informe spam
En realidad, si queres evitar el tema del Query Dinamico, se me ocurre
lo siguiente:

(ojo... esta solucion es totalmente impracticable si vas a hacer esto
con tablas con muchos registros)

1) crea una vista. Ahi, pone un select de cada una de las tablas que
van a pasar por este proceso (si no tienen una estructura igual, lo que
podes hacer es completar los distintos SELECT con constantes) y
juntalos con un UNION. Ademas, agrega un campo mas, en donde hardcodees
el nombre de la tabla de donde estan saliendo los datos

2) create un USER DEFINED INLINE FUNCTION que lo que haga sea hacer un
SELECT sobre esa vista, filtrando por el nombre de tabla que reciba por
parametro

3) en tu SP, hace un SELECT de la inline function, a la que le pasas el
nombre de la tabla


Ejemplo:


use northwind
go

create table test1
(
campo1 varchar(10) null,
campo2 varchar(10) null
)
go

insert into test1 values ('Reg1', 'Reg1')
insert into test1 values ('Reg2', 'Reg2')
insert into test1 values ('Reg3', 'Reg3')

go


create table test2
(
campo1 varchar(10) null,
campo2 varchar(10) null,
campo3 varchar(10) null
)

go

insert into test2 values ('Reg1', 'Reg1', 'Reg1')
insert into test2 values ('Reg2', 'Reg2', 'Reg2')
insert into test2 values ('Reg3', 'Reg3', 'Reg3')

go

create view testview
as
select campo1, campo2, '' as campo3, 'test1' as tabla from test1
union all
select campo1, campo2, campo3, 'test2' as tabla from test2

go

CREATE FUNCTION fcn_test
(@tablename varchar(10))

RETURNS TABLE
AS
RETURN SELECT campo1, campo2, campo3 from testview where tabla @tablename

GO



select * from dbo.fcn_test('test1')
select * from dbo.fcn_test('test2')



Espero que te haya servido de algo!
Respuesta Responder a este mensaje
#5 Schramm
03/05/2005 - 09:49 | Informe spam
Hola Don Roque,
también me funciona, aunque creo un pelín engorroso tener que borrar y
volver a crear la vista cada vez que añado una tabla al procedimiento. En
todo caso la idea de la función me parece estupenda!

Gracias!!

"Don Roque" escribió en el mensaje
news:
En realidad, si queres evitar el tema del Query Dinamico, se me ocurre
lo siguiente:

(ojo... esta solucion es totalmente impracticable si vas a hacer esto
con tablas con muchos registros)

1) crea una vista. Ahi, pone un select de cada una de las tablas que
van a pasar por este proceso (si no tienen una estructura igual, lo que
podes hacer es completar los distintos SELECT con constantes) y
juntalos con un UNION. Ademas, agrega un campo mas, en donde hardcodees
el nombre de la tabla de donde estan saliendo los datos

2) create un USER DEFINED INLINE FUNCTION que lo que haga sea hacer un
SELECT sobre esa vista, filtrando por el nombre de tabla que reciba por
parametro

3) en tu SP, hace un SELECT de la inline function, a la que le pasas el
nombre de la tabla


Ejemplo:


use northwind
go

create table test1
(
campo1 varchar(10) null,
campo2 varchar(10) null
)
go

insert into test1 values ('Reg1', 'Reg1')
insert into test1 values ('Reg2', 'Reg2')
insert into test1 values ('Reg3', 'Reg3')

go


create table test2
(
campo1 varchar(10) null,
campo2 varchar(10) null,
campo3 varchar(10) null
)

go

insert into test2 values ('Reg1', 'Reg1', 'Reg1')
insert into test2 values ('Reg2', 'Reg2', 'Reg2')
insert into test2 values ('Reg3', 'Reg3', 'Reg3')

go

create view testview
as
select campo1, campo2, '' as campo3, 'test1' as tabla from test1
union all
select campo1, campo2, campo3, 'test2' as tabla from test2

go

CREATE FUNCTION fcn_test
(@tablename varchar(10))

RETURNS TABLE
AS
RETURN SELECT campo1, campo2, campo3 from testview where tabla > @tablename

GO



select * from dbo.fcn_test('test1')
select * from dbo.fcn_test('test2')



Espero que te haya servido de algo!

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida