![](/img/trans.png)
[英]Python Mock - return_value - getting the “real” return value
[英]Is there a way to return a Stored Procedure Return_Value to the python script executing it?
我正在編寫一個 python 腳本,它應該更新日志表並通知我。 該腳本的一部分是執行 SQL 服務器存儲過程。 我得到一個 email 告訴我腳本的狀態以及存儲過程的狀態,具體取決於返回值。 但我似乎無法讓我的存儲過程返回 Return_Value。 該腳本執行存儲過程但未收到任何反饋。
我試過使用 SQLAlchemy:
resulta = engine.execute(text(""" DECLARE @return int EXEC @return = [MYPROC] '{User}', '{Status}'
SELECT 'RETURN' = @return """.format(User = curruser, Status = 'Pass')).execution_options(autocommit=True))
我的結果返回: <sqlalchemy.engine.cursor.LegacyCursorResult object at 0xXXXXXXXXXX>
我也嘗試過使用游標:
resultb = cur.execute(""" DECLARE @return int EXEC @return = [MYPROC] '{User}', '{Status}'
SELECT 'RETURN' = @return """.format(User = curruser, Status = 'Pass'))
我的結果返回: NoneType object
我也嘗試用 RETURN 替換 SELECT 但這似乎會導致更多問題。 請幫忙。
您當然可以使用 pyodbc Cursors 來做到這一點。 您需要事先知道您正在執行的存儲過程返回了多少結果集,以便帶有返回代碼的結果集位於您期望的位置。
下面的示例使用@dbname
參數執行sp_helpdb
,它從存儲過程本身返回兩個結果集,第三個結果集包含返回代碼...
import pyodbc
server = 'tcp:127.0.0.1,1433'
database = 'master'
username = 'sa'
password = 'StrongPassw0rd'
connStr = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password
cnxn = pyodbc.connect(connStr)
cursor = cnxn.cursor()
params = ( ('tempdb') )
result = cursor.execute("""
declare @ReturnCode int;
exec @ReturnCode = sp_helpdb @dbname = ?;
select @ReturnCode as ReturnCode;
""", params)
# 1st result set from stored procedure...
databaseColumns = tuple([column[0] for column in result.description])
databaseRows = result.fetchall()
print(databaseColumns)
print(databaseRows)
print()
result.nextset()
# 2nd result set from stored procedure...
logicalFileColumns = tuple([column[0] for column in result.description])
logicalFileRows = result.fetchall()
print(logicalFileColumns)
print(logicalFileRows)
print()
result.nextset()
# 3rd result set for return code...
returnCodeColumns = tuple([column[0] for column in result.description])
returnCodeRows = result.fetchall()
print(returnCodeColumns)
print(returnCodeRows)
print()
將以下內容輸出到控制台...
('name', 'db_size', 'owner', 'dbid', 'created', 'status', 'compatibility_level')
[
('tempdb', ' 24.00 MB', 'sa', 2, 'Apr 29 2022', 'Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=904, Collation=SQL_Latin1_General_CP1_CI_AS, SQLSortOrder=52, IsAutoCreateStatistics, IsAutoUpdateStatistics', 150)
]
('name', 'fileid', 'filename', 'filegroup', 'size', 'maxsize', 'growth', 'usage')
[
('tempdev', 1, '/var/opt/mssql/data/tempdb.mdf', 'PRIMARY', '8192 KB', 'Unlimited', '65536 KB', 'data only'),
('templog', 2, '/var/opt/mssql/data/templog.ldf', None, '8192 KB', 'Unlimited', '65536 KB', 'log only'),
('tempdev2', 3, '/var/opt/mssql/data/tempdb2.ndf', 'PRIMARY', '8192 KB', 'Unlimited', '65536 KB', 'data only')
]
('ReturnCode',)
[(0, )]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.