簡體   English   中英

循環遍歷所有 SSMS 數據庫而不重新創建存儲過程

[英]Loop Through All SSMS Databases without Recreating Stored Procedure

背景資料:

在 Python 中,如果我想將相同的邏輯應用於列表中的不同值,我可能會寫這樣的東西。

database_list = ["db_1", "db_2", "db_3"]

for x in range(0,len(database_list),1):
     
     print("the database name is " + database_list[x])

我正在嘗試做的事情:

我在 SSMS 中嘗試做的是為每個數據庫提取數據庫對象列表。 我創建了一個存儲過程來准確提取我想要的內容,但是我必須針對每個數據庫運行它,所以 10 個數據庫意味着運行 10 次。

我的目標是使用 T-SQL 查詢而不是 Python 來執行此操作。

我試着做這樣的事情:

 exec sp_MSforeachdb 'USE ?; EXEC [dbo].[my_stored_procedure]';

問題是, [dbo].[my_stored_procedure]必須存在於我想要執行此操作的每個數據庫中。

如何在 1 個數據庫中創建存儲過程,但為所有數據庫或我選擇的數據庫列表執行它?

我知道您要做什么,如果這是我的想法(您似乎不願意實際說:)您可以執行以下操作:

master數據庫中,創建您的過程。 通常你不會這樣做,但在這種情況下你必須在它sp_

use master
go
create procedure sp_testproc as

select top 10 * from sys.tables
go

現在,如果您運行它,它將從master數據庫返回表。

如果將上下文切換到另一個數據庫並exec master.dbo.sp_testproc ,它仍會從主數據庫返回表。

master中,運行

sys.sp_MS_marksystemobject sp_testproc

現在將上下文切換到不同的數據庫並exec master.dbo.sp_testproc

它將從您正在使用的數據庫中返回表。

嘗試在 master 中創建您的 sproc 並使用sp_前綴命名它:

USE master
GO

CREATE PROCEDURE sp_sproc_name
AS
 BEGIN
 ...
 END
GO

-- You *may* need to mark it as a system object
EXEC sys.sp_MS_marksystemobject sp_sprocname

請參閱: https://nickstips.wordpress.com/2010/10/18/sql-making-a-stored-procedure-available-to-all-databases/

然后它應該在所有數據庫中都可用

在 Master 數據庫中創建帶有sp_前綴的存儲過程,並在存儲過程中使用動態 SQL 以便它解析相對於當前數據庫的 object 名稱,而不是包含存儲過程的數據庫。

例如

use master 
go
CREATE OR ALTER  PROCEDURE [dbo].[sp_getobjects]
AS
exec ('
     select *
     from [sys].[objects]
     where is_ms_shipped = 0
     order by type, name
     ')
go

use AdventureWorks2017
exec sp_getobjects 

@LunchBox - 這是您的單個存儲過程(您在一個數據庫中創建),實際上需要包含“exec sp_MSforeach ....”命令,而不是要執行的命令是“EXEC”,它將需要是您要放入存儲過程的實際 SQL。

例如。 (在您的單個存儲過程中)

EXEC sp_MSforeachdb 'USE ?; SELECT * FROM <table>; UPDATE <another table> SET ...';

將存儲過程(您放入一個數據庫中)想象成與您的 Python 代碼文件沒有什么不同 - 如果您真的想在 Python 中實現同樣的事情,您將需要在每個數據庫中創建存儲過程,或在 Python 中構建 SQL 語句字符串並針對每個數據庫執行它。

我了解您認為使用 SQL 可以實現的目標,但存儲過程確實無法按您預期的方式工作。 即使您在不同數據庫的上下文中,但您運行 EXEC <differ_db>.stored_proc,該存儲過程最終也會在它所在的數據庫的上下文中運行(而不是您的上下文數據庫)。

現在,您可能遇到的唯一一個問題是標准 sp_MSforeachdb 存儲過程對可以執行的命令有 2000 個字符的限制(盡管它確實有多個“命令”參數,如果您這樣做可能不實用)正計划運行一個非常大的代碼塊,可能帶有貫穿始終的變量)。 如果這可能會影響您打算做的事情,您可以在線搜索“sp_MSforeachdb 替代方案” - 人們似乎已經創建了少數命令參數可以包含更大字符串的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM