Tôi có một thủ tục được lưu trữ, mã:
DECLARE @RC int
DECLARE @id varchar[13]
DECLARE @pw varchar[13]
DECLARE @depart varchar[32]
DECLARE @class varchar[12]
DECLARE @name varchar[12]
DECLARE @birthday varchar[10]
DECLARE @grade int
DECLARE @subgrade int
SELECT @id = 'test'
SELECT @pw = '12345'
SELECT @depart = 'none'
SELECT @class = 'GM'
SELECT @name = 'name'
SELECT @birthday = 'None'
SELECT @grade = 3
SELECT @subgrade = 2
EXEC @RC = [my_database].[dbo].[my_table] @id, @pw, @depart, @class, @name, @birthday, @grade, @subgrade
DECLARE @PrnLine nvarchar[4000]
PRINT 'Stored Procedure: my_database.dbo.my_table'
SELECT @PrnLine = ' Return Code = ' + CONVERT[nvarchar, @RC]
Làm thế nào tôi có thể tạo một truy vấn SQL thô để tạo tài khoản bằng quy trình này? Tôi đang sử dụng Flask và Pyodbc.
Gord Thompson
112K30 Huy hiệu vàng200 Huy hiệu bạc395 Huy hiệu Đồng30 gold badges200 silver badges395 bronze badges
Đã hỏi ngày 20 tháng 2 năm 2015 lúc 18:22Feb 20, 2015 at 18:22
Từ tài liệu PYODBC
Để gọi một quy trình được lưu trữ ngay bây giờ, hãy chuyển cuộc gọi đến phương thức thực thi bằng định dạng cơ sở dữ liệu của bạn nhận ra hoặc sử dụng định dạng Escape Call Call. [Trình điều khiển ODBC sau đó sẽ định dạng lại cuộc gọi cho bạn để khớp với cơ sở dữ liệu đã cho.]
Đối với SQL Server, bạn sẽ sử dụng một cái gì đó như thế này:
# SQL Server format
cursor.execute["exec sp_dosomething[123, 'abc']"]
# ODBC format
cursor.execute["{call sp_dosomething[123, 'abc']}"]
Vì vậy, để gọi thủ tục của bạn
id_ = 'test'
pw = '12345'
depart = 'none'
class_ = 'GM'
name = 'name'
birthday = 'None'
grade = 3
subgrade = 2
sql = 'exec [my_database].[dbo].[my_table][?, ?, ?, ?, ?, ?, ?, ?]'
values = [id_, pw, depart, class_, name, birthday, grade, subgrade]
cursor.execute[sql, [values]]
Đã trả lời ngày 20 tháng 2 năm 2015 lúc 19:00Feb 20, 2015 at 19:00
Dirndirndirn
Phim huy hiệu vàng 18,4K33 gold badges70 silver badges72 bronze badges
5
Câu trả lời được chấp nhận không giải quyết vấn đề nắm bắt giá trị trả về từ quy trình được lưu trữ, có thể được thực hiện như thế này:
id_ = 'test'
pw = '12345'
depart = 'none'
class_ = 'GM'
name = 'name'
birthday = 'None'
grade = 3
subgrade = 2
sql = """\
SET NOCOUNT ON;
DECLARE @RC int;
EXEC @RC = [my_database].[dbo].[my_sp] ?, ?, ?, ?, ?, ?, ?, ?;
SELECT @RC AS rc;
"""
values = [id_, pw, depart, class_, name, birthday, grade, subgrade]
cursor.execute[sql, values]
rc = cursor.fetchval[] # pyodbc convenience method similar to cursor.fetchone[][0]
Đã trả lời ngày 2 tháng 2 năm 2017 lúc 18:00Feb 2, 2017 at 18:00
Gord Thompsongord ThompsonGord Thompson
112K30 Huy hiệu vàng200 Huy hiệu bạc395 Huy hiệu Đồng30 gold badges200 silver badges395 bronze badges
1
Đã hỏi ngày 20 tháng 2 năm 2015 lúc 18:22
Từ tài liệu PYODBCMar 23, 2018 at 19:39
Eman4realEman4realEman4real
Để gọi một quy trình được lưu trữ ngay bây giờ, hãy chuyển cuộc gọi đến phương thức thực thi bằng định dạng cơ sở dữ liệu của bạn nhận ra hoặc sử dụng định dạng Escape Call Call. [Trình điều khiển ODBC sau đó sẽ định dạng lại cuộc gọi cho bạn để khớp với cơ sở dữ liệu đã cho.]5 silver badges12 bronze badges
1
Đối với SQL Server, bạn sẽ sử dụng một cái gì đó như thế này:
id_ = 'test'
pw = '12345'
depart = 'none'
class_ = 'GM'
name = 'name'
birthday = 'None'
grade = 3
subgrade = 2
sql = """\
DECLARE @RC int;
EXEC [my_database].[dbo].[my_sp] @RC OUTPUT, @id_=?, @pw=?, @depart=?, @class_=?, @name=?, @birthday=?, @grade=?, @subgrade=?;
SELECT @RC AS rc;
"""
values = [id_, pw, depart, class_, name, birthday, grade, subgrade]
cursor.execute[sql, values]
rc = cursor.fetchval[]
Vì vậy, để gọi thủ tục của bạnJun 5, 2018 at 9:16
Đã trả lời ngày 20 tháng 2 năm 2015 lúc 19:00Viggos
Dirndirn3 silver badges6 bronze badges
Phim huy hiệu vàng 18,4K3
Câu trả lời được chấp nhận không giải quyết vấn đề nắm bắt giá trị trả về từ quy trình được lưu trữ, có thể được thực hiện như thế này:Đã trả lời ngày 2 tháng 2 năm 2017 lúc 18:00Jul 30, 2019 at 22:19
Gord Thompsongord Thompson
import pyodbc
import pandas as pd
import datetime as d
conn = pyodbc.connect['Driver=;'
'Server=;'
'Database=;'
'UID=;'
'PWD=;']
# define parameters to be passed in and out
quarter_date = d.date[year=2020, month=10, day=1]
SQL = r'exec TERRITORIES_SP @quarterStart = ' + "'" + str[quarter_date] + "'"
print[SQL]
try:
cursor = conn.cursor[]
cursor.execute[SQL]
cursor.close[]
conn.commit[]
finally:
conn.close[]
Đừng quên đặt số Nocount trong thủ tục được lưu trữ của bạn.Nov 3, 2020 at 19:25
3
Đã trả lời ngày 23 tháng 3 năm 2018 lúc 19:39
SQL = 'exec sp_UpdateUserGoogleAuthenticated ''?'', ''?'''
5085 Huy hiệu bạc12 Huy hiệu Đồng
Một hương vị khác của câu trả lời của Gord là sử dụng các tham số đầu ra và được đặt tên [được xác định trong quy trình được lưu trữ] cho rõ ràng.
Đã trả lời ngày 5 tháng 6 năm 2018 lúc 9:164 gold badges27 silver badges52 bronze badges
ViggosviggosFeb 1, 2017 at 23:06