MS SQL via Python pyodbc:为什么一直说语法不正确?

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):

我使用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):

    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记事本中,并将其另存为一个文件,然后读取该文件?这可能有助于我们在编码问题上进行三角定位。