2015-06-11 6 views
1

Я использую raw_connection в sqlalchemy для выполнения некоторого SQL, который запускает хранимую процедуру.Выполнение хранимых процедур в sqlalchemy

сохраненный proc выбирает идентификатор параметра в конце. Как я могу поймать этот идентификатор?

код питона:

import sqlalchemy as sa 

SQLCommand = """ 
    DECLARE @Msg varbinary(max) = CAST(%s AS varbinary(max)) 
    EXECUTE dbo.usp_procedure @Type = 32, @header = %s, @store = @Msg 
    """ % (Datacontent, var) 


Engine = sa.create_engine(connection_string) 
Connection = Engine.raw_connection() 
cursor = Connection.cursor() 
cursor.execute(SQLCommand) 
return_key = list(cursor.fetchall()) 
Connection.commit() 
Connection.close() 

Я думал, return_key будет содержать код возврата usp_procedure но это ошибка, и я получаю:

No results. Previous SQL was not a query. 

Процедура имеет в качестве конечной стадии:

SELECT @ParamID 

Я хочу, чтобы иметь возможность прочитать этот код еще в моем коде на Python

+0

Я не использую 'sql-server', поэтому я не могу проверить реальный синтаксис, но я бы предложил вам использовать выходной параметр в вашей хранимой процедуре, подобный [this SO question] (http: // stackoverflow .com/вопросы/191644/как-делать-вы-получить выходные-параметры-с-а-хранимой процедуры-в-питон). Если вы просто сделаете 'print' в своей хранимой процедуре, будет сложнее вернуть значение. Надеюсь, поможет. – lrnzcig

+0

Хорошо, что разработчик внес изменения в процедуры, чтобы иметь выходной параметр, но все еще имеющий проблемы. – KillerSnail

ответ

1

У меня нет sql-server и проверен только на oracle, однако это слишком долго для комментария.

Создан этот простой хранимой процедуры,

CREATE OR REPLACE PROCEDURE PROCEDURE1(inp IN VARCHAR2, outp OUT VARCHAR2) AS 
BEGIN 
    IF (inp = 'true') THEN 
    outp := '1'; 
    RETURN; 
    END IF; 
    IF (inp = 'false') THEN 
    outp := '0'; 
    RETURN; 
    END IF; 
    outp := NULL; 
    RETURN; 
END PROCEDURE1; 

и проверили его с помощью следующего кода:

Connection = c.manager.engine.raw_connection() 
cursor = Connection.cursor() 
result = cursor.callproc("PROCEDURE1", ['true', '']) 
print(result[1]) 
result = cursor.callproc("PROCEDURE1", ['false', '']) 
print(result[1]) 

Результаты 1 и 0, как и ожидалось.

Я просматривал и ожидал, что callproc доступен для sql-server, например. here, но не честно, я не то, что sqlalchemy будет использовать. Попробуйте, надеюсь, это поможет.

+0

MS SQL 'pyodbc' не реализует' .callproc', поэтому вам нужно работать с '.execute'. Тем не менее, ответ правильный для оракула (+1), и работает и для Postgres (т. Е. Как я его использовал). – grochmal

Смежные вопросы