2017-08-28 18 views
0

私はMS SQL Server Management Studioを使用して.sqlファイルとして保存されたクエリがあります。Python経由のMS SQL pyodbc:なぜ構文が間違っていると言っているのですか?

select distinct * 
from bom.SalesBOMSampleExplosion b 

を、私はpyodbcパッケージを使用してのpython経由でファイルを読み取ろうとしました。私の他のクエリは、このクエリを除いてほぼ同じ設定で正常に実行されます。 ここで私が使用Pythonのコードです:次のエラーを

server = 'sampleserver' 
db = 'sampledb' 
Data = sp.sql_reader(os.path.join(qry_path, 'Data.sql'), server_name=server, database=db) 

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ファイルを呼び出すデシベルとしてPD 輸入pyodbcとして

輸入パンダはメッセージは次のように続きます。

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 

私はとても混乱しています!このエラーはどのような構文ですか?

+2

を生成します。おそらくutf-16のどこかでutf-8が予想されていたかもしれません。あるいは、誤ってあなたの文字列にスペースを挿入しているかもしれません。 – user2357112

+0

@ user2357112どうすればこの問題を解決できますか? – alwaysaskingquestions

+0

.sqlファイルを作成するためにどのエディタを使用しましたか?さらに明確にするために、使用したPythonコードを追加できますか? – RageCage

答えて

0

既定では、SQL Server Management Studioは、エラーメッセージのByte Order Mark(BOM)ÿþ\xFF\xFEに対応)で示されるように、.sqlファイルをUTF-16LEエンコードのUnicode形式で書き込みます。

ファイルエンコーディングが指定されていない場合、Pythonのopenのデフォルトエンコーディングはシステムによって異なります。だから、

with open(sql_path, mode='r', encoding='UTF-16LE') as f: 

ながら

sql_path = r"C:\Users\Gord\Desktop\from_ssms.sql" 
with open(sql_path, 'r') as f: 
    sql = f.read() 
print(sql) 

ÿþs e l e c t n a m e f r o m s y s . t a b l e s 

を生産する... Windows上のPython 3.6.2の下では、あなたは、いくつかのエンコーディングの問題を持っているように見えます

select name from sys.tables 
関連する問題