使用pymssql创建SQL Server数据库用户时出现语法错误如何解决?
问题原因
- 核心错误是误用了pymssql的参数绑定机制:
cursor.execute('%s', sqlStatement)的写法会把整个SQL语句当成字符串参数处理,pymssql会自动对传入内容加引号、转义特殊字符,最终提交到SQL Server的语句是被额外引号包裹的非法SQL,因此触发语法报错。 - 参数绑定仅适用于传递SQL语句中的动态值(比如WHERE条件的参数、插入的字段值等),不能用来传入完整的SQL语句本体。
解决方法
修改createUsers函数里的execute调用写法,直接传入SQL语句即可,不需要用%s占位符包裹:
def createUsers(sqlStatement, server, database): # 若未使用Windows集成认证,连接时需要补充user、password参数 conn = pymssql.connect(server=server, database=database) cursor = conn.cursor() # 直接传入SQL语句本体,不要用参数绑定传递完整语句 cursor.execute(sqlStatement) # DDL语句需要提交事务才会实际生效 conn.commit() # 操作完成后关闭资源避免泄漏 cursor.close() conn.close() target_server = 'MYServer' target_database = 'MYDatabase' sqlStatement = 'CREATE USER [test_login] FOR LOGIN [test_login] WITH DEFAULT_SCHEMA=[dbo]' createUsers(sqlStatement, target_server, target_database)
如果SQL语句里的用户名、登录名是动态生成的,正确的参数绑定写法参考:
# 动态参数放到元组里传递,占位符直接写%s即可 sql = "CREATE USER [%s] FOR LOGIN [%s] WITH DEFAULT_SCHEMA=[dbo]" cursor.execute(sql, (user_name, login_name))
额外注意事项
- 执行CREATE USER这类DDL操作,需要确保你连接SQL Server使用的账号拥有
ALTER ANY USER或者数据库所有者等高阶权限,否则即使语法正确也会执行失败。 - pymssql默认开启事务,所有写操作(包括DDL)都需要调用
conn.commit()才会实际生效。
内容的提问来源于stack exchange,提问作者siddhu
相关产品推荐
相关产品推荐

