我使用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脚本就可以运行了。什么是交易?
答案 0 :(得分:2)
或者如果在PowerShell中读取文件存在一些奇怪的区别,这会导致我出现问题
我认为这是因为Get-Content
默认情况下将文件读取为行数组(就像C#IIRC中的ReadAllLines()
一样)。
从V3开始,您可以使用-Raw
开关禁用此行为,使用V2时您必须使用[IO.File]::ReadAllText("file\path")
。