powershell - 具有字符参数的Powershell -invokesql

标签 powershell parameter-passing quoting invoke-sqlcmd

我有读取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/

    相关文章:

    json - 在Powershell或VBS中翻译的CURL命令

    powershell - 环境变量未正确实现

    python-2.7 - 如何通过 Python 脚本运行 Powershell 函数

    c++ - 从 vb.net 在 C++ dll 函数中传递参数

    bash - 我刚刚分配了一个变量,但 echo $variable 显示了其他内容

    r - 如何告诉 ggplot 选择用 `` 引用的列

    windows - TLS1.2 Powershell HttpWebClient 支持

    c - 为什么 Linux 中的所有系统调用都使用 "call by reference"将参数传递给内核?

    c++ - pthread_create() 调用的函数的多个参数 - 参数是函数指针

    linux - linux软引用中的元字符