从 SSMS 运行时 Pyodbc 不使用默认数据库?

问题描述 投票:0回答:1

我创建了一个 python 脚本,它使用 pyodbc 连接到 SQL,运行一个简单的选择查询,并使用 xlsxwriter 将结果导出到 Excel。

当我从 VS Code 运行脚本时,一切都运行良好。但是,当我从 SQL Server Management Studio 执行脚本时,我收到返回的“无效对象名称”错误,因为它没有使用我的帐户的默认数据库,并且找不到我从中选择的表。

我需要能够让它使用为运行脚本的当前用户设置的任何默认数据库。我在搜索中找不到任何有关如何执行此操作的信息。有人知道怎么做吗?我也不明白为什么它在 VS Code 中有效,但在我执行 SSMS 脚本时却不起作用?

这是我的 python 代码,用于创建连接字符串和查询并运行它(在 VS Code 中运行良好):

import pyodbc

#Create SQL connection
sql_conn_string = "DRIVER={SQL Server Native Client 11.0};SERVER=localhost;Trusted_Connection=Yes;"
sql_conn = pyodbc.connect(sql_conn_string)
cursor = sql_conn.cursor()

#Run SQL query
sql_query = "SELECT * FROM MyTable ORDER BY 1, 2, 3 ASC"
cursor.execute(sql_query)
results = cursor.fetchall()

这是我在 SSMS 中执行脚本的方法:

EXEC xp_cmdshell 'C:\Python39\python.exe "C:\MyScript.py"';  
GO

返回错误:

pyodbc.ProgrammingError:('42S02',“[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]无效的对象名称'MyTable'。(208)(SQLExecDirectW)”)

我尝试在执行Python脚本之前在SSMS中设置数据库,但它仍然给出相同的错误。

我尝试将“INITIALCATALOG=dbo”添加到连接字符串中,并在“dbo”前面添加。到 SELECT 查询中的表名,并将表名括在括号中。但这些都不起作用。

python ssms pyodbc
1个回答
0
投票

正如其他人提醒我的那样,xp_cmdshell 在服务帐户下运行,这意味着 python 脚本不会看到您帐户上的默认数据库。因此,我通过更新 python 脚本来读取命令行参数来解决这个问题,并以这种方式传递数据库名称。

导入操作系统

arg1 = os.argv[1] arg2 = os.argv[2]

© www.soinside.com 2019 - 2024. All rights reserved.