Parametrizar nombre tabla

09/01/2004 - 16:47 por Mario Barro | Informe spam
Hola a todos/as;

Es posible parametrizar el nombre de una tabla en un procedimiento
almacenado.
Es decir, hay muchas tablas con distinto nombre pero que tienen los mismos
campos y los correspondientes procedimientos para insertar datos.

El caso es que en cada procedimiento almacenado de insercción sólo cambia el
nombre de la tabla.
Se podría (o cómo) hacer algo como esto.

CREATE PROCEDURE pa_Insert_A
@Campo nchar(50),
@NameTable nchar(20)
AS
INSERT INTO @NameTable (Campo) VALUES (@NameTable)
GO


Es decir, pasar de alguna manera el nombre de la tabla de inserción.
¿Cómo se podría afrontar este tipo de cuestión?

Saludos
Mario Barro

Preguntas similare

Leer las respuestas

#6 Mario Barro
09/01/2004 - 19:20 | Informe spam
Esa forma que comentas, aunque solución, no es muy segura, porque te puede
provocar una inyección de código sql.

Mirando la sintaxis de la instrucción 'sp_executesql (la pego al final por
completar), he visto una forma más segura.

Con lo que podría quedar el ejemplo de la siguiente manera

*********************************************************
CREATE PROC Inser
@Table nvarchar(100),
@Campo1 int,
@Campo2 binary(100)

AS

DECLARE @str nvarchar(1000)
SET @str = N'Insert Into ' + @Table + ' (Campo1, Campo2) VALUES (@Campo1,
@Campo2)

EXEC sp_executesql @str, N'@Campo1 int, @Campo2 binary(100)' , @Campo1,
@Campo2

*********************************************************

Con lo que al menos transmitimos directamente a sp_executesql los valores de
los parámetros.

Te agradezco tu tiempo y ayuda.
Espero que ayude a otros también.

Saludos
Mario Barro.

-
Sintaxis
sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]

Argumentos
[@stmt =] stmt

Es una cadena Unicode que contiene una instrucción o proceso por lotes de
Transact-SQL. stmt debe ser una constante Unicode o una variable que pueda
convertirse implícitamente a ntext. No pueden utilizarse las expresiones
Unicode más complejas (por ejemplo, concatenar dos cadenas con el operador
+). Las constantes de caracteres no están permitidas. Si se especifica una
constante, debe ir precedida por la letra N. Por ejemplo, la constante
Unicode N'sp_who' es correcta, pero la constante de caracteres 'sp_who' no
lo es. El tamaño de la cadena sólo está limitado por la memoria disponible
en el servidor de bases de datos.

stmt puede contener parámetros que tengan la misma forma que un nombre de
variable como, por ejemplo:

N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'
Cada parámetro incluido en stmt debe tener sus correspondientes entradas en
la lista de definición de parámetros @params y en la lista de valores de
parámetros.

[@params =] N'@parameter_name data_type [,...n]'

Es una cadena que contiene las definiciones de todos los parámetros
incluidos en stmt. La cadena debe ser una constante Unicode o una variable
que pueda convertirse implícitamente a ntext. Cada definición de parámetro
consta de un nombre de parámetro y un tipo de datos. n es un marcador de
posición que indica que puede haber definiciones de parámetros adicionales.
Todos los parámetros especificados en stmt deben definirse en @params. Si la
instrucción o proceso por lotes de Transact-SQL indicada en el argumento
stmt no contiene parámetros, no es necesario especificar @params. El valor
predeterminado de este parámetro es NULL.

[@param1 =] 'value1'

Es un valor para el primer parámetro definido en la cadena de parámetros. El
valor puede ser una constante o una variable. Debe indicarse un valor para
cada parámetro incluido en stmt. Los valores no son necesarios cuando la
instrucción o proceso por lotes de Transact-SQL de stmt no tenga parámetros.

n

Es un marcador de posición para los valores de los parámetros adicionales.
Los valores sólo pueden ser constantes o variables. Los valores no pueden
ser expresiones más complejas, como funciones o expresiones generadas con
operadores.

-
-
Respuesta Responder a este mensaje
#7 Maximiliano Damian Accotto
09/01/2004 - 19:27 | Informe spam
Si señor es asi como usted dice, lo mio era solo un ejemplo nomas, de todas
formas ya al usar Sqldinamico se puede entrar en problemas no?

No es recomendado para nada usar esta tecnica pero hay veces que no hay otra

Salu2

Maximiliano Damian Accotto


"Mario Barro" escribió en el mensaje
news:ORfr$
Esa forma que comentas, aunque solución, no es muy segura, porque te


puede
provocar una inyección de código sql.

Mirando la sintaxis de la instrucción 'sp_executesql (la pego al final


por
completar), he visto una forma más segura.

Con lo que podría quedar el ejemplo de la siguiente manera

*********************************************************
CREATE PROC Inser
@Table nvarchar(100),
@Campo1 int,
@Campo2 binary(100)

AS

DECLARE @str nvarchar(1000)
SET @str = N'Insert Into ' + @Table + ' (Campo1, Campo2) VALUES (@Campo1,
@Campo2)

EXEC sp_executesql @str, N'@Campo1 int, @Campo2 binary(100)' , @Campo1,
@Campo2

*********************************************************

Con lo que al menos transmitimos directamente a sp_executesql los valores


de
los parámetros.

Te agradezco tu tiempo y ayuda.
Espero que ayude a otros también.

Saludos
Mario Barro.

Sintaxis
sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]

Argumentos
[@stmt =] stmt

Es una cadena Unicode que contiene una instrucción o proceso por lotes de
Transact-SQL. stmt debe ser una constante Unicode o una variable que pueda
convertirse implícitamente a ntext. No pueden utilizarse las expresiones
Unicode más complejas (por ejemplo, concatenar dos cadenas con el operador
+). Las constantes de caracteres no están permitidas. Si se especifica una
constante, debe ir precedida por la letra N. Por ejemplo, la constante
Unicode N'sp_who' es correcta, pero la constante de caracteres 'sp_who' no
lo es. El tamaño de la cadena sólo está limitado por la memoria disponible
en el servidor de bases de datos.

stmt puede contener parámetros que tengan la misma forma que un nombre de
variable como, por ejemplo:

N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'
Cada parámetro incluido en stmt debe tener sus correspondientes entradas


en
la lista de definición de parámetros @params y en la lista de valores de
parámetros.

[@params =] N'@parameter_name data_type [,...n]'

Es una cadena que contiene las definiciones de todos los parámetros
incluidos en stmt. La cadena debe ser una constante Unicode o una variable
que pueda convertirse implícitamente a ntext. Cada definición de parámetro
consta de un nombre de parámetro y un tipo de datos. n es un marcador de
posición que indica que puede haber definiciones de parámetros


adicionales.
Todos los parámetros especificados en stmt deben definirse en @params. Si


la
instrucción o proceso por lotes de Transact-SQL indicada en el argumento
stmt no contiene parámetros, no es necesario especificar @params. El valor
predeterminado de este parámetro es NULL.

[@param1 =] 'value1'

Es un valor para el primer parámetro definido en la cadena de parámetros.


El
valor puede ser una constante o una variable. Debe indicarse un valor para
cada parámetro incluido en stmt. Los valores no son necesarios cuando la
instrucción o proceso por lotes de Transact-SQL de stmt no tenga


parámetros.

n

Es un marcador de posición para los valores de los parámetros adicionales.
Los valores sólo pueden ser constantes o variables. Los valores no pueden
ser expresiones más complejas, como funciones o expresiones generadas con
operadores.

-


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