Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server:jak uzyskać nazwę bazy danych jako parametr w procedurze składowanej

Jeśli używasz EXEC @Var (bez nawiasów - tj. nie EXEC (@Var) ) SQL Server szuka procedury składowanej pasującej do nazwy przekazanej w @Var . Możesz użyć do tego trzyczęściowego nazewnictwa.

Jeśli sys.sp_executesql jest wywoływana za pomocą trzyczęściowej nazwy, kontekst jest ustawiany na bazę danych, w której jest wywoływany.

Możesz to zrobić za pomocą zera Ryzyko wstrzyknięcia SQL jak poniżej.

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 

Nawet jeśli powyższe nie było możliwe, nadal twierdzę, że jest całkowicie możliwe użycie dynamicznego SQL do tego w bezpieczny sposób, jak tutaj.

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. Najlepszy sposób tworzenia indeksów w SQL Server

  2. Odniesienie do aliasu kolumny w klauzuli WHERE

  3. Moje pole VARCHAR(MAX) ogranicza się do 4000; co daje?

  4. Manipulowanie strukturą stołu

  5. Jak zwrócić podciąg z ciągu w SQL Server za pomocą funkcji SUBSTRING()?