pasar parametro de varchar a instrucción sql - ¿es posible?

31/12/2003 - 10:53 por Raúl Martín | Informe spam
Lo que quisiera hacer si es posible es algo asi:

CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @DeSTRINGaLOQUESEA Tipo
set @DeSTRINGaLOQUESEA = CONVERT(ComoSea, @Tabla)

BEGIN
SELECT * FROM' @DeSTRINGaLOQUESEA
END

GO

en vez de:
CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @strSQL varchar(8000)

BEGIN
SET @strSQL ='SELECT * FROM '+ @Tabla
END

exec(@strSQL)
GO

es que si lo tengo que pasar todo a cadena va a ser un follón porque tendria
que cambiar todos mis procedimientos pues realmente no es un parametro que
tiene el nombre de una tabla sino que es parte del nombre de una tabla. O
sea seria algo asi como que el parametro tendria valores como 'francia',
'portugal', 'italia' y se concatenaria con el nombre parcial 'proveedores'
para llamar a la tabla franciaproveedores, portugalproveedores,
italiaproveedores. Se que no está normalizado pero al ser un sql-server
compartido y necesitar varias bases de datos, la unica opción barata y
"sencilla" de reprogramar mi aplicación y base de datos es duplicar las
tablas pues normalizar las tablas con un campo 'pais' seria mucho mas
trabajo.

Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Maximiliano Damian Accotto
31/12/2003 - 13:42 | Informe spam
Raul,

Sql no admite ese tipo de parametros que vos estas pidiendo, por eso el uso
del Sqldinamico.

Por ahora no hay una solucion, no se en futuras versiones ;-).

Salu2

Maximiliano Damian Accotto


"Raúl Martín" escribió en el mensaje
news:
Lo que quisiera hacer si es posible es algo asi:

CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @DeSTRINGaLOQUESEA Tipo
set @DeSTRINGaLOQUESEA = CONVERT(ComoSea, @Tabla)

BEGIN
SELECT * FROM' @DeSTRINGaLOQUESEA
END

GO

en vez de:
CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @strSQL varchar(8000)

BEGIN
SET @strSQL ='SELECT * FROM '+ @Tabla
END

exec(@strSQL)
GO

es que si lo tengo que pasar todo a cadena va a ser un follón porque


tendria
que cambiar todos mis procedimientos pues realmente no es un parametro que
tiene el nombre de una tabla sino que es parte del nombre de una tabla. O
sea seria algo asi como que el parametro tendria valores como 'francia',
'portugal', 'italia' y se concatenaria con el nombre parcial 'proveedores'
para llamar a la tabla franciaproveedores, portugalproveedores,
italiaproveedores. Se que no está normalizado pero al ser un sql-server
compartido y necesitar varias bases de datos, la unica opción barata y
"sencilla" de reprogramar mi aplicación y base de datos es duplicar las
tablas pues normalizar las tablas con un campo 'pais' seria mucho mas
trabajo.

Gracias de antemano


Respuesta Responder a este mensaje
#2 Miguel Egea
31/12/2003 - 18:32 | Informe spam
yo no haría ningunba de las dos cosas, tienes que pasar los parámetros de
selección, y si lo haces tienes que contruirlos de forma dinámica, eso hará
que no se reaproveche el plan de ejecución por lo que el resultado será
igual o peor que lanzar las consultas directamente desde tu app. En resumen
no tiene ninguna ventaja. Además tiene un problema más o menos serio de
inyección de codigo, en tu caso solo admites 15 caracteres y queda
ligeramente minimizado pero en general es mala idea. Esta es al menos mi
opinión. Adjunto un ejemplo de lo que digo.
use northwind
go
create proc SelectInocente(@tabla sysname)
as
begin
exec('Select * from '+@tabla)
end
go
exec selectInocente '[Order details]'
go
begin tran
exec selectInocente '[Order details] where 1=0 delete from [order details]'
select * from [order details]
rollback


=Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.
Brigada Anti-Cursores
Aviso de Seguridad
http://www.microsoft.com/spain/tech...9-USER.asp
==
"Raúl Martín" escribió en el mensaje
news:
Lo que quisiera hacer si es posible es algo asi:

CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @DeSTRINGaLOQUESEA Tipo
set @DeSTRINGaLOQUESEA = CONVERT(ComoSea, @Tabla)

BEGIN
SELECT * FROM' @DeSTRINGaLOQUESEA
END

GO

en vez de:
CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @strSQL varchar(8000)

BEGIN
SET @strSQL ='SELECT * FROM '+ @Tabla
END

exec(@strSQL)
GO

es que si lo tengo que pasar todo a cadena va a ser un follón porque


tendria
que cambiar todos mis procedimientos pues realmente no es un parametro que
tiene el nombre de una tabla sino que es parte del nombre de una tabla. O
sea seria algo asi como que el parametro tendria valores como 'francia',
'portugal', 'italia' y se concatenaria con el nombre parcial 'proveedores'
para llamar a la tabla franciaproveedores, portugalproveedores,
italiaproveedores. Se que no está normalizado pero al ser un sql-server
compartido y necesitar varias bases de datos, la unica opción barata y
"sencilla" de reprogramar mi aplicación y base de datos es duplicar las
tablas pues normalizar las tablas con un campo 'pais' seria mucho mas
trabajo.

Gracias de antemano


Respuesta Responder a este mensaje
#3 Eladio Rincón
01/01/2004 - 12:14 | Informe spam
Hola,

si el nombre de la tabla es una variable, deberías utilizar la funcion QUOTENAME;
si le pasas como nombre de tabla 'Orders', quotename, te convertirá 'Orders' en '[Orders]'; de esta forma ya no tienes problemas de injection:


declare @s varchar(100), @tabla varchar(100)

set @tabla = 'Order details where 1=0 delete from order details'
set @s = 'select OrderId from ' + quotename ( @tabla )
select @s

resultado
-
'select OrderId from [Order details where 1=0 delete from order details]'


declare @s varchar(100), @tabla varchar(100)

set @tabla = 'Order details'
set @s = 'select OrderId from ' + quotename ( @tabla )
select @s

resultado
-
select OrderId from [Order details]


Eladio Rincón
SQL Server MVP
http://www.siquelnet.com


"Comparte lo que sabes, aprende lo que no sepas." FGG

"Raúl Martín" escribió en el mensaje news:
Lo que quisiera hacer si es posible es algo asi:

CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @DeSTRINGaLOQUESEA Tipo
set @DeSTRINGaLOQUESEA = CONVERT(ComoSea, @Tabla)

BEGIN
SELECT * FROM' @DeSTRINGaLOQUESEA
END

GO

en vez de:
CREATE PROCEDURE [miprocedimiento]
@Tabla [nvarchar](15)
AS
DECLARE @strSQL varchar(8000)

BEGIN
SET @strSQL ='SELECT * FROM '+ @Tabla
END

exec(@strSQL)
GO

es que si lo tengo que pasar todo a cadena va a ser un follón porque tendria
que cambiar todos mis procedimientos pues realmente no es un parametro que
tiene el nombre de una tabla sino que es parte del nombre de una tabla. O
sea seria algo asi como que el parametro tendria valores como 'francia',
'portugal', 'italia' y se concatenaria con el nombre parcial 'proveedores'
para llamar a la tabla franciaproveedores, portugalproveedores,
italiaproveedores. Se que no está normalizado pero al ser un sql-server
compartido y necesitar varias bases de datos, la unica opción barata y
"sencilla" de reprogramar mi aplicación y base de datos es duplicar las
tablas pues normalizar las tablas con un campo 'pais' seria mucho mas
trabajo.

Gracias de antemano


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