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

SQL Server:cara mendapatkan nama database sebagai parameter dalam prosedur tersimpan

Jika Anda menggunakan EXEC @Var (tanpa tanda kurung - yaitu tidak EXEC (@Var) ) SQL Server mencari prosedur tersimpan yang cocok dengan nama yang dikirimkan dalam @Var . Anda dapat menggunakan tiga bagian penamaan untuk ini.

Jika sys.sp_executesql dipanggil dengan nama tiga bagian konteks diatur ke database di mana ia dipanggil.

Jadi Anda dapat melakukannya dengan nol Risiko injeksi SQL seperti di bawah ini.

CREATE PROCEDURE dbo.test @dbname SYSNAME,
                          @col    SYSNAME
AS
    SET NOCOUNT, XACT_ABORT ON;

    DECLARE @db_sp_executesql NVARCHAR(300) = QUOTENAME(@dbname) + '.sys.sp_executesql'

    EXEC @db_sp_executesql N'
                            SELECT TOP 100 *
                            FROM sys.columns 
                            WHERE name = @col',
                           N'@col sysname',
                           @col = @col 

Bahkan jika hal di atas tidak mungkin, saya masih berpendapat bahwa sangat mungkin untuk menggunakan SQL dinamis untuk ini dengan cara yang aman seperti di sini.

CREATE PROCEDURE dbo.test
    @dbname SYSNAME, /*Use Correct Datatypes for identifiers*/
    @col SYSNAME
AS
    SET NOCOUNT ON
    SET XACT_ABORT ON

    IF DB_ID(@dbname) IS NULL  /*Validate the database name exists*/
       BEGIN
       RAISERROR('Invalid Database Name passed',16,1)
       RETURN
       END

DECLARE @dynsql nvarchar(max)  

 /*Use QUOTENAME to correctly escape any special characters*/
SET @dynsql = N'USE '+ QUOTENAME(@dbname) + N'

                         SELECT TOP 100 *
                         FROM sys.tables 
                         WHERE name = @col'

 /*Use sp_executesql to leave the WHERE clause parameterised*/
EXEC sp_executesql @dynsql, N'@col sysname', @col = @col


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sql LEFT OUTER JOIN dengan klausa WHERE

  2. Baris yang dipisahkan koma SQL dengan klausa Group By

  3. Mengkueri data dengan menggabungkan dua tabel dalam dua database di server yang berbeda

  4. Bagaimana saya bisa tahu kapan Populasi Indeks Teks Lengkap SQL selesai?

  5. Apakah ada SQL Server Profiler untuk SQL Server Express?