我创建了一个 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 查询中的表名,并将表名括在括号中。但这些都不起作用。
正如其他人提醒我的那样,xp_cmdshell 在服务帐户下运行,这意味着 python 脚本不会看到您帐户上的默认数据库。因此,我通过更新 python 脚本来读取命令行参数来解决这个问题,并以这种方式传递数据库名称。
导入操作系统
arg1 = os.argv[1] arg2 = os.argv[2]