如何通过执行存储过程来解决pyodbc错误

时间:2019-06-18 19:14:59

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

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

在通过批处理文件和在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中正常工作,但是在执行查询'exec storageprocedure'的python(pyodbc)中,我得到了错误消息:

  

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

当csv文件存在时,路径或文件名中不会出现拼写错误,并且双击它可以打开csv,并且没有人打开csv。

1 个答案:

答案 0 :(得分:1)

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

  

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

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

因此,我将首先专注于迁移数据库,然后才能解决我的问题。感谢所有尝试提供帮助的人