SQL Dinámico

03/02/2005 - 15:46 por Diego Uribe | Informe spam
Hola todos

He encontrado una pregunta interesante
Alguien sabe como se hace para manejar queries dinamicos sin necesidad de
utilizar exec...¿?

Resulta que tenmos una tabla "datos" que guarda cualquier dato: "texto1,
texto2, texto3, numero1, numero2, numero3"... etc...
y necesitamos hacer una funcion con 3 parámetros: "campo", "valor_campo" y
"llave de la tabla datos" y cuando la invocamos extrae el dato de la tabla y
lo retorna en un varchar.

Básicamente seria algo asi como:

Declare @campo varchar(10)
Declare @valor varchar(100)
Declare @ID numeric(10)

Set @campo = 'texto1'
Set @valor = 'fulano perez'
Set @ID = 1100

Select @campo from datos where campoID = @ID

Si alguien sabe como hacer esto, por fa de ser posible sin ejecutar
"exec" ya que no esta permitido su uso en las funciones

Muchas gracias

Diego Uribe

Preguntas similare

Leer las respuestas

#1 Ivan Pascual
03/02/2005 - 16:12 | Informe spam
Segun mi experiencia...
Ese tipo de consultas creo que no se pueden hacer sin Sql Dinamico.
Se debe utilizar el EXEC... a pesar que me comentaron en este foro que no es
muy aconsejable...
Así que creo que no te queda otra... que usarlo


Ivan Pascual
Respuesta Responder a este mensaje
#2 Maxi
03/02/2005 - 16:21 | Informe spam
Hola Diego, no tenes otra forma que hacerlo con EXEC o sp_executesql, de
todas maneras el uso de SqlDinamico no es para nada recomendado ya que tiene
muchas amenazas y problemas


Salu2
Maxi


"Diego Uribe" escribió en el mensaje
news:
Hola todos

He encontrado una pregunta interesante
Alguien sabe como se hace para manejar queries dinamicos sin necesidad de
utilizar exec...¿?

Resulta que tenmos una tabla "datos" que guarda cualquier dato: "texto1,
texto2, texto3, numero1, numero2, numero3"... etc...
y necesitamos hacer una funcion con 3 parámetros: "campo", "valor_campo" y
"llave de la tabla datos" y cuando la invocamos extrae el dato de la tabla
y
lo retorna en un varchar.

Básicamente seria algo asi como:

Declare @campo varchar(10)
Declare @valor varchar(100)
Declare @ID numeric(10)

Set @campo = 'texto1'
Set @valor = 'fulano perez'
Set @ID = 1100

Select @campo from datos where campoID = @ID

Si alguien sabe como hacer esto, por fa de ser posible sin ejecutar
"exec" ya que no esta permitido su uso en las funciones

Muchas gracias

Diego Uribe


Respuesta Responder a este mensaje
#3 Alejandro Mesa
03/02/2005 - 16:29 | Informe spam
Diego,

Asi tan facil no. No se puede pasar el nombre de una columna como valor the
una variable que es referenciada en una sentencia select, esa parte debes
generarla dinamicamente.

Ejemplo:

use northwind
go

create table t (
colA int not null identity(1, 1) primary key,
colB int not null default (0),
colC varchar(25) not null default ('desconocido'),
colD money not null default (0),
colE datetime default(getdate())
)
go

declare @sql nvarchar(4000)
declare @cn sysname
declare @id int
declare @result varchar(25)

set nocount on

insert into t default values
insert into t default values
insert into t default values

update t set colC = 'cien', colD = 100 where colA = 3

set nocount off

set @id = 1
set @cn = N'convert(varchar(25), colB)'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int', @result
output, @id

print @result

set @id = 2
set @cn = N'convert(varchar(25), colE, 126)'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int', @result
output, @id

print @result

set @id = 3
set @cn = N'colC'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int', @result
output, @id

print @result

set @cn = N'convert(varchar(25), colD)'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int', @result
output, @id

print @result
go

drop table t
go


Debes saber que cuando generas sentencias dinamicamente, las cuales debes
executar usando EXEC o SP_EXECUTEQL, te expones a una serie de factores
negativos como seguridad, etc. Adjunto el link a una pagina web que tiene un
magnifico articulo (siento que esta en ingles) escrito por un SQL Server MVP,
ojala les sirva.

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


AMB

"Diego Uribe" wrote:

Hola todos

He encontrado una pregunta interesante
Alguien sabe como se hace para manejar queries dinamicos sin necesidad de
utilizar exec...¿?

Resulta que tenmos una tabla "datos" que guarda cualquier dato: "texto1,
texto2, texto3, numero1, numero2, numero3"... etc...
y necesitamos hacer una funcion con 3 parámetros: "campo", "valor_campo" y
"llave de la tabla datos" y cuando la invocamos extrae el dato de la tabla y
lo retorna en un varchar.

Básicamente seria algo asi como:

Declare @campo varchar(10)
Declare @valor varchar(100)
Declare @ID numeric(10)

Set @campo = 'texto1'
Set @valor = 'fulano perez'
Set @ID = 1100

Select @campo from datos where campoID = @ID

Si alguien sabe como hacer esto, por fa de ser posible sin ejecutar
"exec" ya que no esta permitido su uso en las funciones

Muchas gracias

Diego Uribe



Respuesta Responder a este mensaje
#4 Diego Uribe
04/02/2005 - 19:26 | Informe spam
Muchas gracias

"Alejandro Mesa" escribió en el
mensaje news:
Diego,

Asi tan facil no. No se puede pasar el nombre de una columna como valor


the
una variable que es referenciada en una sentencia select, esa parte debes
generarla dinamicamente.

Ejemplo:

use northwind
go

create table t (
colA int not null identity(1, 1) primary key,
colB int not null default (0),
colC varchar(25) not null default ('desconocido'),
colD money not null default (0),
colE datetime default(getdate())
)
go

declare @sql nvarchar(4000)
declare @cn sysname
declare @id int
declare @result varchar(25)

set nocount on

insert into t default values
insert into t default values
insert into t default values

update t set colC = 'cien', colD = 100 where colA = 3

set nocount off

set @id = 1
set @cn = N'convert(varchar(25), colB)'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int',


@result
output, @id

print @result

set @id = 2
set @cn = N'convert(varchar(25), colE, 126)'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int',


@result
output, @id

print @result

set @id = 3
set @cn = N'colC'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int',


@result
output, @id

print @result

set @cn = N'convert(varchar(25), colD)'
set @sql = N'select @result = ' + @cn + N' from t where colA = @id'

execute sp_executesql @sql, N'@result varchar(25) output, @id int',


@result
output, @id

print @result
go

drop table t
go


Debes saber que cuando generas sentencias dinamicamente, las cuales debes
executar usando EXEC o SP_EXECUTEQL, te expones a una serie de factores
negativos como seguridad, etc. Adjunto el link a una pagina web que tiene


un
magnifico articulo (siento que esta en ingles) escrito por un SQL Server


MVP,
ojala les sirva.

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


AMB

"Diego Uribe" wrote:

> Hola todos
>
> He encontrado una pregunta interesante
> Alguien sabe como se hace para manejar queries dinamicos sin necesidad


de
> utilizar exec...¿?
>
> Resulta que tenmos una tabla "datos" que guarda cualquier dato: "texto1,
> texto2, texto3, numero1, numero2, numero3"... etc...
> y necesitamos hacer una funcion con 3 parámetros: "campo", "valor_campo"


y
> "llave de la tabla datos" y cuando la invocamos extrae el dato de la


tabla y
> lo retorna en un varchar.
>
> Básicamente seria algo asi como:
>
> Declare @campo varchar(10)
> Declare @valor varchar(100)
> Declare @ID numeric(10)
>
> Set @campo = 'texto1'
> Set @valor = 'fulano perez'
> Set @ID = 1100
>
> Select @campo from datos where campoID = @ID
>
> Si alguien sabe como hacer esto, por fa de ser posible sin ejecutar
> "exec" ya que no esta permitido su uso en las funciones
>
> Muchas gracias
>
> Diego Uribe
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida