Sql-Server-2008

我可以從純 T-SQL 呼叫 SMO 嗎?

  • October 10, 2016

我知道如何使用 PowerShell 和 SMO 編寫儲存過程的腳本:

[System.reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")  | out-null
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" 
$srv.databases['MyDatabase'].StoredProcedures['MyProc'].TextBody

但由於我想在查詢中使用過程文本,我想知道是否可以在純 T-SQL 中以某種方式呼叫 SMO。

只能在開發環境中執行。

順便說一句:返回具有給定名稱的儲存過程定義的函式將解決我目前的問題,但不能回答我的問題。

編輯:

當我使用這個查詢時,我想找出哪些過程引用了給定的表:

SELECT p.name --, definition 
FROM sys.sql_modules m
join sys.objects p on m.object_id = p.object_id
where p.type = 'P'
and definition like '%SearchForThis%'

這與我想使用 SMO 獲得的資訊完全相同。

您將為此使用sp_OA% 儲存過程。或自 SQL Server 2005 起的CLR 。

它不能直接通過 T-SQL 完成,因為 T-SQL 是用於數據操作的。因此,您必須使用上述兩種方法之一。除非您想使用 xp_cmdshell 來執行 powershell 腳本。

這也帶來了 T-SQL 的一個限制:如何將對象定義寫入磁碟?我猜你問這個的原因之一。同樣,CLR 或 sp_OA% 會執行此操作。

需要注意的一點是,SMO 中的幾乎每個方法和屬性都映射到 SQL 命令或查詢。因此使用 T-SQL 呼叫實際上是 T-SQL 的 SMO 是循環的。

要獲取儲存過程定義,您可以使用OBJECT_DEFINITION … 來獲取 SMO 中可用的其他屬性,您可以使用 OBJECT_PROPERTY 或查詢系統對象。

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