You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:24:03