尝试将字符串插入 SQL Server 时出现问题

Posted

技术标签:

【中文标题】尝试将字符串插入 SQL Server 时出现问题【英文标题】:Issues trying to insert string to SQL Server 【发布时间】:2016-02-20 11:29:15 【问题描述】:

我正在尝试将一个字符串插入到以0x 开头的 SQL 数据库,但它在插入时一直失败。 0x 之后的字符是随机字符,范围从 A-Z、a-z 和 0-9,没有设置长度。我试图通过在字符串前面添加一个字母并在之后更新它来解决它,但它不起作用。我正在使用

我试图模仿的 SQL 语句

insert into [TestDB].[dbo].[S3_Files] ([Key],[IsLatest],[LastModified],[MarkedForDelete],[VersionID]) values ('pmtg-dox/CCM/Trades/Buy/Seller_Provided_-_Raw_Data/C''Ds_v2/NID3153422.pdf','1','2015-10-11','Yes', '0xih91kjhdaoi23ojsdpf')

Python 代码

import pymssql as mssql
...
cursor.execute("insert into [TestDB].[dbo].[S3_Files] ([Key],[IsLatest],[LastModified],[MarkedForDelete],[VersionID]) values (%s,%s,%s,%s,%s)",(deleteitems['Key'],deleteitems['IsLatest'],deleteitems['LastModified'],MarkedforDelete, deleteitems['VersionId']))
conn_db.commit()

pymssql.ProgrammingError: (102, "附近有不正确的语法 'qb_QWQDrabGr7FTBREfhCLMZLw4ztx'.DB-Lib 错误消息 20018,严重性 15:一般 SQL Server 错误:检查来自 SQL Server 的消息")

有没有办法让Python、pymssql\mysql强制插入字符串?有没有我没有使用的字符串操作技术?我试过 pypyodbc 但没有运气。

编辑:我当前的补丁是改变字符串并在行中添加一个标志,所以我记得字符串以0x开头

【问题讨论】:

您收到的错误信息是什么? 如果没有更多信息,我猜它错误地将字符串转换为二进制/十六进制,因为字符串开头的'0x'。 这也是我的假设,但我正在寻找一种不需要我重写目前所拥有的解决方案。 该列的数据类型是什么?而且您确实需要参数化查询,而不是构建字符串并执行它们。 这是一个 varchar(200),我猜参数化使用的是 ? 而不是 %s 【参考方案1】:

这是我想出的解决方案。

由于使用适当的值运行插入命令,我在 SQL 中创建了一个存储过程来处理我的请求

USE [TestDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[stp_S3Files]
@Key_ varchar(4000),
@IsLatest_ varchar(200),
@Size_ varchar(200),
@LastModified_ varchar(200),
@MarkedForDelete_ varchar(200),
@VersionID_ varchar(200)
AS
insert into [TestDB].[dbo].[S3_Files] ([Key],[IsLatest],[Size(Bytes)],[LastModified],[MarkedForDelete],[VersionID]) values (@Key_, @IsLatest_, @Size_, @LastModified_, @MarkedForDelete_, @VersionID_)

然后我通过 Python 调用它

modkey = deleteitems['Key'].replace("'", "''")
cursor.execute("""exec TestDB.dbo.stp_S3Files
    @Key_               = '%s'
    ,@IsLatest_          =  %s
    ,@Size_              = '%s'
    ,@LastModified_      = '%s' 
    ,@MarkedForDelete_   = '%s'
    ,@VersionID_         = '%s' """ %(modkey, deleteitems['IsLatest'],deleteitems['Size'],deleteitems['LastModified'],MarkedforDelete,deleteitems['VersionId']))
conn_db.commit()

注意:字符串replace是处理路径名用'转义字符。我希望这对以后遇到同样问题的人有所帮助。

【讨论】:

以上是关于尝试将字符串插入 SQL Server 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将 HTML 插入 SQL Server 时出现 SQL 异常

尝试使用多个值插入 SQL Server 时出现不正确的语法错误

为啥在 MS SQL Server 中批量插入时出现“XML 解析:第 2 行,字符 0,文档语法不正确”

尝试将 android 连接到 sql server 时出现 NullPointerException

尝试将数据插入多个表时出错 [C# Winform SQL Server] [关闭]

从 MS SQL-Server 迁移数据库时出现 MYSQL Workbench“不正确的字符串值”错误