Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana saya bisa melakukan sesuatu seperti:GUNAKAN @databaseName

Anda harus menggunakan SQL dinamis jika Anda ingin melakukannya secara dinamis seperti itu. Artinya apa pun yang ingin Anda jalankan di bawah konteks DB itu, Anda juga harus menyertakan dalam pernyataan SQL dinamis.

yaitu asumsikan Anda ingin membuat daftar semua tabel di MainDB:

Ini tidak akan berfungsi, karena pernyataan USE berada dalam konteks yang berbeda - setelah EXECUTE dijalankan, SELECT berikut TIDAK akan berjalan dalam konteks yang sama dan karenanya tidak akan berjalan di MainDb (kecuali koneksi sudah disetel ke MainDb)

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

Jadi, Anda perlu melakukan:

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

Tentu saja, Anda harus sangat berhati-hati dengan injeksi SQL, yang saya arahkan ke tautan di jawaban Barry.

Untuk mencegah Injeksi SQL, Anda juga dapat menggunakan fungsi QUOTENAME(), yang membungkus parameter dalam tanda kurung siku:

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. Bandingkan dua baris dan identifikasi kolom yang nilainya berbeda

  2. Konversi 'datetime' menjadi 'time' di SQL Server (Contoh T-SQL)

  3. Membagi fungsi di SQL Server 2008

  4. Salin tabel dari satu database ke database lain di SQL Server

  5. Spotlight Tuning Pack Basic:Alat Pengoptimalan SQL Gratis Terbaik