sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo puedo hacer algo como:USAR @databaseName

Tendría que usar SQL dinámico si quiere hacerlo dinámicamente así. Significaría cualquier cosa que desee ejecutar en el contexto de esa base de datos, también deberá incluirlo en la instrucción SQL dinámica.

es decir, suponga que desea enumerar todas las tablas en MainDB:

Esto no funcionará, ya que la declaración USE está en un contexto diferente:una vez que EXECUTE se haya ejecutado, el siguiente SELECT NO se ejecutará en ese mismo contexto y, por lo tanto, no se ejecutará en MainDb (a menos que la conexión ya estaba establecida en base de datos principal)

DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
SELECT name FROM sys.tables

Así que tendrías que hacer:

DECLARE @DatabaseName NVARCHAR(MAX)
SET @DatabaseName = 'MainDb'
EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!

Por supuesto, debe tener mucho cuidado con la inyección de SQL, para lo cual le señalo el enlace en la respuesta de Barry.

Para evitar la inyección SQL, también puede usar la función QUOTENAME(), envuelve el parámetro entre corchetes:

DECLARE @DatabaseName sysname = 'MainDb'
    , @SQL NVARCHAR(MAX);

SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);

PRINT(@SQL);
-- USE [MainDb]

EXECUTE(@SQL);