Powershell -invokesql 带字符参数
Powershell -invokesql with character parameter
我有读取 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
) can be used in lieu of the ASCII-range '
(APOSTROPHE, U+0027
),又名单引号.
“
(左双引号,U+201C
) can be used in lieu of the ASCII-range "
(QUOTATION MARK, U+0022
),又名双引号.
相比之下,我怀疑,SQL服务器不怀疑这些替换,所以你必须在查询中使用 ASCII 范围 '
和 "
作为引号 嵌入.
因此,立即修复是:
$Query = ‘ SELECT * FROM dbo.tbl1 where value = ‘ + “'” +$mail + “'”
注意“...”
里面的字符是如何从‘
变成'
的; PowerShell 解释并删除了外引号 可以继续使用非 ASCII 范围引号。
但是,您可以更简单地使用 expandable string ("..."
) 和 嵌入的 变量引用:
$Query = " SELECT * FROM dbo.tbl1 where value = '$mail'"
请注意,我还将外部双引号切换为其 ASCII 范围版本。
即使在 PowerShell 中,通常也最好坚持使用通常的 ASCII 范围引号,以免在共享代码时由于字符编码而出现问题。
我有读取 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
) can be used in lieu of the ASCII-range'
(APOSTROPHE,U+0027
),又名单引号.“
(左双引号,U+201C
) can be used in lieu of the ASCII-range"
(QUOTATION MARK,U+0022
),又名双引号.
相比之下,我怀疑,SQL服务器不怀疑这些替换,所以你必须在查询中使用 ASCII 范围 '
和 "
作为引号 嵌入.
因此,立即修复是:
$Query = ‘ SELECT * FROM dbo.tbl1 where value = ‘ + “'” +$mail + “'”
注意“...”
里面的字符是如何从‘
变成'
的; PowerShell 解释并删除了外引号 可以继续使用非 ASCII 范围引号。
但是,您可以更简单地使用 expandable string ("..."
) 和 嵌入的 变量引用:
$Query = " SELECT * FROM dbo.tbl1 where value = '$mail'"
请注意,我还将外部双引号切换为其 ASCII 范围版本。 即使在 PowerShell 中,通常也最好坚持使用通常的 ASCII 范围引号,以免在共享代码时由于字符编码而出现问题。