Sql server SQL Server:ExecuteReader不';t型投掷错误

Sql server SQL Server:ExecuteReader不';t型投掷错误,sql-server,powershell,Sql Server,Powershell,我运行了下面的代码,基本上应该只对我的数据库执行SQL语句,如果有任何错误,脚本应该喊“error!” 运行脚本时,test.SQL文件中的SQL语句无效,异常被CATCH子句正确捕获,并写入“ERROR!” Test.sql文件如下所示: SELECT * FRRRROM [dbo].[testtable] 但是,当我向test.sql文件添加注释时,它不再抛出“ERROR!”消息 Test.sql文件现在如下所示: -- my comment SELECT * FRRRROM [dbo].

我运行了下面的代码,基本上应该只对我的数据库执行SQL语句,如果有任何错误,脚本应该喊“error!”

运行脚本时,
test.SQL
文件中的SQL语句无效,异常被
CATCH
子句正确捕获,并写入“ERROR!”

Test.sql
文件如下所示:

SELECT * FRRRROM [dbo].[testtable]
但是,当我向
test.sql
文件添加注释时,它不再抛出“ERROR!”消息

Test.sql
文件现在如下所示:

-- my comment
SELECT * FRRRROM [dbo].[testtable]
我不明白为什么。有什么建议吗

$Connection = New-Object System.Data.SQLClient.SQLConnection
$Connection.ConnectionString = "server='myServer';database='myDatabase';trusted_connection=true;MultipleActiveResultSets=True;"
$Connection.Open()

$Command = New-Object System.Data.SQLClient.SQLCommand
$Command.Connection = $Connection 

$sql = Get-Content 'C:\Test\test.sql'

$Command.CommandText = $sql
Try
{
    $Reader = $Command.ExecuteReader()
}
Catch 
{
    echo 'ERROR!!!!'
    Exit
}
$Connection.Close()

我仍然认为会出现错误,但第一个和第二个示例之间的主要区别是您有另一行代码<代码>获取内容返回字符串数组。只要有一行,它就会被看作一根弦。确保这一点的简单方法是将文本转换为一个全新的行分隔字符串

$sql = Get-Content 'C:\Test\test.sql' | Out-String

您可以使用-join或类似的东西,但我发现
Out String
非常简单,并且与所有版本的PowerShell兼容

如用户Matt所述:

代码将数组返回给变量
$sql

$sql = Get-Content 'C:\Test\test.sql'
$Command.CommandText = $sql
添加
| Out String
后,它正常工作,返回字符串

$Command.CommandText = Get-Content 'C:\Test\test.sql'| Out-String

请尝试
$sql=Get Content'C:\Test\Test.sql'| Out String
然后您会收到错误吗?在第二个示例中,
$sql
的不同之处在于数组,而不仅仅是换行符分隔的字符串。非常感谢!解决了这个问题。我不知道我的示例返回了一个数组!又来了!你让我开心!再次感谢!附加问题:确定错误的最佳方法是什么?读取执行的SQL代码。对不起,我对这方面还不太熟悉topic@EstebanP. 在捕获内容中,您可以查看包含捕获的异常消息的
$error[0].Exception
。但可能是模糊的。这取决于
System.Data.SQLClient.SQLCommand
愿意解释什么