sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu udělat něco jako:USE @databaseName

Pokud to chcete takto dynamicky, museli byste použít dynamické SQL. Znamenalo by to, že cokoli, co chcete provést v kontextu této DB, musíte také zahrnout do dynamického příkazu SQL.

tj. předpokládejme, že chcete vypsat všechny tabulky v MainDB:

Toto nebude fungovat, protože příkaz USE je v jiném kontextu – jakmile se spustí EXECUTE, následující SELECT NEBUDE spuštěn ve stejném kontextu, a tak nepoběží v MainDb (pokud již připojení nebylo nastaveno na MainDb)

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

Takže budete muset udělat:

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

Samozřejmě musíte být velmi opatrní s injekcí SQL, pro kterou vás odkazuji na odkaz v Barryho odpovědi.

Chcete-li zabránit SQL Injection, můžete také použít funkci QUOTENAME(), která zalomí parametr do hranatých závorek:

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

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

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

EXECUTE(@SQL);


  1. Získejte data z čísla týdne v T-SQL

  2. Změňte výchozí jazyk přihlášení na serveru SQL Server

  3. Vytvořte vlastní způsob dopravy v OpenCart:Část druhá

  4. Oracle After Delete Trigger... Jak se vyhnout Mutující tabulce (ORA-04091)?