【问题标题】:Query with line breaks fails to execute in PowerShell带换行符的查询无法在 PowerShell 中执行
【发布时间】:2017-09-07 10:24:51
【问题描述】:

我正在使用 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 给出的错误消息:

使用“1”参数调用“ExecuteNonQuery”的异常: “数据库 'Salesforce-Neptune' 的 ExecuteNonQuery 失败。” ---> Microsoft.SqlServer.Management.Smo.FailedOperationException: 数据库“Salesforce-Neptune”的 ExecuteNonQuery 失败。 ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException:一个 执行 Transact-SQL 语句或批处理时发生异常。 ---> System.Data.SqlClient.SqlException: 'select' 附近的语法不正确。

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 脚本就可以工作。什么是dealio?

【问题讨论】:

    标签: c# sql-server powershell


    【解决方案1】:

    或者如果在 PowerShell 中读取文件有一些奇怪的差异导致我出现问题

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

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

    【讨论】:

    • 啊!这正是问题所在。这就说得通了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2020-03-25
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多