我正在服务器上设置新的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。
答案 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)。
因此,我将首先专注于迁移数据库,然后才能解决我的问题。感谢所有尝试提供帮助的人