Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как мога да направя нещо като:ИЗПОЛЗВАЙТЕ @databaseName

Ще трябва да използвате динамичен SQL, ако искате да го правите динамично по този начин. Би означавало всичко, което искате да изпълните в контекста на тази DB, трябва да включите и в динамичния SQL израз.

т.е. приемем, че искате да изброите всички таблици в MainDB:

Това няма да работи, тъй като операторът USE е в различен контекст - след като EXECUTE се изпълни, следният SELECT НЯМА да се изпълнява в същия контекст и така няма да се изпълнява в MainDb (освен ако връзката вече е настроена на MainDb)

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

Така че трябва да направите:

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

Разбира се, трябва да бъдете много внимателни с SQL инжектирането, за което ви насочвам към връзката в отговора на Бари.

За да предотвратите SQL инжектиране, можете също да използвате функция QUOTENAME(), която обвива параметъра в квадратни скоби:

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

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

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

EXECUTE(@SQL);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съединяване на три маси със съединения, различни от INNER JOIN

  2. SET DATEFIRST – Задайте първия ден от седмицата в SQL Server

  3. Разлика между JOIN и INNER JOIN

  4. Как да създам уникално ограничение, което също позволява нулеви стойности?

  5. Инструкция за динамично актуализиране с имена на колони на променливи