SQL 调用 ExecuteScalar 时发生异常:"XQuery [query()]: Syntax error near 'in', expected '}'."

SQL Exception calling ExecuteScalar: "XQuery [query()]: Syntax error near 'in', expected '}'."

我正在尝试展示 Microsoft 软件(即 SQL 服务器)如​​何 运行 XQuery,类似于我使用 SAXON 所做的。

从 SSMS,我可以 运行 此查询成功。我将整个 OpenRowSet 塞入 Select,这样我就可以 运行 使用 PowerShell 或 C# 中的 .ExecuteScalar 方法。

SELECT Cast((SELECT BulkColumn FROM   OPENROWSET(BULK'c:\XMLClass\Shakespeare\Hamlet\hamlet.xml',SINGLE_CLOB) as myalias) as XML).query(
'
 <html><body>
 {
   for $act in //ACT
   return $act 
 }
 </body></html>
 ') 

接下来,我想 运行 在 PowerShell 中执行完全相同的命令,捕获结果,并将其写入文件:

$datasource = "server=(local);database=master;trusted_connection=true"

$connection = New-Object System.Data.SQLClient.SQLConnection($connectionString)
$connection.open()
Write-Host "SQL Connection Opened" 

$SQLScalarCommand = @"

SELECT Cast((SELECT BulkColumn FROM   OPENROWSET(BULK'c:\XMLClass\Shakespeare\Hamlet\hamlet.xml',SINGLE_CLOB) as myalias) as XML).query(
'
 <html><body>
 {
   for $act in //ACT
   return $act 
 }
 </body></html>
 ') 

"@

#Write-Host $SQLScalarCommand 

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

$SQLResult = $Command.ExecuteScalar().ToString()
Write-Host ("Result=$SQLResult") 

$connection.close()  

正在获取从 PowerShell 报告的 SQL 命令:

Exception calling "ExecuteScalar" with "0" argument(s): "XQuery [query()]: Syntax error near 'in', expected '}'." At C:\XMLClass\XQuery\Shakespeare_Powershell_SQL_Simpler.ps1:43 char:1

我看到了这个 ,但似乎不适用于我的情况。 我的 Xquery 做了更多,但出于说明的目的,我试图将其简化为一个 "for/in" 语句。

Select @@Version 显示:

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) 2019 年 9 月 24 日 13:48:23 版权所有 (C) 2019 Microsoft Corporation Developer Edition(64 位)在 Windows 服务器 2019 标准版 10.0(内部版本 17763:)

PowerShell 版本:5.1.17763.316

Powershell 字符串插值正在用 Powershell 变量替换 $act。 在 Powershell 中,双引号字符串和 here-strings 执行可变字符串插值,而单引号字符串和 here-strings 则不执行。参见 about_Quoting_Rules: HERE-STRINGS

参见:

$SQLScalarCommand = @"

SELECT Cast((SELECT BulkColumn FROM   OPENROWSET(BULK'c:\temp\hamlet.xml',SINGLE_CLOB) as myalias) as XML).query(
'
 <html><body>
 {
   for $act in //ACT
   return $act 
 }
 </body></html>
 ') 

"@

Write-Host $SQLScalarCommand 

产出

SELECT Cast((SELECT BulkColumn FROM   OPENROWSET(BULK'c:\temp\hamlet.xml',SINGLE_CLOB) as myalias) as XML).query(
'
 <html><body>
 {
   for  in //ACT
   return  
 }
 </body></html>
 ') 

应该是这样的

$SQLScalarCommand = @'

SELECT Cast((SELECT BulkColumn FROM   OPENROWSET(BULK'c:\temp\hamlet.xml',SINGLE_CLOB) as myalias) as XML).query(
'
 <html><body>
 {
   for $act in //ACT
   return $act 
 }
 </body></html>
 ') 

'@

Write-Host $SQLScalarCommand