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
我正在尝试展示 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
我看到了这个
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