sql >> Database >  >> RDS >> Sqlserver

SQL Server:hoe een databasenaam als parameter in een opgeslagen procedure te krijgen?

Als u EXEC @Var . gebruikt (zonder haakjes - d.w.z. niet EXEC (@Var) ) SQL Server zoekt naar een opgeslagen procedure die overeenkomt met de naam die is doorgegeven in @Var . U kunt hiervoor driedelige naamgeving gebruiken.

Als sys.sp_executesql wordt aangeroepen met een driedelige naam, de context wordt ingesteld op de database waarin het wordt aangeroepen.

U kunt dit dus doen met nul SQL-injectierisico zoals hieronder.

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 

Zelfs als het bovenstaande niet mogelijk was, zou ik nog steeds beweren dat het perfect mogelijk is om dynamische SQL hiervoor te gebruiken op een veilige manier zoals hier.

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. Oracle-query als bron in SSIS definieert verkeerde gegevenstypen

  2. Wat doet SQL Server met een time-outverzoek?

  3. Trigger om invoeging te voorkomen voor dubbele gegevens van twee kolommen

  4. randomiseren van grote dataset