使用PowerShell向SQL Server插入二进制文件的语法错误及解决方法
问题:PowerShell写入SQL Server VARBINARY字段报错
我尝试用以下PowerShell脚本调用Rest API获取文件的二进制响应,然后更新SQL Server表中指定VARBINARY类型的单元格:
$headers=@{} $headers.Add("accept", "text/plain") $headers.Add("authorization", "Bearer xyz") $response = Invoke-WebRequest -Uri 'https://www.formstack.com/api/v2/download...' -Method GET -Headers $headers $value = $response.Content $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $SqlConnection.ConnectionString = "Server=myServer; Database =myDB; User ID=uid; Password=pwd;" $sqlConnection.Open() $sqlCommand=$sqlConnection.CreateCommand() $sqlCommand.CommandText = "UPDATE dbo.Table SET Document = $value WHERE Unique_ID ='123';" $sqlCommand.ExecuteNonQuery()
运行脚本时出现如下错误:
Exception calling "ExecuteNonQuery" with "0" argument(s): "Incorrect syntax near '80'."
其中“80”是$response.Content字节数组的第二个元素。这段代码插入普通值没问题,但插入二进制内容就报错,请问怎么解决?
解决方法
我通过将字节数组转换为十六进制字符串解决了该问题,代码如下:
$hexString = ($value | ForEach-Object ToString X2) -join '' $valuehex = '0x' + $hexString
补充说明
直接将字节数组拼入SQL语句时,PowerShell会把字节数组转换为纯数值字符串,这些数值会被SQL Server误判为语法的一部分,从而触发语法错误。而SQL Server的VARBINARY字段要求值为0x开头的十六进制字符串格式,转换后再拼入SQL语句就能被正常识别。
内容的提问来源于stack exchange,提问作者glop11294484
相关产品推荐
相关产品推荐

