MS SQL via Python pyodbc:为什么一直说语法不正确?
我使用MS sql Server Management Studio将查询另存为.sql文件:MS SQL via Python pyodbc:为什么一直说语法不正确?,python,sql-server,pyodbc,Python,Sql Server,Pyodbc,我使用MS sql Server Management Studio将查询另存为.sql文件: select distinct * from bom.SalesBOMSampleExplosion b 我尝试使用pyodbc包通过python读取该文件。我的另一个查询使用几乎相同的设置成功运行,除了这个查询。 以下是我使用的python代码: 作为pd进口熊猫 将pyodbc作为数据库导入 def sql_reader(qry_file, server_name, database):
select distinct *
from bom.SalesBOMSampleExplosion b
我尝试使用pyodbc包通过python读取该文件。我的另一个查询使用几乎相同的设置成功运行,除了这个查询。
以下是我使用的python代码:
作为pd进口熊猫
将pyodbc作为数据库导入
def sql_reader(qry_file, server_name, database):
server = db.connect(str('DRIVER={SQL Server};SERVER='+server_name+';DATABASE='+database+';'))
qry = open(qry_file,'r').read()
data = pd.read_sql(qry,server)
return data
但是当我使用函数并调用sql文件时:
server = 'sampleserver'
db = 'sampledb'
Data = sp.sql_reader(os.path.join(qry_path, 'Data.sql'), server_name=server, database=db)
不断出现以下错误消息:
Traceback (most recent call last):
File "C:/Users/Documents/landlordlady/python codes/test.py", line 8, in <module>
QPVData = sp.sql_reader(os.path.join(qry_path, '8-28 qpv test.sql'), server_name=server, database=db)
File "C:\Users\Documents\landlordlady\python codes\sql_processor.py", line 30, in sql_reader
data = pd.read_sql(qry,server)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\sql.py", line 399, in read_sql
chunksize=chunksize)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\sql.py", line 1436, in read_query
cursor = self.execute(*args)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\sql.py", line 1413, in execute
raise_with_traceback(ex)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\compat\__init__.py", line 340, in raise_with_traceback
raise exc.with_traceback(traceback)
File "C:\Users\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\sql.py", line 1401, in execute
cur.execute(*args)
pandas.io.sql.DatabaseError: Execution failed on sql 'ÿþ
s e l e c t d i s t i n c t *
f r o m b o m . S a l e s B O M S a m p l e E x p l o s i o n b
': ('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'e'. (102) (SQLExecDirectW)")
Process finished with exit code 1
我真糊涂!这个错误在说什么语法 默认情况下,SQL Server Management Studio使用UTF-16LE编码将.SQL文件写入Unicode,如错误消息中对应于\xFF\xFE的字节顺序标记BOMÿþ所示 如果未指定文件编码,则Python中open的默认编码取决于系统。因此,在Windows上的Python 3.6.2下 sql\u path=rC:\Users\Gord\Desktop\from\u ssms.sql 使用opensql_路径,“r”作为f: sql=f.read printsql 产生 ÿþs e l e c t n a m e f r o m s y s。t a b l e s 当 使用opensql_路径,mode='r',将='UTF-16LE'编码为f: 产生 从sys.tables中选择名称
您似乎有一些编码问题。可能是预期的utf-8的某个位置出现了utf-16,或者可能是您在某个点意外地在字符串中插入了空格,或者是其他原因。@user2357112那么我该如何解决这个问题?您使用了什么编辑器来创建.sql文件?另外,为了进一步澄清,您可以添加您使用的python代码吗?@rageage我已经编辑了我的帖子!我还使用Sql server management studio编写了Sql文件。您是否可以尝试将实际查询select distinct*from bom.SalesbomSampleB复制并粘贴到Windows记事本中,并将其另存为一个文件,然后读取该文件?这可能有助于我们在编码问题上进行三角定位。