簡體   English   中英

正在獲取pypyodbc.ProgrammingError :(“ 42000”,“ [42000] [Microsoft] [ODBC SQL Server驅動程序] [SQL Server]必須聲明標量變量“ @Id”。)

[英]Getting pypyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the scalar variable “@Id”.')

我正在嘗試從Python3執行.sql文件。 以下是我正在嘗試的python代碼

import time
userdate=time.strftime("%m_%d_%H_%M%S")
import pypyodbc as pyodbc
db_host='hostname\DBTEST'
db_name='dbname'
conn='Driver={SQL Server};Server=' + db_host + ';Database=' +db_name + 
';Trusted_Connection=yes;'
db=pyodbc.connect(conn)
cursor=db.cursor()
file=open('C:\\abc\\xyz.sql','r')
line=file.read()
sql_cmd=line.split('\n')
for x in sql_cmd:
   cursor.execute(x)

以下是xyz.sql腳本

DECLARE @XML XML;
DECLARE @FileName VARCHAR(1000);
DECLARE @Id UNIQUEIDENTIFIER 
SELECT @Id = NEWID()
SELECT @FileName = 'ggg.xml' 
SELECT @XML = '<Model>
    ....xml tags here...
    ....        

</Model>'

IF EXISTS (SELECT * FROM tablename CM WHERE CM.columnname = 'test') BEGIN
    UPDATE CM
        SET CM.pn = '01-00001',
            CM.rev= '06',
            CM.Model = @XML,
            CM.ModifiedOn = GETUTCDATE()
       FROM cm.tablename CM
       WHERE CM.columnname= 'test'

    PRINT 'Updated ' + @FileName
END ELSE BEGIN
    INSERT INTO cm.tablename(cmID, MN, CMType, Description, PN, Rev, CM, 
    RowStatus, ModifiedBy, ModifiedOn)
    SELECT @Id, 'test123', 'abc.1', '', '01-00011', '01', @XML, 'A', 
'74E8A3E0-E5CA-4563-BD49-12DFD210ED92', GETUTCDATE()
    PRINT 'Inserted ' + @FileName
END

運行python代碼時出現以下錯誤。

pypyodbc.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC SQL 
Server Driver][SQL Server]Must declare the scalar variable "@Id".')
DECLARE @XML XML;
DECLARE @FileName VARCHAR(1000);
DECLARE @Id UNIQUEIDENTIFIER 
SELECT @Id = NEWID()

流程以退出代碼1完成

注意:如果我從M / S SQL Management Studio(SQL Server 2016)運行sql查詢,它將成功運行。 任何幫助,將不勝感激。

關鍵是不要一次只執行一個命令,而是使用更簡單的方法將整個查詢傳遞給cursor.execute作為一個未編輯的腳本。

這樣做的好處是,您可以在MS Sql Server中完全開發/調試查詢,然后只需將該過程復制到文件中(當然,可以對傳遞參數進行簡單的調整)。

作為(帶有pyodbc的python 3.x)示例,我使用:

SQL_QueryName  = SQL_Folder + AllAreasReportName + ".sql"
Textfile = open( SQL_QueryName, 'r' )        
SQL_COMMANDS = Textfile.read()

cursor.execute( SQL_COMMANDS, ParameterList )  

pypyodbc應該使用相同的方法。

順便說一句,如果查詢必須出現在python過程中,請將整個查詢放在一個(三引號)字符串中,然后將該字符串傳遞給cursor.execute。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM