Sql-Server

如何獲取儲存過程在執行時在該儲存過程中執行的數據庫的名稱?

  • March 10, 2020

奇怪的問題?…也許,但我有需要。:)

我有一個儲存過程,我想在任何數據庫中通用。儲存過程生成一些動態 SQL,然後在作為此過程中的參數之一傳入的數據庫中執行該 SQL。

但是我想讓數據庫參數成為可選參數,並且當沒有傳入數據庫名稱時,我希望動態 SQL 在呼叫過程本身的同一數據庫中執行。(請記住,此過程可以跨數據庫執行,而不是在該過程本身所在的同一數據庫中執行。)

[database].sys.sp_executesql您可以通過動態建構命令輕鬆地告訴動態 SQL 在特定數據庫中執行:

USE your_database;
GO

CREATE PROCEDURE dbo.DatabaseNameOptional
   @db sysname = NULL
AS
BEGIN
 SET NOCOUNT ON;

 DECLARE @sql nvarchar(max) = N'SELECT DB_NAME(); /* other stuff */'

 DECLARE @exec nvarchar(770) = COALESCE(@db, DB_NAME())
   + N'.sys.sp_executesql';

 -- alternatively, just leave DB_NAME() out of it:

 --DECLARE @exec nvarchar(770) = COALESCE(@db, N'')
 --  + N'sys.sp_executesql';

 EXEC @exec @sql;
END
GO

試試看:

USE your_database;
GO

EXEC dbo.DatabaseNameOptional;
GO  -- output = your_database

EXEC dbo.DatabaseNameOptional @db = N'master';
GO  -- output = master

USE tempdb;
GO

EXEC your_database.dbo.DatabaseNameOptional;
GO  -- output = your_database

EXEC your_database.dbo.DatabaseNameOptional @db = N'master';
GO  -- output = master

但是,在過程的執行上下文中,不,我認為沒有任何方法可以確定呼叫的來源(或在該上下文中執行)。這就是在 master 中使用系統標記過程的好處 - 如果這是您想要的功能,您需要確定“將對象放入 master”是否比“沒有得到我想要的”更糟糕。

引用自:https://dba.stackexchange.com/questions/232169