sql >> Databáze >  >> RDS >> Sqlserver

SQL Server:jak získat název databáze jako parametr v uložené proceduře

Pokud používáte EXEC @Var (bez závorek – tj. ne EXEC (@Var) ) SQL Server hledá uloženou proceduru odpovídající názvu předanému v @Var . K tomu můžete použít třídílné pojmenování.

Pokud sys.sp_executesql je voláno s třídílným názvem, kontext je nastaven na databázi, ve které je volán.

Takže to můžete udělat s nulou Riziko vložení SQL, jak je uvedeno níže.

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 

I kdyby výše uvedené nebylo možné, stále bych tvrdil, že k tomu je dokonale možné použít dynamické SQL bezpečným způsobem jako zde.

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. mysql - AKTUALIZACE řádku na základě jiných řádků

  2. Jaký je nejlepší postup pro načtení stromu uzlů z databáze pro další vykreslování?

  3. PostgreSQL 8.4 uděluje roli oprávnění DML na všech tabulkách

  4. Jak mohu vrátit zpět příkaz mysql, který jsem právě provedl?