使用Python中的SQL Server存储过程(pyodbc)
我有一个存储过程,代码:使用Python中的SQL Server存储过程(pyodbc),python,sql-server,pyodbc,Python,Sql Server,Pyodbc,我有一个存储过程,代码: 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 =
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)
如何使用此过程进行原始sql查询以创建帐户?
我正在使用flask和pyodbc。来自
要立即调用存储过程,请使用数据库识别的格式或使用。(然后ODBC驱动程序将为您重新格式化调用以匹配给定数据库。)
对于SQL Server,您可以使用以下内容:
所以我要叫你的程序
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))
对于MSSQL,正确的格式如下:
SQL = 'exec sp_UpdateUserGoogleAuthenticated ''?'', ''?'''
尝试在SQL查询窗口中的MSSQL中运行存储过程,每次都会失败,因为()围绕着?标志。如果您对单引号进行转义,它将允许使用带有空格的变量。接受的答案不会解决从存储过程捕获返回值的问题,可以这样做:
id\='test'
pw='12345'
出发=‘无’
类别='GM'
name='name'
生日=‘没有’
等级=3
路基=2
sql=”“”\
不计数;
声明@RC int;
EXEC@RC=[my_database].[dbo].[my_sp]?;
选择@RC作为RC;
"""
值=(id、pw、出发、班级、姓名、生日、年级、路基)
cursor.execute(sql、值)
rc=cursor.fetchval()#与cursor.fetchone()类似的方法[0]
不要忘记在存储过程中设置NOCOUNT ON。Gord回答的另一种风格是使用输出和命名参数(将在存储过程中定义)以清晰明了
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()
通过连接初始化游标,可以直接调用sp,如下所示
sql = " exec your_SP @codemp = ?, @fecha = ? "
prm = (dict['param1'], dict['param2'])
cursor.execute(qry, params)
在到处寻找这个解决方案之后,我找不到一个简化的版本。所有的结果似乎都过于复杂了,这应该是很容易做到的。这是我的解决办法
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()
这里有一个问题:sqlalchemy.exc.ProgrammingError:(ProgrammingError)('42000',“[42000][Microsoft][ODBC SQL Server Driver][SQL Server]靠近'@P1'”(102)(SQLExecDirectW)“)'exe my_procedure(?,,?”('5215125',125151',31231'),看起来像是存储过程中的语法错误。
@P1
是真实的一部分吗?谢谢,sql='exec[my_database].[dbo].[my_table].,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,“工作正常(无括号)。如果名称中没有空格,则无括号有效,如果有空格,则需要括号…..大家好,如何获取返回值如果我的存储过程有一个SELECT IDENT_CURRENT('TABLE')作为ID,我想获取ID。这实际上帮助我们解决了SP不工作的问题。我仍然不明白这是一个怎样的因素。通过使用动态SQL,您将自己置于SQL注入漏洞之下。谢谢。什么是更好的方法?类似于sql=r'exec territions\u SP@quarterStart=?'
后面跟着cursor.execute(sql,str(quartery\u date))
。我承认,在这种情况下,SQL注入的风险很低,但将动态SQL作为“简化”的解决方案进行推广仍然是一种不好的方式。
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()