如何在Python中使用存储过程将值插入到SQL Server表中

huangapple go评论82阅读模式
英文:

How to insert values into SQL Server table using Stored procedure in Python

问题

我是pytds的新手。在向SQL Server插入数据时遇到了TypeError: not enough arguments for format string的问题。

我遇到的问题是:

追踪回溯(最近的调用最后):
文件 "c:/Users/mydesk/Desktop/test/test_pytds.py",第 64 行,在
connect_and_call_stored_procedure(query, val)
文件 "c:/Users/mydesk/Desktop/test/test_pytds.py",第 48 行,在 call_sproc 中
cursor.execute(query, (tvp,))
文件 "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init_.py",第 739 行,在 execute 中
self.execute(operation, params)
文件 "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init
.py",第 701 行,在 _execute 中
operation = operation % names[0]
TypeError: not enough arguments for format string

我漏掉了什么。请提供您宝贵的意见。

我的完整代码:

import pytds 

def get_query() -> str:
    sql = '''
        DECLARE @tbl [dbo].[tbl]
        insert into @tbl
        (
            col1, col2, col3
        )
        values (%s,%s,%s)
    '''  
    query = '''
         EXECUTE [dbo].[stproc] 
         @tbl
    '''
    return sql + query

def call_sproc(query, val):
    server = 'my_server'
    user = 'my_user'
    password = 'secret'
    database = 'my_db'
    
    try:
        conn = pytds.connect(server=server, user=user, password=password, database=database)
        cursor = conn.cursor()

        tvp = pytds.TableValuedParam(type_name='dbo.tbl', rows=val)

        cursor.execute(query, (tvp,))

        conn.commit()

        cursor.close()
        conn.close()

    except pytds.Error as e:
        print("Connection issue:", e)

val = [('col1_val'), ('col2_val'), ('col3_val')]
my_sql = get_query()
call_sproc(my_sql, val)
英文:

I am new to pytds. Facing TypeError: not enough arguments for format string issue while inserting data into SQL Server.

Issue I am getting is:
> Traceback (most recent call last):
> File "c:/Users/mydesk/Desktop/test/test_pytds.py", line 64, in <module>
> connect_and_call_stored_procedure(query, val)
> File "c:/Users/mydesk/Desktop/test/test_pytds.py", line 48, in call_sproc
> cursor.execute(query, (tvp,))
> File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init_.py", line 739, in execute
> self.execute(operation, params)
> File "C:\Program Files (x86)\Python38-32\lib\site-packages\pytds_init
.py", line 701, in _execute
> operation = operation % names[0]
> TypeError: not enough arguments for format string

Something I missed. Let me know your valuable inputs.

My complete code:

import pytds 
def get_query() -&gt; str:
    sql = &#39;&#39;&#39;
        DECLARE @tbl [dbo].[tbl]
        insert into @tbl
        (
            col1, col2, col3
        )
        values (%s,%s,%s)
    &#39;&#39;&#39;  
    query += &#39;&#39;&#39;
         EXECUTE [dbo].[stproc] 
         @tbl
    &#39;&#39;&#39;
    return sql

def call_sproc(query, val):
    server = &#39;my_server&#39;
    user = &#39;my_user&#39;
    password = &#39;secret&#39;
    database = &#39;my_db&#39;
    
    try:
        conn = pytds.connect(server=server, user=user, password=password, database=database)
        cursor = conn.cursor()

        tvp = pytds.TableValuedParam(type_name=&#39;dbo.tbl&#39;, rows=val)

        cursor.execute(query, (tvp,))

        conn.commit()

        cursor.close()
        conn.close()

    except pytds.Error as e:
        print(&quot;Connection issue:&quot;, e)

###
val=[(&#39;col1_val&#39;), (&#39;col2_val&#39;), (&#39;col3_val&#39;)]
my_sql = get_query()
call_sproc(my_sql, val)

答案1

得分: -1

调用存储过程时,无需任何查询或DECLARE。只需按照文档中的说明使用callproc即可。

cursor.callproc("dbo.stproc", (tvp,))

或者,如果您真的想使用临时批处理,则可以执行以下操作:

cursor.execute("EXECUTE dbo.stproc %s", (tvp,))
英文:

To call a stored procedure, you don't need any query or DECLARE. Just do what the docs say and use callproc

cursor.callproc(&quot;dbo.stproc&quot;, (tvp,))

Or if you really want to use an ad-hoc batch then do

cursor.execute(&quot;EXECUTE dbo.stproc %s&quot;, (tvp,)) 

huangapple
  • 本文由 发表于 2023年8月9日 18:41:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/76866968.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定