Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python中的SQL Server存储过程(pyodbc)_Python_Sql Server_Pyodbc - Fatal编程技术网

使用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()