Как исправить ошибку pyodbc при выполнении хранимой процедуры - PullRequest
0 голосов
/ 18 июня 2019

Я настраиваю новую виртуальную машину на сервере для разгрузки загрузки базы данных SQL Server с моего ноутбука.При этом я хотел бы иметь возможность выполнять хранимые процедуры (без параметров, просто 'exec storeprocedure') в моей базе данных через Python, но это не работает.

Вызов хранимой процедуры работал при использовании sqlcmd черезпакетный файл и в SSMS, но я хотел бы сделать все это на основе 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 сохраненная процедура', Я получаю сообщение об ошибке:

pyodbc.ProgrammingError: (' 42000 ',' [42000] [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server]
Невозможно выполнить массовую загрузкупотому что файл "c: \ filepath \ filename.csv" не может быть открыт.
Код ошибки операционной системы 3 (системе не удается найти указанный путь.). (4861) (SQLExecDirectW) ')

Когда есть файл csv, нет ошибок в пути или имени файла, и я могу открыть csv при двойном щелчке по нему, и никто не открывает csv.

1 Ответ

1 голос
/ 20 июня 2019

После продолжительных экспериментов я установил, что проблема не в python или pyodbc.В SSMS на моем ноутбуке (хост-машина db) хранимые процедуры работают нормально, но в 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).

). Итак, сначала я сосредоточусь на переносе базы данных,тогда это решит мою проблему. Спасибо всем, кто пытался помочь

...