无法使用存储过程pyodbc SQL SERVER创建数据库

3
我正在尝试通过pyodbc调用一个创建数据库的存储过程。
以下是代码的最小示例。
import pyodbc
conn = pyodbc.connect("Driver={SQL Server};Server=SERVERNAME;Trusted_Connection=yes;")
cursor=conn.cursor()
cursor.execute("""\
    DECLARE @RC int
    DECLARE @ClientName varchar(255)
    SET @ClientName = 'Test'
    EXECUTE @RC = [DB_NAME].[SCHEMA].[sp_NAME] @ClientName
""")
conn.commit()

代码应该在SQL Server实例中创建一个名为'Test'的数据库,这不会产生任何错误。但是数据库没有被创建。
运行:
DECLARE @RC int
DECLARE @ClientName varchar(255)
SET @ClientName = 'Test'
EXECUTE @RC = [DB_NAME].[SCHEMA].[sp_NAME] @ClientName

从SSMS似乎可以创建数据库。已经查看了几个相关问题,包括这个


可能值得包含你的存储过程 sp_NAME 的 DDL。 - Thom A
另外一个问题:sp_前缀仍然是不推荐使用的吗? - Thom A
1
在打开连接后立即尝试使用conn.autocommit = True - Gord Thompson
从SSMS看起来似乎创造了什么?不管怎样,要么这个过程在SSMS中工作,要么它不工作。这里的“似乎”一词表明您并不确定。所以,在SSMS中是否有效? - SMor
@GordThompson 谢谢!这个方法可行。您能否将其作为答案并解释一下为什么 conn.autocommit = True 起作用而 conn.commit() 不起作用呢? - dCoder
@SMor 抱歉,英语不是我的母语。但它可以通过SSMS创建数据库。 - dCoder
1个回答

2
Python的DB API 2.0规范指定,默认情况下应该禁用自动提交功能来打开连接。然而,许多数据库要求DDL语句不要在事务中执行。如果使用禁用自动提交功能尝试执行DDL语句,则可能会导致错误或意外结果。
因此,更安全的做法是确保在启用自动提交功能的连接上执行DDL语句。可以通过在打开连接时设置autocommit=True来实现...
cnxn = pyodbc.connect(connection_string, autocommit=True)

最初的回答:可以通过在创建新连接时设置autocommit选项或在现有连接上启用autocommit来实现。
cnxn = pyodbc.connect(connection_string)
# ...
cnxn.autocommit = True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接