首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取pypyodbc.ProgrammingError:('42000','[42000] [微软][ODBC SQL Server驱动程序][SQL Server]必须声明标量变量“@Id”。‘)

获取pypyodbc.ProgrammingError:('42000','[42000] [微软][ODBC SQL Server驱动程序][SQL Server]必须声明标量变量“@Id”。‘)
EN

Stack Overflow用户
提问于 2017-10-04 00:32:05
回答 1查看 6.4K关注 0票数 1

我正在尝试从Python3执行.sql文件。下面是我正在尝试的python代码

代码语言:javascript
复制
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脚本

代码语言:javascript
复制
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代码时,我得到了下面的错误。

代码语言:javascript
复制
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查询,它会成功运行。在这方面的任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 02:17:49

关键是不要一次执行一个命令,而是使用一种更简单的方法,将整个查询作为一个未经编辑的脚本传递给cursor.execute。

这样做的好处是,您可以在MS Sql Server中完全开发/调试查询,然后将该过程复制到一个文件中(当然,对传递参数进行简单的调整)。

作为(python 3.x,with pyodbc)示例,我使用:

代码语言:javascript
复制
SQL_QueryName  = SQL_Folder + AllAreasReportName + ".sql"
Textfile = open( SQL_QueryName, 'r' )        
SQL_COMMANDS = Textfile.read()

cursor.execute( SQL_COMMANDS, ParameterList )  

同样的方法也适用于pypyodbc。

顺便说一句,如果查询必须出现在python过程中,请将整个查询放在一个(三重引号)字符串中,并将该字符串传递给cursor.execute。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46549358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档