【问题标题】:SQL Exception calling ExecuteScalar: "XQuery [query()]: Syntax error near 'in', expected '}'."调用 ExecuteScalar 的 SQL 异常:“XQuery [query()]: 'in' 附近的语法错误,预期为 '}'。”
【发布时间】:2020-05-20 18:56:19
【问题描述】:

我试图展示 Microsoft 软件(即 SQL Server)如何运行 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 命令报告:

使用“0”参数调用“ExecuteScalar”的异常:“XQuery [查询()]:'in'附近的语法错误,预期'}'。”在 C:\XMLClass\XQuery\Shakespeare_Powershell_SQL_Simpler.ps1:43 char:1

我看到了这个post,但似乎不适用于我的情况。 我的 Xquery 做得更多,但为了便于说明,我尝试将其简化为一个“for/in”语句。

选择@@Version 显示如下:

Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 版权所有 (C) 2019 Microsoft Corporation Developer Edition (64-bit) o​​n Windows Server 2019 Standard 10.0 (Build 17763: )

PowerShell 版本:5.1.17763.316

【问题讨论】:

    标签: sql-server xquery powershell-4.0


    【解决方案1】:

    Powershell 字符串插值正在用 powershell 变量替换 $act。 在 Powershell 中,双引号字符串和此处字符串执行可变字符串插值,而单引号字符串和此处字符串不执行。见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 
    

    【讨论】:

    • 谢谢,我关注的是 SQL 而不是 PowerShell!我只是在 $ 符号前面放了一个重音。我在您上面的建议中没有看到这一点。他们没有出现,还是您有其他方法?
    • 啊,没关系 - 我看到你在这里字符串上将双引号更改为单引号。谢谢!
    • 没关系。您还可以使用单引号字符串文字来防止变量替换。
    • 嗯,.. 我现在得到响应并存储到文件中,但它似乎是整个 XML。我在将 Cast 和 OpenRowset 都塞到那一行上做错了吗?
    • 不,它有 在顶部,它是不同的。但它绝对不同于 SAXON.exe 给我的,以及我在 SSMS 中运行时得到的。
    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多