2017-04-11 16 views
2

Microsoft.SqlServer.Management.SMOアセンブリを使用して、PowerShellのデータベースタスクを自動化しています。何らかの理由で、改行でクエリを実行しても動作しないようです。しかし、私もC#で全く同じタスクを再現しましたが、うまくいきます。私が見落としてきた微妙な違いがあるのか​​、PowerShellで問題を引き起こしているファイルを読んでいるときに奇妙な違いがあるのか​​どうかはわかりません。PowerShellで改行を含むクエリが実行されない

SQLスクリプト(test.sql内):

select 
* from INFORMATION_SCHEMA.TABLES 

のPowerShell(仕事をしません):

Add-Type -Path 'C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll' 

$server = New-Object Microsoft.SqlServer.Management.SMO.Server('serverName') 
$database = New-Object Microsoft.SqlServer.Management.SMO.Database($server, 'myDatabase') 
$setupScript = Get-Content "$PSScriptRoot\scripts\test.sql" 
$database.ExecuteNonQuery($setupScript) 

ここでエラーメッセージPowerShellがあります以下は再現するために必要なすべての情報があります以下を与えます:

"1"引数で "ExecuteNonQuery"を呼び出す例外: "データベース 'Salesforce-Neptune'のExecuteNonQueryが失敗しました。 "---> Microsoft.SqlServer.Management.Smo.FailedOperationException: データベース 'Salesforce-Neptune'に対してExecuteNonQueryが失敗しました。---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: Transact -SQL文またはバッチ ---> System.Data.SqlClient.SqlException:付近に正しくない構文 '選択'

のC#(作業を行います):。

var server = new Server("serverName"); 
var sql = System.IO.File.ReadAllText(@"D:\code\test.sql"); 
var database = new Database(server, "myDatabase"); 
database.ExecuteNonQuery(sql); 

私が編集している場合私のtest.sqlファイルを作成し、クエリ全体を1行に入力すると、PowerShellスクリプトが機能します。 dealioは何ですか?

答えて

2

か私に問題を引き起こしているPowerShellでファイルを読み込むと、いくつかの奇妙な違いがあるかどう

私はGet-Contentがデフォルト(同じようReadAllLines()によってラインの配列のようにファイルを読み込むためであると考えていますC#IIRC)。

V3からは、-Rawスイッチを使用してこの動作を無効にすることができます.V2では[IO.File]::ReadAllText("file\path")を使用する必要があります。

+0

Ah!それがまさに問題の原因です。それは理にかなっている。ご協力いただきありがとうございます。 –

関連する問題