我有读取excel文件并在sql数据库中搜索值的代码。这是代码的一部分:
for ($i=1; $i -le $rowMax-1; $i++)
{
$name = $sheet.Cells.Item($rowName+$i,$colName).text
$mail = $sheet.Cells.Item($rowMail+$i,$colMail).text
#test $Query = ‘ SELECT * FROM dbo.tbl1 where value = ‘ + “‘” +$mail + “‘”
$Query = ‘ SELECT * FROM dbo.tbl1 where id = 3’
Invoke-Sqlcmd -serverinstance $DatabaseServerName -Database $Database -Username $Uid -Password $Pwd -query $Query -ErrorAction Stop
Write-Host ("My Name is: "+$name)
Write-Host ("My mail is: "+$mail)
Write-Host $query
}
#close excel file
$objExcel.quit()
如果我用数字
(SELECT * FROM dbo.tbl1 where id = 3)
查询,就可以了:id : 3
className : PersonBase
keyValue : 3
typeCd : 6
value : karen.g@hotmail.com
description :
usermodify :
datemodify :
My Name is: G Karen
My mail is: karen.g@hotmail.com
SELECT * FROM dbo.tbl1 where id = 3
如果我执行查询:
$Query = ‘ SELECT * FROM dbo.tbl1 where value = ‘ + “‘” +$mail + “‘”
我收到此错误:
Invoke-Sqlcmd : Incorrect syntax near '''. Msg 102, Level 15, State 1, Procedure , Line 1. At line:8 char:1 + Invoke-Sqlcmd -serverinstance $DatabaseServerName -Database $Database ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [Invoke-Sqlcmd], SqlPowerShellSqlExecutionException + FullyQualifiedErrorId : SqlError,Microsoft.SqlServer.Management.PowerShell.GetScriptCommand
在我调试时,输出看起来很好。我可以将其粘贴到服务器上,并且select语句可以正常工作:
My Name is: G Karen
My mail is: karen.g@hotmail.com
SELECT * FROM dbo.tbl1 where value = 'karen.g@hotmail.com'
怎么了?
最佳答案
PowerShell乐于接受Unicode(非ASCII范围)引号而不是通常的ASCII范围的引号-参见此答案
例如,如您的代码中所示:
‘
(左单引号, U+2018
)可以代替ASCII范围的'
(APOSTROPHE, U+0027
),也称为单引号。 “
(左双引号, U+201C
)可以代替ASCII范围的"
(QUOTATION MARK, U+0022
),又称双引号。 相比之下,我怀疑 SQL Server不会怀疑这些替换,因此您必须使用ASCII范围的
'
和"
来嵌入查询中的引号。因此,立即修复为:
$Query = ‘ SELECT * FROM dbo.tbl1 where value = ‘ + “'” +$mail + “'”
注意如何仅将
“...”
中的字符从‘
更改为'
; PowerShell解释并删除的外部引号可以继续使用非ASCII范围的引号。但是,您可以使用包含嵌入式变量引用的expandable string(
"..."
)来更简单地使用:$Query = " SELECT * FROM dbo.tbl1 where value = '$mail'"
请注意,我还将外部双引号切换为其ASCII范围版本。
甚至在PowerShell中,通常也要坚持使用通常的ASCII范围引号,以免共享代码时由于字符编码而引起问题。
关于powershell - 具有字符参数的Powershell -invokesql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880874/