我尝试使用以下代码从 Powershell 终端执行存储过程,但该过程似乎没有执行,并且终端中没有抛出错误。
add-type -AssemblyName "Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
$so = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server -argumentList 'PC-1001'
$db = New-Object Microsoft.SqlServer.Management.Smo.Database($so, "TestDB")
$sproc = $db.StoredProcedures.Item("dproc")
$sproc.Execute
支持的SQL代码是:
create table dummytable (id int identity(1,1), ranwhen datetime default getdate(), dummyval varchar(10));
create procedure dproc as
begin
set nocount on
insert into dummytable (dummyval)
select char(datepart(hour, getdate()) * datepart(minute, getdate()) * datepart(second, getdate()) % 256)
end
如果我在 SSMS 中执行该过程(exec dproc
),它就会起作用(数据被插入到表中)。
有什么想法为什么它不能在 Powershell 中运行吗? (没有数据被插入到虚拟表中)
更新:
我已将 $db
和 $sproc
变量的声明更改为:
$db = $so.Databases.Item("TestDB")
$sproc = $db.StoredProcedures.Item("dproc")
当检查 $sproc
对象的内容时,我可以看到每个属性都是正确的(T-SQL 代码在那里,URN 值是正确的,并且引用了正确的数据库和架构)。
最佳答案
StoredProcedure 类不提供执行它所代表的存储过程的方法。
你可以尝试一下,我没有采取任何措施来验证这是可能的,使用:
$so.ConnectionContext.ExecuteNonQuery("dproc")
如果做不到这一点,您可能会简单地转而使用 System.Data.SqlClient。
关于sql-server - 从 Powershell 调用的存储过程不通过 SMO 对象执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38890502/