I am running a query to MS SQL Server through pyodbc:
conn = pyodbc.connect('DRIVER={ODBC Driver 11 for SQL Server};SERVER=some_server, some_port;DATABASE=MAP;UID='xxx';PWD='xxx')
cursor = conn.cursor()
query = """SELECT v_MAMain.MAID, v_MAMain.startDate, v_MAMain.endDate, v_MAMain.fromTime, v_MAMain.toTime, v_MAMain.StatusDesc, v_MAMain.name, v_Event_Statistic.TotalGuestsAtEvent, v_Event_Statistic.PlannedGuestsAtEvent, v_Event_Statistic.City, v_Event_Statistic.Location, v_Event_Statistic.Host, v_Event_Statistic.EventSpeakers, v_MAMain.Owner, v_Event_Statistic.PlannedHoursProjectOwner, v_Event_Statistic.EventManagerName, v_Event_Statistic.PlannedHoursEventManager, v_Event_Statistic.CreditSuisseEventManager, v_MAMain.CostCenter, v_MAMain.[Project Year], v_MAMain.category, MADetails.NameOfEventStaff1, MADetails.PlannedWorkDurationEventStaff1, MADetails.NameOfEventStaff2, MADetails.PlannedWorkDurationEventStaff2, MADetails.NameOfEventStaff3, MADetails.PlannedWorkDurationEventStaff3, MADetails.NameOfEventStaff4, MADetails.PlannedWorkDurationEventStaff4, MADetails.NameOfEventStaff5, MADetails.PlannedWorkDurationEventStaff5, v_Event_Statistic.KPIEventQuality, v_Event_Statistic.KPIBusinessFit
FROM (v_MAMain INNER JOIN v_Event_Statistic ON v_MAMain.MAID = v_Event_Statistic.ProjectID) INNER JOIN MADetails ON v_MAMain.MAID = MADetails.MAID
WHERE (((v_MAMain.StatusDesc)<>"Deleted") AND ((v_MAMain.CostCenter)="0892 / 932" Or (v_MAMain.CostCenter)="0897 / 951") AND ((v_MAMain.[Project Year])=2019) AND ((v_MAMain.category)="Event"));"""
cursor.execute(query)
I get the following error:
pyodbc.ProgrammingError: ('42S22', "[42S22] [Microsoft][ODBC Driver
11 for SQL Server][SQL Server]Invalid column name 'Deleted'. (207)
(SQLExecDirectW); [42S22] [Microsoft][ODBC Driver 11 for SQL
Server][SQL Server]Invalid column name '0892 / 932'. (207); [42S22]
[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Invalid column
name '0897 / 951'. (207); [42S22] [Microsoft][ODBC Driver 11 for SQL
Server][SQL Server]Invalid column name 'Event'. (207)")
It seems that the column criteria: Deleted, Event etc. are being read as column names instead. The same query without the WHERE clause will work fine.
The query is designed in Access and the auto-generated SQL is copy-pasted from Access to my script.
Do I need to correct the SQL somehow or is it something else causing the error?
Change double quotes to single quotes around constant values. In SQL Server string in double quote is considered a column name.
Related
I am trying to execute below SQL query by introducing 2 variables in Python but getting error,
Original Query:
ALTER DATABASE db1 MODIFY (SERVICE_OBJECTIVE = 'DW300');
I want to use variables for db1 and 'DW300'. I have tried below statement in Python and got error.
dwu = 'DW100'
sqlpool = 'db1'
cursor.execute("""ALTER DATABASE ? MODIFY (SERVICE_OBJECTIVE = ?) """, (sqlpool, dwu))
Error: pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '#P1'. (102) (SQLExecDirectW)")
I use sqlite and it accepts this answe.
try the use of fstrings
f"""Alter Database {sqlpool} modify (service objective = {dwu}) """
I am trying to send a data from my code to SQL Server, but i got this error:
ProgrammingError:
('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'emotion'. (102) (SQLExecDirectW); [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. (8180)")
My Code:
import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
'Server=DESKTOP-T7OFQV6\SQLEXPRESS1;'
'Database=VidgaEmotionRecognition;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
cursor.execute('''INSERT INTO FaceEmotion emotion ?''', index_pred_as_int)
index_pred is a value from previous code snippet.
Structure of FaceEmotion table is like this:
Column: emotion - nvarchar(50) - allows nulls
Column: _id - int - key identity
I was working on a straightforward SQLAlchemy Core (Python 3.x) count unique query using the following code:
table_object = sqlalchemy.Table(table_name, metadata, autoload=True, autoload_with=engine, schema=schema)
agg_fields = [get_column_correct_case(table_object, col) for col in agg_fields]
agg_col_obj = [table_object.c[col] for col in agg_fields]
agg_query = sqlalchemy.select(agg_col_obj).select_from(table_object)\
.group_by(*agg_fields).count()
engine.scalar(agg_query)
While I believe this should be valid SQLAlchemy Core code, its execution returned a PYODBC error:
(pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]
Incorrect syntax near ')'. (102) (SQLExecDirectW);
[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180)")
The SQL query generated by this code which failed to execute properly was:
[SQL: SELECT count([ACCOUNT]) AS tbl_row_count
FROM (SELECT dbo.history.[ACCOUNT] AS [ACCOUNT], dbo.history.[RTXNNBR] AS [RTXNNBR]
FROM dbo.history
GROUP BY dbo.history.[ACCOUNT], dbo.history.[RTXNNBR])]
Running the query directly in SQL Server, it appears to be failing because the nested select is missing an alias. Is this a bug? If not, how do I fix this code?
I figured out the answer. I was surprised it was necessary, but this can be resolved by giving the query to be counted an alias.
So
agg_query = sqlalchemy.select(agg_col_obj).select_from(table_object)\
.group_by(*agg_fields).count()
becomes:
agg_query = sqlalchemy.select(agg_col_obj).select_from(table_object)\
.group_by(*agg_fields).alias('a').count()
which now works.
Sometimes I get this error randomly when I try to insert data in to the database. I fetch the data with using request.get and parsing the JSON data.
This is the error that I get:
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17
for SQL Server][SQL Server]Incorrect syntax near 's'. (102)
(SQLExecDirectW); [42000] [Microsoft][ODBC Driver 17 for SQL
Server][SQL Server]Unclosed quotation mark after the character string
')'. (105)")
This is my code:
for product in parsed['products']:
cursor.execute("INSERT INTO dbo.producten (productid, datum_toegevoegd, naam, prijs_excl, prijs_incl, gewicht) VALUES ('%s','%s','%s','%s','%s','%s')" %(product['id'],product['created_at'], product['nl']['title'],product['price_excl'],product['price_incl'],product['weight']))
You must not use string interpolation for SQL queries. The db-api will do correct parameter substitution for you - replace that % with a comma.
cursor.execute('SELECT.... ', (product['id'],product['created_at'...))
# ^
cursor.execute('SELECT.... product = ?', (value_for_product))
works for python 3.^
I'm trying to use pyodbc within Python to import a few values into my SQL server DB.
for data_form in data['matches']:
connprod = pyodbc.connect('Driver={ODBC Driver 13 for SQL Server};Server=tcp:*****.database.windows.net,1433;Database=League_Stats;Uid=******;Pwd=******;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;')
cursorprod = connprod.cursor()
lane= str(data_form['lane'])
gameId= str(data_form['gameId'])
champion= int(data_form['champion'])
platformId= str(data_form['platformId'])
timestamp= str(data_form['timestamp'])
queue= str(data_form['queue'])
role= str(data_form['role'])
season= str(data_form['season'])
UPDATE_SQL = """\
INSERT INTO MATCH_HISTORY_LIST
(lane, gameId, champion, platformId, timestamp, queue, role, season)
VALUES
(?,?,?,?,?,?,?,?,)
"""
print '--------------'
print "INSERT INTO Match_History_List(lane, gameId, champion, platformId, timestamp, queue, role, season) VALUES(?,?,?,?,?,?,?,?,)", lane,gameId,champion,platformId,timestamp,queue,role,season
cursorprod.execute(UPDATE_SQL, (lane,gameId,champion,platformId,timestamp,queue,role,season))
cnxn.commit()
This is the error I'm getting:
Traceback (most recent call last):
File "C:\Users\rybau\Desktop\Parse Json.py", line 60, in <module>
cursorprod.execute(UPDATE_SQL, (lane,gameId,champion,platformId,timestamp,queue,role,season))
ProgrammingError: ('42000', u"[42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Incorrect syntax near ')'. (102) (SQLExecDirectW); [42000] [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Statement(s) could not be prepared. (8180)")
I have no idea where the ) is coming from. I've tried just printing the statement and manually running it against the DB and it works successfully.