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

SQL Server:как да получите име на база данни като параметър в съхранена процедура

Ако използвате EXEC @Var (без скоби - т.е.не EXEC (@Var) ) SQL Server търси съхранена процедура, съответстваща на името, подадено в @Var . Можете да използвате именуване от три части за това.

Ако sys.sp_executesql се извиква с име от три части, контекстът е зададен на базата данни, в която се извиква.

Така че можете да направите това снула Риск от SQL инжектиране, както е показано по-долу.

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 

Дори и горното да не беше възможно, пак бих казал, че е напълно възможно да се използва динамичен SQL за това по безопасен начин, както тук.

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. Проблем с честотата на преброяване на елементи в T-SQL

  2. отделете стойности, разделени със запетая, и съхранявайте в таблица в sql сървър

  3. Създайте изглед с клауза ORDER BY

  4. Промяна на таблица:Как да промените атрибута „Allow Nulls“ от not null на позволяващ null

  5. ON е част от синтаксиса