【发布时间】: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