Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server:cách lấy tên cơ sở dữ liệu làm tham số trong thủ tục được lưu trữ

Nếu bạn sử dụng EXEC @Var (không có dấu ngoặc - tức là không EXEC (@Var) ) SQL Server tìm kiếm một thủ tục được lưu trữ khớp với tên được truyền trong @Var . Bạn có thể sử dụng cách đặt tên ba phần cho việc này.

Nếu sys.sp_executesql được gọi với tên ba phần, ngữ cảnh được đặt cho cơ sở dữ liệu mà nó được gọi.

Vì vậy, bạn có thể làm điều này với không Nguy cơ chèn SQL như bên dưới.

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 

Ngay cả khi điều trên là không thể, tôi vẫn tranh luận rằng hoàn toàn có thể sử dụng SQL động cho việc này một cách an toàn như ở đây.

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. Làm thế nào để triển khai SQL Server Compact Edition 4.0?

  2. Sự khác biệt giữa bảng thả và bảng xóa trong SQL Server là gì?

  3. datetime so với datetime2 trong SQL Server:Sự khác biệt là gì?

  4. Cần trợ giúp trong truy vấn động với Mệnh đề IN

  5. SQL Server 2016 - Giới thiệu về Cơ sở dữ liệu Stretch