SQL Dinámico con USE

10/11/2006 - 23:38 por Rafa Vidal | Informe spam
Buenas noches:

¿Existe forma de hacer un USE de manera dinámica?

Debo hacer un USE que me permita realizar un SELECT de una tabla de la base
de datos.
Tanto @db como @table pueden ser variables.
El problema se produce al realizar el USE de manera dinámica.

DECLARE @db sysname
DECLARE @table sysname
DECLARE @sql nvarchar(4000)

USE master

SET @db = 'pubs'

SET @table = 'authors'

SELECT @sql = 'USE ' + @db
EXEC(@sql)

SELECT @sql = 'SELECT * FROM ' + @table
EXEC(@sql)

Produciendo el mensaje de error:
Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'authors' no es válido.

Recuerdos
Rafa Vidal

Preguntas similare

Leer las respuestas

#1 Isaias
10/11/2006 - 23:58 | Informe spam
Rafael

No es necesario el USE:

declare @SQLString NVARCHAR(100),
@db VARCHAR(15),
@table VARCHAR(15)

SET @db = 'master'
SET @table = 'SYSUSERS'
SET @SQLString = N'SELECT * FROM '+@db+'.dbo.'+@table
EXEC sp_executesql @SQLString
Saludos
IIslas


"Rafa Vidal" wrote:

Buenas noches:

¿Existe forma de hacer un USE de manera dinámica?

Debo hacer un USE que me permita realizar un SELECT de una tabla de la base
de datos.
Tanto @db como @table pueden ser variables.
El problema se produce al realizar el USE de manera dinámica.

DECLARE @db sysname
DECLARE @table sysname
DECLARE @sql nvarchar(4000)

USE master

SET @db = 'pubs'

SET @table = 'authors'

SELECT @sql = 'USE ' + @db
EXEC(@sql)

SELECT @sql = 'SELECT * FROM ' + @table
EXEC(@sql)

Produciendo el mensaje de error:
Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'authors' no es válido.

Recuerdos
Rafa Vidal



Respuesta Responder a este mensaje
#2 Rafa Vidal
11/11/2006 - 00:20 | Informe spam
Sí, Isaias la respuesta es correcta.

No puse un buen ejemplo...

Tengo que hacer el USE dinámico, obligatoriamente, porque después de él
tengo que crear la suscripción de extracción:

SELECT @sql = 'sp_addmergepullsubscription ' +
'@publication = ' + @publication + ', @publisher = [' + @publisher +
'], @publisher_db = ' + @publisher_db + ', ' +
'@subscriber_type = ' + @subscriber_type + ', ' +
'@description = [' + @description + ']'
EXEC(@sql)

SELECT @sql = 'sp_addmergepullsubscription_agent ' +
'@name = ' + @name + ', ' +
'@publication = ' + @publication + ', @publisher = [' + @publisher +
'], @publisher_db = ' + @publisher_db + ', ' +
'@publisher_security_mode = ' + CONVERT(NVARCHAR,
@publisher_security_mode) + ', @publisher_login = ' + @publisher_login + ',
@publisher_password = ' + @publisher_password + ', ' +
'@subscriber = ' + @subscriber + ', @subscriber_db = ' + @subscriber_db
+ ', ' +
'@subscriber_security_mode = ' + CONVERT(NVARCHAR,
@subscriber_security_mode) + ', ' +
'@distributor = [' + @distributor + '], ' +
'@distributor_security_mode = ' + CONVERT(NVARCHAR,
@distributor_security_mode) + ', @distributor_login = ' + @distributor_login
+ ', @distributor_password = ' + @distributor_password + ', ' +
'@frequency_type = ' + CONVERT(NVARCHAR, @frequency_type) + ', ' +
'@use_ftp = ' + @use_ftp
EXEC(@sql)

Recuerdos
Rafa Vidal


"Isaias" escribió en el mensaje
news:
Rafael

No es necesario el USE:

declare @SQLString NVARCHAR(100),
@db VARCHAR(15),
@table VARCHAR(15)

SET @db = 'master'
SET @table = 'SYSUSERS'
SET @SQLString = N'SELECT * FROM '+@db+'.dbo.'+@table
EXEC sp_executesql @SQLString
Saludos
IIslas


"Rafa Vidal" wrote:

Buenas noches:

¿Existe forma de hacer un USE de manera dinámica?

Debo hacer un USE que me permita realizar un SELECT de una tabla de la
base
de datos.
Tanto @db como @table pueden ser variables.
El problema se produce al realizar el USE de manera dinámica.

DECLARE @db sysname
DECLARE @table sysname
DECLARE @sql nvarchar(4000)

USE master

SET @db = 'pubs'

SET @table = 'authors'

SELECT @sql = 'USE ' + @db
EXEC(@sql)

SELECT @sql = 'SELECT * FROM ' + @table
EXEC(@sql)

Produciendo el mensaje de error:
Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'authors' no es válido.

Recuerdos
Rafa Vidal



Respuesta Responder a este mensaje
#3 BitOne®
11/11/2006 - 04:48 | Informe spam
Hola Rafa Vidal:

si, si puedes hacer use.

Esto lo puedes conseguir mediante sql dinamico.

Aqui te dejo el documento creo mas difundido sobre el tema de las ventajas y
desventajas.

http://www.hayes.ch/sql/sql_dinamico.html


Lo puedes conseguir mediante sp_executesql asi mismo como tambien con exec
en el peor de los casos

Ejemplo:


declare @sql nvarchar(256)

set @sql = 'use pubs select * from authors'
exec(@sql)


Claro este seria el metodo mas sencillo y el menos eficiente.


Aqui tu siguiente ejemplo, mas "eficiente" pero un tanto mas complejo
y peligroso para la inyeccion de sql, asi que coloca bien los tamanos de las
variables que vas
a utilizar y reduce la cantidad de variables.


use master --base actual
go
declare @sql nvarchar(500)
declare @base nvarchar(100)
declare @base1 nvarchar(100)
declare @parameter1 char(11)

set @base1 = 'pubs'
set @base = 'use ' + @base1
set @sql = n'select * from authors where au_id = @au_id'
set @sql = @base + char(13) + @sql
set @parameter1 = '172-32-1176'
exec sp_executesql @sql,
n'@au_id char(11)',
@parameter1

go

Saludos,

BitOne®
www.yocsql.com









"Rafa Vidal" wrote in message
news:
Sí, Isaias la respuesta es correcta.

No puse un buen ejemplo...

Tengo que hacer el USE dinámico, obligatoriamente, porque después de él
tengo que crear la suscripción de extracción:

SELECT @sql = 'sp_addmergepullsubscription ' +
'@publication = ' + @publication + ', @publisher = [' + @publisher +
'], @publisher_db = ' + @publisher_db + ', ' +
'@subscriber_type = ' + @subscriber_type + ', ' +
'@description = [' + @description + ']'
EXEC(@sql)

SELECT @sql = 'sp_addmergepullsubscription_agent ' +
'@name = ' + @name + ', ' +
'@publication = ' + @publication + ', @publisher = [' + @publisher +
'], @publisher_db = ' + @publisher_db + ', ' +
'@publisher_security_mode = ' + CONVERT(NVARCHAR,
@publisher_security_mode) + ', @publisher_login = ' + @publisher_login +


',
@publisher_password = ' + @publisher_password + ', ' +
'@subscriber = ' + @subscriber + ', @subscriber_db = ' +


@subscriber_db
+ ', ' +
'@subscriber_security_mode = ' + CONVERT(NVARCHAR,
@subscriber_security_mode) + ', ' +
'@distributor = [' + @distributor + '], ' +
'@distributor_security_mode = ' + CONVERT(NVARCHAR,
@distributor_security_mode) + ', @distributor_login = ' +


@distributor_login
+ ', @distributor_password = ' + @distributor_password + ', ' +
'@frequency_type = ' + CONVERT(NVARCHAR, @frequency_type) + ', ' +
'@use_ftp = ' + @use_ftp
EXEC(@sql)

Recuerdos
Rafa Vidal


"Isaias" escribió en el mensaje
news:
> Rafael
>
> No es necesario el USE:
>
> declare @SQLString NVARCHAR(100),
> @db VARCHAR(15),
> @table VARCHAR(15)
>
> SET @db = 'master'
> SET @table = 'SYSUSERS'
> SET @SQLString = N'SELECT * FROM '+@db+'.dbo.'+@table
> EXEC sp_executesql @SQLString
> Saludos
> IIslas
>
>
> "Rafa Vidal" wrote:
>
>> Buenas noches:
>>
>> ¿Existe forma de hacer un USE de manera dinámica?
>>
>> Debo hacer un USE que me permita realizar un SELECT de una tabla de la
>> base
>> de datos.
>> Tanto @db como @table pueden ser variables.
>> El problema se produce al realizar el USE de manera dinámica.
>>
>> DECLARE @db sysname
>> DECLARE @table sysname
>> DECLARE @sql nvarchar(4000)
>>
>> USE master
>>
>> SET @db = 'pubs'
>>
>> SET @table = 'authors'
>>
>> SELECT @sql = 'USE ' + @db
>> EXEC(@sql)
>>
>> SELECT @sql = 'SELECT * FROM ' + @table
>> EXEC(@sql)
>>
>> Produciendo el mensaje de error:
>> Servidor: mensaje 208, nivel 16, estado 1, línea 1
>> El nombre de objeto 'authors' no es válido.
>>
>> Recuerdos
>> Rafa Vidal
>>
>>
>>


Respuesta Responder a este mensaje
#4 Maxi
11/11/2006 - 15:55 | Informe spam
Hola, poder se puede con sql-dinamico (sp_executesql), ahora para hacer un
select a otra base de datos no es necesario hacer ningun USE, debes usar la
sentencia completa de ubicacion

por ej

select * from servidor.basededatos.owner.objeto


Saludos

[Microsoft MVP SQL Server]
www.sqlgurus.org
Buenos Aires - Argentina
"Rafa Vidal" wrote in message
news:
Buenas noches:

¿Existe forma de hacer un USE de manera dinámica?

Debo hacer un USE que me permita realizar un SELECT de una tabla de la
base de datos.
Tanto @db como @table pueden ser variables.
El problema se produce al realizar el USE de manera dinámica.

DECLARE @db sysname
DECLARE @table sysname
DECLARE @sql nvarchar(4000)

USE master

SET @db = 'pubs'

SET @table = 'authors'

SELECT @sql = 'USE ' + @db
EXEC(@sql)

SELECT @sql = 'SELECT * FROM ' + @table
EXEC(@sql)

Produciendo el mensaje de error:
Servidor: mensaje 208, nivel 16, estado 1, línea 1
El nombre de objeto 'authors' no es válido.

Recuerdos
Rafa Vidal

Respuesta Responder a este mensaje
#5 Rafa Vidal
13/11/2006 - 10:18 | Informe spam
Buenos días BitOne:

...y gracias.

El "truco" está en que hay que enviar el USE y la instrucción (SELECT,
INSERT, DELETE...) dentro de la misma ejecución.
Yo primero ejecutaba el USE y después el SELECT...

El documento que me has enviado, tiene una versión en inglés más
actualizado:
http://www.sommarskog.se/dynamic_sql.html

Gracias.

Recuerdos
Rafa Vidal


"BitOne®" escribió en el mensaje
news:%
Hola Rafa Vidal:

si, si puedes hacer use.

Esto lo puedes conseguir mediante sql dinamico.

Aqui te dejo el documento creo mas difundido sobre el tema de las ventajas
y
desventajas.

http://www.hayes.ch/sql/sql_dinamico.html


Lo puedes conseguir mediante sp_executesql asi mismo como tambien con exec
en el peor de los casos

Ejemplo:


declare @sql nvarchar(256)

set @sql = 'use pubs select * from authors'
exec(@sql)


Claro este seria el metodo mas sencillo y el menos eficiente.


Aqui tu siguiente ejemplo, mas "eficiente" pero un tanto mas complejo
y peligroso para la inyeccion de sql, asi que coloca bien los tamanos de
las
variables que vas
a utilizar y reduce la cantidad de variables.


use master --base actual
go
declare @sql nvarchar(500)
declare @base nvarchar(100)
declare @base1 nvarchar(100)
declare @parameter1 char(11)

set @base1 = 'pubs'
set @base = 'use ' + @base1
set @sql = n'select * from authors where au_id = @au_id'
set @sql = @base + char(13) + @sql
set @parameter1 = '172-32-1176'
exec sp_executesql @sql,
n'@au_id char(11)',
@parameter1

go

Saludos,

BitOne®
www.yocsql.com









"Rafa Vidal" wrote in message
news:
Sí, Isaias la respuesta es correcta.

No puse un buen ejemplo...

Tengo que hacer el USE dinámico, obligatoriamente, porque después de él
tengo que crear la suscripción de extracción:

SELECT @sql = 'sp_addmergepullsubscription ' +
'@publication = ' + @publication + ', @publisher = [' + @publisher +
'], @publisher_db = ' + @publisher_db + ', ' +
'@subscriber_type = ' + @subscriber_type + ', ' +
'@description = [' + @description + ']'
EXEC(@sql)

SELECT @sql = 'sp_addmergepullsubscription_agent ' +
'@name = ' + @name + ', ' +
'@publication = ' + @publication + ', @publisher = [' + @publisher +
'], @publisher_db = ' + @publisher_db + ', ' +
'@publisher_security_mode = ' + CONVERT(NVARCHAR,
@publisher_security_mode) + ', @publisher_login = ' + @publisher_login +


',
@publisher_password = ' + @publisher_password + ', ' +
'@subscriber = ' + @subscriber + ', @subscriber_db = ' +


@subscriber_db
+ ', ' +
'@subscriber_security_mode = ' + CONVERT(NVARCHAR,
@subscriber_security_mode) + ', ' +
'@distributor = [' + @distributor + '], ' +
'@distributor_security_mode = ' + CONVERT(NVARCHAR,
@distributor_security_mode) + ', @distributor_login = ' +


@distributor_login
+ ', @distributor_password = ' + @distributor_password + ', ' +
'@frequency_type = ' + CONVERT(NVARCHAR, @frequency_type) + ', ' +
'@use_ftp = ' + @use_ftp
EXEC(@sql)

Recuerdos
Rafa Vidal


"Isaias" escribió en el mensaje
news:
> Rafael
>
> No es necesario el USE:
>
> declare @SQLString NVARCHAR(100),
> @db VARCHAR(15),
> @table VARCHAR(15)
>
> SET @db = 'master'
> SET @table = 'SYSUSERS'
> SET @SQLString = N'SELECT * FROM '+@db+'.dbo.'+@table
> EXEC sp_executesql @SQLString
> Saludos
> IIslas
>
>
> "Rafa Vidal" wrote:
>
>> Buenas noches:
>>
>> ¿Existe forma de hacer un USE de manera dinámica?
>>
>> Debo hacer un USE que me permita realizar un SELECT de una tabla de la
>> base
>> de datos.
>> Tanto @db como @table pueden ser variables.
>> El problema se produce al realizar el USE de manera dinámica.
>>
>> DECLARE @db sysname
>> DECLARE @table sysname
>> DECLARE @sql nvarchar(4000)
>>
>> USE master
>>
>> SET @db = 'pubs'
>>
>> SET @table = 'authors'
>>
>> SELECT @sql = 'USE ' + @db
>> EXEC(@sql)
>>
>> SELECT @sql = 'SELECT * FROM ' + @table
>> EXEC(@sql)
>>
>> Produciendo el mensaje de error:
>> Servidor: mensaje 208, nivel 16, estado 1, línea 1
>> El nombre de objeto 'authors' no es válido.
>>
>> Recuerdos
>> Rafa Vidal
>>
>>
>>






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