Nombre de tabla como parámetro en un Procedimiento Almacenado (2009-01-28)

28/01/2009 - 10:32 por Mauricio | Informe spam
Hola a todos,
estoy intentando hacer un procedimiento almacenado que pueda ser
usado para distintas tablas, así que uno de los parámetros es el nombre
de la tabla a utilizar. Para eso hice lo siguiente:
CREATE PROCEDURE [dbo].[TreeRecords]
@IdRoot int,
@TableName nvarchar(50),
@FieldName nvarchar(50),
@ParentField nvarchar(50)
AS
SET NOCOUNT ON
CREATE TABLE #Tree(
LevelNumber smallint,
IdRecord int
PRIMARY KEY (LevelNumber, IdRecord)
)
INSERT INTO #Tree(LevelNumber, IdRecord)
SELECT 0, @IdRoot
FROM [@TableName]
WHERE @FieldName = @IdRoot

... sigue

El procedimiento es creado pero al querer ejecutarlo con
EXEC TreeRecords @IdRoot = 4, @TableName = N'MCS_CUSTOMERGROUPS',
@FieldName = N'CUSG_ID', @ParentField = N'CUSG_CUSG_ID' ;
GO
me da el siguiente error: Msg 208, Level 16, State 1, Procedure
TreeRecords, Line 13
Invalid object name '@TableName'.

Podrían orientarme cómo resolver esto?
Muchas gracias desde ya.

Mauricio
Copenhague, Dinamarca

Preguntas similare

Leer las respuestas

#1 Mauricio
28/01/2009 - 10:39 | Informe spam
Me contesto con algo que encontré en el help (debería haberlo leido
antes :( ).
"De manera predeterminada, los parámetros sólo pueden ocupar el lugar
de expresiones constantes; no se pueden utilizar en lugar de nombres de
tabla, nombres de columna o nombres de otros objetos de base de datos."
Ahora las pregunta son: se puede hacer lo que quiero? Cómo?
Gracias nuevamente.


Mauricio avait écrit le 28/01/2009 :
Hola a todos,
estoy intentando hacer un procedimiento almacenado que pueda ser usado
para distintas tablas, así que uno de los parámetros es el nombre de la tabla
a utilizar. Para eso hice lo siguiente:
CREATE PROCEDURE [dbo].[TreeRecords]
@IdRoot int,
@TableName nvarchar(50),
@FieldName nvarchar(50),
@ParentField nvarchar(50)
AS
SET NOCOUNT ON
CREATE TABLE #Tree(
LevelNumber smallint,
IdRecord int
PRIMARY KEY (LevelNumber, IdRecord)
)
INSERT INTO #Tree(LevelNumber, IdRecord)
SELECT 0, @IdRoot
FROM [@TableName]
WHERE @FieldName = @IdRoot

... sigue

El procedimiento es creado pero al querer ejecutarlo con
EXEC TreeRecords @IdRoot = 4, @TableName = N'MCS_CUSTOMERGROUPS', @FieldName
= N'CUSG_ID', @ParentField = N'CUSG_CUSG_ID' ;
GO
me da el siguiente error: Msg 208, Level 16, State 1, Procedure
TreeRecords, Line 13
Invalid object name '@TableName'.

Podrían orientarme cómo resolver esto?
Muchas gracias desde ya.



Mauricio
Copenhague, Dinamarca
Respuesta Responder a este mensaje
#2 Carlos Sacristan
28/01/2009 - 10:57 | Informe spam
No ganas nada haciendo ese tipo de cosas, excepto en la parte de creación de
los mismos. Merece la pena, si te importa el rendimiento (en realidad más
aspectos), hacer el "trabajo sucio" de crear un procedimiento por tabla.

En cualquier caso, si sigues queriendo hacer algo así, la única solución es
utilizar sql dinámico. Sin embargo, te recomiendo que leas el artículo
http://www.sommarskog.se/dynamic_sql.html que, aunque está en inglés, creo
que se entiende bastante bien.


Un saludo
-
www.navento.com
Servicios de Localización GPS


"Mauricio" wrote:

Hola a todos,
estoy intentando hacer un procedimiento almacenado que pueda ser
usado para distintas tablas, así que uno de los parámetros es el nombre
de la tabla a utilizar. Para eso hice lo siguiente:
CREATE PROCEDURE [dbo].[TreeRecords]
@IdRoot int,
@TableName nvarchar(50),
@FieldName nvarchar(50),
@ParentField nvarchar(50)
AS
SET NOCOUNT ON
CREATE TABLE #Tree(
LevelNumber smallint,
IdRecord int
PRIMARY KEY (LevelNumber, IdRecord)
)
INSERT INTO #Tree(LevelNumber, IdRecord)
SELECT 0, @IdRoot
FROM [@TableName]
WHERE @FieldName = @IdRoot

sigue

El procedimiento es creado pero al querer ejecutarlo con
EXEC TreeRecords @IdRoot = 4, @TableName = N'MCS_CUSTOMERGROUPS',
@FieldName = N'CUSG_ID', @ParentField = N'CUSG_CUSG_ID' ;
GO
me da el siguiente error: Msg 208, Level 16, State 1, Procedure
TreeRecords, Line 13
Invalid object name '@TableName'.

Podrían orientarme cómo resolver esto?
Muchas gracias desde ya.

Mauricio
Copenhague, Dinamarca



Respuesta Responder a este mensaje
#3 Mauricio
28/01/2009 - 11:21 | Informe spam
Gracias por la respuesta, Carlos.
Me gustaría, si tienes tiempo, que me des tu opinión de por qué no
ganaría nada haciendo este tipo de cosas (se me ocurre que sería más
sencillo el mantenimiento de solo 1 procedimiento almacenado en lugar
de varios).
Mientras tanto, leeré el artículo que me has pasado.
Nuevamente gracias.

Après mûre réflexion, Carlos Sacristan a écrit :
No ganas nada haciendo ese tipo de cosas, excepto en la parte de creación de
los mismos. Merece la pena, si te importa el rendimiento (en realidad más
aspectos), hacer el "trabajo sucio" de crear un procedimiento por tabla.

En cualquier caso, si sigues queriendo hacer algo así, la única solución es
utilizar sql dinámico. Sin embargo, te recomiendo que leas el artículo
http://www.sommarskog.se/dynamic_sql.html que, aunque está en inglés, creo
que se entiende bastante bien.


Un saludo
-
www.navento.com
Servicios de Localización GPS


"Mauricio" wrote:

Hola a todos,
estoy intentando hacer un procedimiento almacenado que pueda ser
usado para distintas tablas, así que uno de los parámetros es el nombre
de la tabla a utilizar. Para eso hice lo siguiente:
CREATE PROCEDURE [dbo].[TreeRecords]
@IdRoot int,
@TableName nvarchar(50),
@FieldName nvarchar(50),
@ParentField nvarchar(50)
AS
SET NOCOUNT ON
CREATE TABLE #Tree(
LevelNumber smallint,
IdRecord int
PRIMARY KEY (LevelNumber, IdRecord)
)
INSERT INTO #Tree(LevelNumber, IdRecord)
SELECT 0, @IdRoot
FROM [@TableName]
WHERE @FieldName = @IdRoot

sigue

El procedimiento es creado pero al querer ejecutarlo con
EXEC TreeRecords @IdRoot = 4, @TableName = N'MCS_CUSTOMERGROUPS',
@FieldName = N'CUSG_ID', @ParentField = N'CUSG_CUSG_ID' ;
GO
me da el siguiente error: Msg 208, Level 16, State 1, Procedure
TreeRecords, Line 13
Invalid object name '@TableName'.

Podrían orientarme cómo resolver esto?
Muchas gracias desde ya.

Mauricio
Copenhague, Dinamarca








Mauricio
Copenhague, Dinamarca
Respuesta Responder a este mensaje
#4 Carlos Sacristan
28/01/2009 - 11:37 | Informe spam
Me refiero a que lo único que se obtiene es que la creación del procedimiento
sea más sencillo y, sí, efectivamente sólo tienes un procedimiento que
"mantener". Sin embargo tienes efectos colaterales: rendimiento, seguridad
(muy bien explicados en el artículo que te pasé).

¿Qué es exactamente lo que obtienes teniendo un procedimiento genérico de
ese tipo? ¿En qué consiste ese "mantenimiento" del que hablas? En estos
casos, la ganancia es únicamente respecto del programador de base de datos,
no del servidor, y aunque este tipo de cosas hay que valorarlas
individualmente, en este caso creo que no ganas mucho y en contra tienes
varios aspectos negativos.

Un saludo
-
www.navento.com
Servicios de Localización GPS


"Mauricio" wrote:

Gracias por la respuesta, Carlos.
Me gustaría, si tienes tiempo, que me des tu opinión de por qué no
ganaría nada haciendo este tipo de cosas (se me ocurre que sería más
sencillo el mantenimiento de solo 1 procedimiento almacenado en lugar
de varios).
Mientras tanto, leeré el artículo que me has pasado.
Nuevamente gracias.
Respuesta Responder a este mensaje
#5 Mauricio
28/01/2009 - 11:51 | Informe spam
Entendido. Y es cierto que el artículo está muy bien explicado.
Seguiré tu consejo y haré distintos procedimientos almacenados.
Gracias nuevamente.

Carlos Sacristan a formulé ce Miércoles :
Me refiero a que lo único que se obtiene es que la creación del procedimiento
sea más sencillo y, sí, efectivamente sólo tienes un procedimiento que
"mantener". Sin embargo tienes efectos colaterales: rendimiento, seguridad
(muy bien explicados en el artículo que te pasé).

¿Qué es exactamente lo que obtienes teniendo un procedimiento genérico de
ese tipo? ¿En qué consiste ese "mantenimiento" del que hablas? En estos
casos, la ganancia es únicamente respecto del programador de base de datos,
no del servidor, y aunque este tipo de cosas hay que valorarlas
individualmente, en este caso creo que no ganas mucho y en contra tienes
varios aspectos negativos.

Un saludo
-
www.navento.com
Servicios de Localización GPS


"Mauricio" wrote:

Gracias por la respuesta, Carlos.
Me gustaría, si tienes tiempo, que me des tu opinión de por qué no
ganaría nada haciendo este tipo de cosas (se me ocurre que sería más
sencillo el mantenimiento de solo 1 procedimiento almacenado en lugar
de varios).
Mientras tanto, leeré el artículo que me has pasado.
Nuevamente gracias.





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