Can the cursor.execute call below execute multiple SQL queries in one go?
cursor.execute("use testdb;CREATE USER MyLogin")
I don’t have python setup yet but want to know if above form is supported by cursor.execute?
import pyodbc # Some other example server values are # server = 'localhostsqlexpress' # for a named instance # server = 'myserver,port' # to specify an alternate port server = 'tcp:myserver.database.windows.net' database = 'mydb' username = 'myusername' password = 'mypassword' cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = cnxn.cursor() #Sample select query cursor.execute("SELECT @@version;") row = cursor.fetchone() while row: print(row[0]) row = cursor.fetchone()
Advertisement
Answer
Multiple SQL statements in a single string is often referred to as an “anonymous code block”.
There is nothing in pyodbc (or pypyodbc) to prevent you from passing a string containing an anonymous code block to the Cursor.execute()
method. They simply pass the string to the ODBC Driver Manager (DM) which in turn passes it to the ODBC Driver.
However, not all ODBC drivers accept anonymous code blocks by default. Some databases default to allowing only a single SQL statement per .execute()
to protect us from SQL injection issues.
For example, MySQL/Connector ODBC defaults MULTI_STATEMENTS
to 0
(off) so if you want to run an anonymous code block you will have to include MULTI_STATEMENTS=1
in your connection string.
Note also that changing the current database by including a USE …
statement in an anonymous code block can sometimes cause problems because the database context changes in the middle of a transaction. It is often better to execute a USE …
statement by itself and then continue executing other SQL statements.