pythonsql-servertable-valued-parameterssqlalchemy-pytds

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


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 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() -> str:
    sql = '''
        DECLARE @tbl [dbo].[tbl]
        insert into @tbl
        (
            col1, col2, col3
        )
        values (%s,%s,%s)
    '''  
    query += '''
         EXECUTE [dbo].[stproc] 
         @tbl
    '''
    return sql

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)

Solution

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

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

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

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