PowerShell调用Invoke-Sqlcmd日期转换失败,求SQL表更新方案
解决PowerShell更新SQL日期时间字段的转换错误问题
你遇到的Conversion failed when converting date and/or time from character string错误,根源有两个:一是手动拼接的日期字符串格式不被SQL Server识别,二是直接将变量嵌入SQL语句的做法既不安全(存在SQL注入风险)也不可靠。下面给你几种靠谱的解决办法:
方法1:使用参数化查询(强烈推荐)
参数化查询是处理SQL变量的最佳实践,它能自动处理类型转换,还能避免SQL注入。修改你的Invoke-Sqlcmd部分如下:
# 不需要手动格式化日期,直接用原始的DateTime对象 $finaldate = $c.LastWriteTime Invoke-Sqlcmd -ServerInstance "Server" -Database "db" -Query @" UPDATE [server].[schema].[table] SET [columnName] = @DateTimeValue "@ -Parameter @{ DateTimeValue = $finaldate }
这里直接把.NET DateTime类型的变量传给SQL参数,SQL Server会自动正确解析,完全不需要你手动拼接字符串。
方法2:直接使用ISO8601格式的字符串(如果必须用字符串)
如果你坚持要通过字符串传递日期,一定要用SQL Server能稳定识别的ISO8601格式(yyyy-MM-ddTHH:mm:ss.fffffff),修改你的日期格式化逻辑:
# 直接用Get-Date的标准格式输出,不用手动拼接 $finaldate = Get-Date -Date $date -Format "yyyy-MM-ddTHH:mm:ss.fffffff" Invoke-Sqlcmd -ServerInstance "Server" -Database "db" -Query "UPDATE [server].[schema].[table] SET [columnName] = '$finaldate'"
不过还是建议优先用参数化查询,因为字符串拼接始终存在SQL注入风险。
额外优化:简化日期获取代码
其实你获取目标文件最后修改时间的代码可以大幅简化,不需要绕圈添加NoteProperty:
$location = 'path' Set-Location $location # 直接获取最后修改的文件的LastWriteTime属性 $finaldate = Get-ChildItem 'path' | Sort-Object LastWriteTime | Select-Object -Last 1 -ExpandProperty LastWriteTime
这样代码更简洁,也减少了出错的可能性。
内容的提问来源于stack exchange,提问作者JM1
相关产品推荐
相关产品推荐

