Sql-Server
如何獲取儲存過程在執行時在該儲存過程中執行的數據庫的名稱?
奇怪的問題?…也許,但我有需要。:)
我有一個儲存過程,我想在任何數據庫中通用。儲存過程生成一些動態 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”是否比“沒有得到我想要的”更糟糕。