带换行符的查询无法在PowerShell中执行

时间:2017-04-11 20:50:53

标签: c# sql-server powershell

我使用Microsoft.SqlServer.Management.SMO程序集在PowerShell中自动执行某些数据库任务。出于某种原因,使用换行符执行查询似乎不起作用。但是,我也在C#中复制了完全相同的任务,它确实有效。我不确定是否存在我忽略的细微差别,或者在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提供的错误消息:

  

异常调用" ExecuteNonQuery"用" 1"参数(一个或多个):   " ExecuteNonQuery因数据库' Salesforce-Neptune'而失败。 " --->   Microsoft.SqlServer.Management.Smo.FailedOperationException:   数据库' Salesforce-Neptune'的ExecuteNonQuery失败。 --->   Microsoft.SqlServer.Management.Common.ExecutionFailureException:An   执行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文件并将整个查询放在一行上,那么我的PowerShell脚本就可以运行了。什么是交易?

1 个答案:

答案 0 :(得分:2)

  

或者如果在PowerShell中读取文件存在一些奇怪的区别,这会导致我出现问题

我认为这是因为Get-Content默认情况下将文件读取为行数组(就像C#IIRC中的ReadAllLines()一样)。

从V3开始,您可以使用-Raw开关禁用此行为,使用V2时您必须使用[IO.File]::ReadAllText("file\path")