cursor dinamico

14/07/2006 - 13:31 por MarcosQ | Informe spam
Hola,

Necesito acceder a una tabla de otra base de datos que se encuentra en el
mismo servidor. La consulta me devolverá una serie de registros, y para cada
registro hará un conjunto de operaciones complejas.
Para quiero hacer un cursor, pero el caso es que el nombre de la base de
datos me lo pasan por parámetro, o sea es dinámico y cambiará en cada
ejecución. Por ello, el cursor debe ser dinámico para hacer algo así
declare ... cursor local for
select @NombreBd + '.' + @Propietario + '.' + 'nombretabla' from

pero el caso es que no sé como hacer ésto dinámicamente.
¿Se puede hacer?
Si es así si alguien me puede indicar la sintaxis, sobre todo del fetch que
es lo que cambiaría con respecto a una sentencia select dinámica.
En caso contrario, ¿Existe una solución eficaz alternativa a este problema?

Gracias de antemano y saludos.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristán
14/07/2006 - 13:37 | Informe spam
Dependiendo de en qué consisten esas operaciones complejas, igual no
sería necesario usar ese cursor.

De todos modos, si el diseño de la tabla consultada es siempre igual
(que supongo que será así porque si no, el proceso sería todavía mucho más
complejo), siempre puedes insertar los datos en una tabla y base de datos
concreta y que lo que sea dinámico sea la sentencia 'INSERT INTO
tablaTemporal SELECT campo1, ... campoN FROM
<baseDatos>.<propietario>.<tablaOrigen>'

Entiendo también que las operaciones a realizar son siempre las
mismas...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"MarcosQ" escribió en el mensaje
news:
Hola,

Necesito acceder a una tabla de otra base de datos que se encuentra en el
mismo servidor. La consulta me devolverá una serie de registros, y para


cada
registro hará un conjunto de operaciones complejas.
Para quiero hacer un cursor, pero el caso es que el nombre de la base de
datos me lo pasan por parámetro, o sea es dinámico y cambiará en cada
ejecución. Por ello, el cursor debe ser dinámico para hacer algo así
declare ... cursor local for
select @NombreBd + '.' + @Propietario + '.' + 'nombretabla' from


pero el caso es que no sé como hacer ésto dinámicamente.
¿Se puede hacer?
Si es así si alguien me puede indicar la sintaxis, sobre todo del fetch


que
es lo que cambiaría con respecto a una sentencia select dinámica.
En caso contrario, ¿Existe una solución eficaz alternativa a este


problema?

Gracias de antemano y saludos.

Respuesta Responder a este mensaje
#2 MarcosQ
14/07/2006 - 14:01 | Informe spam
Las operaciones a realizar dependerán de los valores de ciertos campos
obtenidos en el cursor. Dependiendo de sus valores se realizarán unas cosas u
otras.

Pero bueno, lo que quería saber realmente es si se pueden hacer cursores
dinámicos o hay que recurrir a este tipo de triquiñuelas para estos casos.

"Carlos Sacristán" wrote:

Dependiendo de en qué consisten esas operaciones complejas, igual no
sería necesario usar ese cursor.

De todos modos, si el diseño de la tabla consultada es siempre igual
(que supongo que será así porque si no, el proceso sería todavía mucho más
complejo), siempre puedes insertar los datos en una tabla y base de datos
concreta y que lo que sea dinámico sea la sentencia 'INSERT INTO
tablaTemporal SELECT campo1, ... campoN FROM
<baseDatos>.<propietario>.<tablaOrigen>'

Entiendo también que las operaciones a realizar son siempre las
mismas...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"MarcosQ" escribió en el mensaje
news:
> Hola,
>
> Necesito acceder a una tabla de otra base de datos que se encuentra en el
> mismo servidor. La consulta me devolverá una serie de registros, y para
cada
> registro hará un conjunto de operaciones complejas.
> Para quiero hacer un cursor, pero el caso es que el nombre de la base de
> datos me lo pasan por parámetro, o sea es dinámico y cambiará en cada
> ejecución. Por ello, el cursor debe ser dinámico para hacer algo así
> declare ... cursor local for
> select @NombreBd + '.' + @Propietario + '.' + 'nombretabla' from
.
>
> pero el caso es que no sé como hacer ésto dinámicamente.
> ¿Se puede hacer?
> Si es así si alguien me puede indicar la sintaxis, sobre todo del fetch
que
> es lo que cambiaría con respecto a una sentencia select dinámica.
> En caso contrario, ¿Existe una solución eficaz alternativa a este
problema?
>
> Gracias de antemano y saludos.
>



Respuesta Responder a este mensaje
#3 Carlos Sacristán
14/07/2006 - 14:31 | Informe spam
Por poder se puede hacer, pero creo que el coste de hacerlo es tan
grande que merece la pena pensar en otras opciones. De hecho, este
comentario se podría aplicar a cada operación en la que se piensa usar un
cursor

De todos modos, si quieres ver un ejemplo de un cursor montado de forma
dinámica, echa un vistazo al procedimiento almacenado sp_MSforeachtable o
sp_MSforeachdb, en la base de datos master (si trabajas con SQL Server 2000)


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"MarcosQ" escribió en el mensaje
news:
Las operaciones a realizar dependerán de los valores de ciertos campos
obtenidos en el cursor. Dependiendo de sus valores se realizarán unas


cosas u
otras.

Pero bueno, lo que quería saber realmente es si se pueden hacer cursores
dinámicos o hay que recurrir a este tipo de triquiñuelas para estos casos.

"Carlos Sacristán" wrote:

> Dependiendo de en qué consisten esas operaciones complejas, igual no
> sería necesario usar ese cursor.
>
> De todos modos, si el diseño de la tabla consultada es siempre igual
> (que supongo que será así porque si no, el proceso sería todavía mucho


más
> complejo), siempre puedes insertar los datos en una tabla y base de


datos
> concreta y que lo que sea dinámico sea la sentencia 'INSERT INTO
> tablaTemporal SELECT campo1, ... campoN FROM
> <baseDatos>.<propietario>.<tablaOrigen>'
>
> Entiendo también que las operaciones a realizar son siempre las
> mismas...
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> "MarcosQ" escribió en el mensaje
> news:
> > Hola,
> >
> > Necesito acceder a una tabla de otra base de datos que se encuentra


en el
> > mismo servidor. La consulta me devolverá una serie de registros, y


para
> cada
> > registro hará un conjunto de operaciones complejas.
> > Para quiero hacer un cursor, pero el caso es que el nombre de la


base de
> > datos me lo pasan por parámetro, o sea es dinámico y cambiará en cada
> > ejecución. Por ello, el cursor debe ser dinámico para hacer algo así
> > declare ... cursor local for
> > select @NombreBd + '.' + @Propietario + '.' + 'nombretabla' from
> .
> >
> > pero el caso es que no sé como hacer ésto dinámicamente.
> > ¿Se puede hacer?
> > Si es así si alguien me puede indicar la sintaxis, sobre todo del


fetch
> que
> > es lo que cambiaría con respecto a una sentencia select dinámica.
> > En caso contrario, ¿Existe una solución eficaz alternativa a este
> problema?
> >
> > Gracias de antemano y saludos.
> >
>
>
>
Respuesta Responder a este mensaje
#4 Alejandro Mesa
14/07/2006 - 14:31 | Informe spam
MarcosQ,

Comparto la opinión de Carlos, debes tratar de buscar una solución orientada
a conjuntos antes de recurrir al uso de cursores (no te des por vencido),
pues estos traen mas problemas que que otra cosa.

Puedes usar SQL dinamico y en este creas un cursor usando "set", el cual
declararas como parametro en el procedimiento sp_executesql. Luego manipulas
el cursor desde codigo que hace la llamada al sql dinamico.

Ejemplo:


use northwind
go

declare @sql nvarchar(4000)
declare @c cursor
declare @db_name sysname

declare @emp_id char(9)
declare @fname varchar(20)
declare @lname varchar(30)

set @db_name = N'pubs'
set @sql = N'use [' + @db_name + N'];
set @c = cursor fast_forward read_only for select emp_id, fname, lname from
dbo.employee; open @c'

exec sp_executesql @sql, N'@c cursor output', @c output

if cursor_status('variable', '@c') = 1
begin
while 1 = 1
begin
fetch next from @c into @emp_id, @fname, @lname

if @@error != 0 or @@fetch_status != 0 break

select @emp_id, @fname, @lname
end

close @c
deallocate @c
end
go


Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"MarcosQ" wrote:

Hola,

Necesito acceder a una tabla de otra base de datos que se encuentra en el
mismo servidor. La consulta me devolverá una serie de registros, y para cada
registro hará un conjunto de operaciones complejas.
Para quiero hacer un cursor, pero el caso es que el nombre de la base de
datos me lo pasan por parámetro, o sea es dinámico y cambiará en cada
ejecución. Por ello, el cursor debe ser dinámico para hacer algo así
declare ... cursor local for
select @NombreBd + '.' + @Propietario + '.' + 'nombretabla' from

pero el caso es que no sé como hacer ésto dinámicamente.
¿Se puede hacer?
Si es así si alguien me puede indicar la sintaxis, sobre todo del fetch que
es lo que cambiaría con respecto a una sentencia select dinámica.
En caso contrario, ¿Existe una solución eficaz alternativa a este problema?

Gracias de antemano y saludos.

Respuesta Responder a este mensaje
#5 MarcosQ
14/07/2006 - 15:31 | Informe spam
Ok,
trataré de buscar una solución sin cursores. Sin embargo, al ser un proceso
de migración complejo que implica el tratamiento de la información para
pasarlo de una base de datos a otra, lo veo dificil. Sino usaré la solución
que me has dado.

Gracias y saludos.


"Alejandro Mesa" wrote:

MarcosQ,

Comparto la opinión de Carlos, debes tratar de buscar una solución orientada
a conjuntos antes de recurrir al uso de cursores (no te des por vencido),
pues estos traen mas problemas que que otra cosa.

Puedes usar SQL dinamico y en este creas un cursor usando "set", el cual
declararas como parametro en el procedimiento sp_executesql. Luego manipulas
el cursor desde codigo que hace la llamada al sql dinamico.

Ejemplo:


use northwind
go

declare @sql nvarchar(4000)
declare @c cursor
declare @db_name sysname

declare @emp_id char(9)
declare @fname varchar(20)
declare @lname varchar(30)

set @db_name = N'pubs'
set @sql = N'use [' + @db_name + N'];
set @c = cursor fast_forward read_only for select emp_id, fname, lname from
dbo.employee; open @c'

exec sp_executesql @sql, N'@c cursor output', @c output

if cursor_status('variable', '@c') = 1
begin
while 1 = 1
begin
fetch next from @c into @emp_id, @fname, @lname

if @@error != 0 or @@fetch_status != 0 break

select @emp_id, @fname, @lname
end

close @c
deallocate @c
end
go


Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"MarcosQ" wrote:

> Hola,
>
> Necesito acceder a una tabla de otra base de datos que se encuentra en el
> mismo servidor. La consulta me devolverá una serie de registros, y para cada
> registro hará un conjunto de operaciones complejas.
> Para quiero hacer un cursor, pero el caso es que el nombre de la base de
> datos me lo pasan por parámetro, o sea es dinámico y cambiará en cada
> ejecución. Por ello, el cursor debe ser dinámico para hacer algo así
> declare ... cursor local for
> select @NombreBd + '.' + @Propietario + '.' + 'nombretabla' from
>
> pero el caso es que no sé como hacer ésto dinámicamente.
> ¿Se puede hacer?
> Si es así si alguien me puede indicar la sintaxis, sobre todo del fetch que
> es lo que cambiaría con respecto a una sentencia select dinámica.
> En caso contrario, ¿Existe una solución eficaz alternativa a este problema?
>
> Gracias de antemano y saludos.
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida