【问题标题】:How to fix pyodbc error with stored procedure execution如何通过存储过程执行修复 pyodbc 错误
【发布时间】:2019-11-01 11:37:13
【问题描述】:

我正在服务器上设置一个新的虚拟机,以减轻我笔记本电脑上的 SQL Server 数据库负载。这样做时,我希望能够通过 Python 在我的数据库中执行存储过程(没有参数,只是 'exec storedprocedure'),但它不起作用。

在通过批处理文件和 SSMS 使用 sqlcmd 时,存储过程调用有效,但我想让它全部基于 python。

存储过程附加事实表,一般格式如下:

--staging tbl drop and creation
if object_id(stagingtbl) is not null drop tabl stagingtbl
create table stagingtbl
(fields datatypes nullable
)

--staging tbl load
bulk insert stagingtbl
from 'c:\\filepath\\filename.csv'
with (
   firstrow = 2
   , rowterminator = '\n'
   ,fieldterminator = ','
   , tablock /*don't know what tablock does but it works...*/
)

--staging table transformation
; with cte as (
    /*ETL process to transform csv file into my tbl structure*/
)

--final table load
insert final_tbl
select * from cte


/*
T-SQL update the final table's effect to date, based on subsequent effect from date. 
eg:
id, effectfromdate, effecttodate
1,1/1/19, 1/1/3000
1,1/10/19, 1/1/3000
   becomes
id, effectfromdate, effecttodate
1,1/1/19, 1/10/19
1,1/10/19, 1/1/3000
*/

存储过程在 sqlcmd 和 ssms 中运行良好,但在 python (pyodbc) 中执行查询“exec storedprocedure”时,我收到错误消息:

pyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]
无法批量加载,因为无法打开文件“c:\filepath\filename.csv”。
操作系统错误代码 3(系统找不到指定的路径。)。 (4861) (SQLExecDirectW)')

当csv文件存在时,路径或文件名没有拼写错误,双击可以打开csv,没有人打开csv。

【问题讨论】:

  • 我无法重现您的问题。当您使用 sqlcmd 或 SSMS 进行连接时,您可能没有连接到 Python 脚本正在连接的同一个 SQL Server 实例。当您双击 CSV 文件时,您是在双击服务器上共享文件夹中的文件,您可以从笔记本中看到吗?
  • HI .csv 文件是否存在于指定位置?
  • @GordThompson 这是一个 sqlexpress sql 服务器实例,使用 pyodbc 游标我可以运行 select * from tbl 查询,它只是无法运行的存储过程
  • @AmilaMGunawardana 共享驱动器上确实存在 csv 文件,VM 可以在记事本中打开它
  • 执行此操作时 csv 文件是否打开?

标签: sql-server python-3.x stored-procedures pyodbc


【解决方案1】:

通过不断的实验,我确定问题不在于 python 或 pyodbc。在我的笔记本电脑(db 的主机)上的 SSMS 中,存储过程工作得很好,但在 VM 上的 SSMS 中,存储过程会导致相同的错误。这告诉我,我的问题不是根本问题,我还有更多工作要做。错误(在 SSMS 中)如下。

消息 4861,级别 16,状态 1,过程 Append_People,第 71 行 [批处理开始行 0]
无法批量加载,因为无法打开文件“N:\path\filename.csv”。操作系统错误代码3(系统找不到指定的路径)。

一旦我确定问题出在 SSMS 中,我扩大了搜索范围,发现问题在于 bulk insert 命令的路径必须与托管数据库的机器相关。所以在虚拟机(客户端机器,直到我迁移数据库)中,当我使用路径c:\ 认为它是虚拟机的c:\ 驱动器时,存储过程正在查看我笔记本电脑的c:\,因为它是主机。由此我还了解到,在共享驱动器 (N:\) 上,访问被委派,这是它自己的问题 (https://dba.stackexchange.com/questions/44524/bulk-insert-through-network)。

所以我将首先专注于迁移数据库,然后这将解决我的问题。感谢所有试图提供帮助的人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2013-08-06
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多