0

내 데이터베이스에 저장 프로 시저를 만드는 SQL 스크립트를 생성하는 Powershell 스크립트를 작성하려고합니다. 여기에 내가 무엇을 가지고 :이 오류와 함께 실패SMO 스크립터로 스크립트를 생성 할 때 프로 시저를 스크립팅하는 방법은 무엇입니까?

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')| out-null 

Function to-array ($c) 
{ 
    foreach($item in $c) 
    { 
     $result += @($item) 
    } 
    $result 
} 

$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') "LOCALHOST" 
$scrp = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($s) 
$dbs = $s.Databases 
$fa = $dbs["FinancialAid"] 

$scrp.Options.ScriptData = $True 
$scrp.Options.AllowSystemObjects = $False 
$scrp.Options.FileName = 'StoredProcedures.sql' 
$scrp.Options.ToFileOnly = $True 

# Finally the stored procedures 

$sparray = to-array($fa.StoredProcedures) 
$scrp.EnumScript($sparray) 

:

Exception calling "EnumScript" with "1" argument(s): "Script failed for Server 'LOCALHOST'. " 
At H:\Visual Studio 2012\FinancialAidApplication\Financial Aid Application\FinancialAidApplication\main\src\FinancialAidApp 
\SQL-Scripts\sp.ps1:28 char:17 
+ $scrp.EnumScript <<<< ($sparray) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

출력 파일을 보면, 나는 그것이 대단한 시작 부분에서 내 저장 프로 시저를 않는 것을 볼 수 있지만, 다음에는 많은 시스템 절차가 있습니다. 마지막은 sys.sp_fulltext_table입니다.

내가 이미 $scrp.Options.AllowSystemObjects = $False을 지정했기 때문에이 시스템 절차가 포함되는 이유를 알지 못합니다. 나는 시스템 절차와 오류 메시지를 없애고 싶습니다.

답변

1

시도하거나 당신은 완전히 배열을 건너 뛰고 파이프 라인을 사용할 수 있습니다. (뭔가의 조각에서 나는 정기적으로 사용하지만, 당신이 당신의 변수를 사용 수정)

add-type -AssemblyName "Microsoft.SqlServer.Smo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 
$s= new-object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'LOCALHOST' 
$fa = $s.Databases['FinancialAid'] 
    $scrp = New-Object ("Microsoft.SqlServer.Management.Smo.Scripter") 
    $scrp.Server = $s 
    $options = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions") 
    $options.IncludeHeaders = $true 
    $options.FileName = 'C:\temp\StoredProcedures.sql' 
    $options.AppendToFile = $true 
    $options.ToFileOnly = $true 
    $options.ScriptBatchTerminator = $true 
    $scrp.Options = $options 
$fa.StoredProcedures | foreach {if ($_.IsSystemObject -eq $false) { $scrp.Script($_) }} 
+0

한 가지 : 나는 $ scrp.Script'가 스크립트 "데이터를"거부 $ scrp.EnumScript''때문에'사용했다 (그리고 나는 그것이 시체 자료를 고려한다고 생각한다.) –

+0

@ SamuelEdwinWard, 제 견본을 수정하여 작동하도록해야한다는 말입니까? 그렇다면 나는 혼란 스럽다. 서버 및 데이터베이스 이름을 위의 코드로 변경하면 문제없이 작업 한 후 답변으로 추가했습니다. – Bruce

+0

맞습니다. 당신이해야 할 일이 있어야합니다. 나는'ScriptData'를 true로 설정 했으므로 안됩니다. 내가 이전에 고심하고있는 동안 만든 실수 였을 것입니다. –

1

  1. 시도의 몇 실제 예외로 얻을 수 있습니다. 좋아하는 검색 엔진에 "내부 예외 powershell"을 던집니다. 지금은 일반적인 "무언가가 잘못되었습니다"라고 진단하기가 어렵습니다 (여러분과 우리 모두에게!).

  2. $sparray = to-array($fa.StoredProcedures | where {$_.IsSystemObject -eq $false)

관련 문제