开发者社区> 问答> 正文

如何替换引起SQL语法错误的撇号

预期行为:

有一个PS脚本,可浏览文件目录并获取所有目录详细信息(正常运行) 将那些详细信息写回到SQL表中(有效) 该脚本正在运行,但是失败,并显示如下错误:

ForEach-Object:使用“ 0”参数调用“ ExecuteNonQuery”的异常:“'EGIDIO'附近的语法不正确”

我知道是由撇号引起的。失败时读取的文件夹称为“ D'EGIDIO,SHAH&TOWNSEND”。

问题是我似乎无法弄清楚如何在PS脚本或脚本中的sql插入中替换该文本。无论我尝试什么,它仍然会失败。

#Invoke-sqlcmd Connection string parameters
$params = @{'server'='TESTServer';'Database'='_Maintenance'}
#Server to query WMI class win32_logicalDisks
$server = 'TESTServer'
#Prepare Insert Statement

$insert = @' 
    INSERT INTO [_PBS_Maintenance].[dbo].[Maint_DiskSpace](Path,SizeInMB,SizeInGB,FileLastModified,CreatedDate,CreatedBY)
    VALUES (
                '{0}',
                '{1}',
                '{2}',
                '{3}',
                GetDate(),
                SYSTEM_USER
           )
'@
 write-host $insert
Try {
    #Define connction string of target database
    $connectionString = 'Data Source=PBSNV800IMG1\PBSNV800IMG1;Initial Catalog=_PBS_Maintenance;Integrated Security=SSPI'
    # connection object initialization
    $conn = New-Object System.Data.SqlClient.SqlConnection($connectionString)
    #Open the Connection 
    $conn.Open()
    # Prepare the SQL 
    $cmd = $conn.CreateCommand()

    $array= @() 
    $folder = "\\fsvr\Public\Users\Valorie L\Valorie\ATTORNEY\EIC-ERMG\" 
    $Source = $folder

Get-ChildItem -Recurse $Source | Where-Object { $_.PSIsContainer } | 
    ForEach-Object { 
            $obj = New-Object PSObject  
            $SizeMB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1MB, 2)
            $SizeGB = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1GB, 2)  
            $obj |Add-Member -MemberType NoteProperty -Name "Path" $_.FullName
            $obj |Add-Member -MemberType NoteProperty -Name "SizeMB" $SizeMB 
            $obj |Add-Member -MemberType NoteProperty -Name "SizeGB" $SizeGB 
            $obj |Add-Member -MemberType NoteProperty -Name "DateModified" $_.LastWritetime
                    $array +=$obj 


    select Path,SizeMB,DateModified
        ForEach-Object{
            $cmd.CommandText = $insert -f $obj.Path,$obj.SizeMB,$obj.SizeGB, $obj.DateModified
            $cmd.ExecuteNonQuery()
    }
}
    #Close the connection
    $conn.Close()

}
Catch {
    Throw $_
}

Invoke-Sqlcmd @params -Query "SELECT  * FROM Maint_DiskSpae" | format-table -AutoSize

展开
收起
祖安文状元 2020-01-03 18:49:17 683 0
1 条回答
写回答
取消 提交回答
  • 1个

    在SQL中,通过将单引号加倍将其转义(两个单引号' ',而不是双引号")。在此行的情况下,您需要执行以下操作:

    $obj |Add-Member -MemberType NoteProperty -Name "Path" $_.FullName
    
    

    稍微修改一下,用两个单引号替换任何单引号,如下所示:

    $obj |Add-Member -MemberType NoteProperty -Name "Path" ( $_.FullName -replace "'", "''" )
    
    

    它是如何工作的是子表达式,$_.FullName因此我们可以使用-replace运算符将路径中的任何单引号替换为两个单引号。首先评估子表达式,然后将返回的值作为上的Path属性的值应用于父范围$obj。

    请注意,请确保转义在文件夹路径中允许作为SQL查询一部分转义的所有字符,以及为防止SQL注入攻击而应转义的字符,转义。

    2020-01-03 18:49:36
    赞同 展开评论 打赏
问答分类:
SQL
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载