2016-08-11 64 views
2

我試圖通過使用以下代碼從Powershell終端執行存儲過程,但該過程似乎沒有執行,並且在終端中沒有引發錯誤。從Powershell調用的存儲過程不會通過SMO對象執行

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值正確並引用了正確的DB和模式)。

+0

嘗試添加bracets執行方法,像這樣$ sproc.Execute() –

+0

你是否也與指定模式試過嗎?像$ sproc = $ db.StoredProcedures.Item(「dproc」,「dbo」) - 或其他模式是 –

+0

@KirillPashkov它引發錯誤:「方法調用失敗,因爲[Microsoft.SqlServer.Management.Smo.StoredProcedure]不包含名爲'Execute'的方法。「 –

回答

3

StoredProcedure類沒有提供執行它所表示的存儲過程的方法。

您可以試試,我也有可能使用採取任何步驟來驗證這一點:

$so.ConnectionContext.ExecuteNonQuery("dproc") 

如果做不到這一點,你可能只是回落到使用System.Data.SqlClient的。

+1

'$ so.ConnectionContext.ExecuteNonQuery(「dproc」)'不起作用,但我會考慮'Data.SqlClient' –

1

我建議你也使用System.Data.SqlClient。我以前像這樣運行存儲過程:

$SQL = New-Object System.Data.SqlClient.SqlConnection 
$ConnectionStrig = "Server=localhost;Database=testtaskdb;Integrated Security=True;" 
$SQL.ConnectionString = $ConnectionStrig 
$SQL.Open() 
$CMD = $SQL.CreateCommand() 
$CMD.CommandText = "exec myproc" 

#if you need to just run the stored procedure 
$null=$CMD.ExecuteReader() 

#if you need to get the output 
$Table = New-Object System.Data.DataTable 
$Table.Load($CMD.ExecuteReader()) 
Write-Output $Table