sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server:hvordan man får et databasenavn som en parameter i en lagret procedure

Hvis du bruger EXEC @Var (uden parenteser - dvs. ikke EXEC (@Var) ) SQL Server leder efter en lagret procedure, der matcher det navn, der er sendt i @Var . Du kan bruge tre dele navngivning til dette.

Hvis sys.sp_executesql kaldes med et tredelt navn, er konteksten sat til databasen, hvori den kaldes.

Så du kan gøre dette med nul SQL-injektionsrisiko som nedenfor.

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 

Selvom ovenstående ikke var muligt, vil jeg stadig hævde, at det er helt muligt at bruge dynamisk SQL til dette på en sikker måde som her.

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. ikke-understøttet scanning, lagring af driver.Værdi skriv []uint8 i type *time.Time

  2. MySQL, utf8_general_ci &kyrilliske tegn

  3. PostgreSQL Performance - SELECT vs Stored funktion

  4. Tilføj automatisk bogstaver foran et automatisk stigningsfelt