我可以从纯 T-SQL 调用 SMO 吗?

ber*_*d_k 6 sql-server-2008 stored-procedures scripting sql-clr ole-automation

我知道如何使用 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
Run Code Online (Sandbox Code Playgroud)

但由于我想在查询中使用过程文本,我想知道是否可以在纯 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%'
Run Code Online (Sandbox Code Playgroud)

这与我想使用 SMO 获得的信息完全相同。

gbn*_*gbn 8

为此,您将使用sp_OA% 存储过程。或自 SQL Server 2005 以来的CLR

它不能直接通过 T-SQL 完成,因为 T-SQL 用于数据操作。因此,您必须使用上述两种方法之一。除非您想使用 xp_cmdshell 来运行 powershell 脚本。

这也带来了 T-SQL 的一个限制:如何将对象定义写入磁盘?我猜你问这个的原因之一。同样,CLR 或 sp_OA% 会做到这一点。

需要注意的一件事是,SMO中的几乎每个方法和属性都映射到 SQL 命令或查询。所以使用 T-SQL 调用 SMO 是有效的 T-SQL 是循环的。

要获得存储过程定义,您将使用OBJECT_DEFINITION ... 获得 SMO 中可用的其他属性,您将使用 OBJECT_PROPERTY 或查询系统对象。