【问题标题】:Executing Dynamic SQL using Python but receiving exceptions使用 Python 执行动态 SQL 但收到异常
【发布时间】:2019-11-21 20:48:18
【问题描述】:

我有以下动态 SQL 脚本,它在 SQL Server 上运行没有问题。

DECLARE 
@file_type_id int = 1,
@filing_id bigint = 57,
@created_at datetime = GETDATE(),
@created_by bigint = 2,
@is_required bit = 1,
@insertquery nvarchar(MAX),
@Filepath nvarchar(MAX) = 'C:\SampleTestFiles\MyWordDoc.doc';

SET @insertquery = 
'DECLARE @Document AS VARBINARY(MAX);
 SELECT @Document = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET( BULK ' + QUOTENAME(@filepath,'''') +', SINGLE_BLOB ) AS Doc; 
 INSERT INTO [TEST].[dbo].[MyTable]  ( [file_type_id], [file],  [file_name], [filing_id], [created_at], [created_by], [is_required])
 VALUES (@file_type_id, @Document, @file_name, @filing_id , @created_at, @created_by, @is_required);';

EXEC sp_executesql 
@insertquery, 
N'@file_name varchar(100),@file_type_id int,@filing_id bigint,@created_at datetime, @created_by bigint,@is_required bit',
@file_name, @file_type_id, @filing_id, @created_at, @created_by, @is_required;

我正在尝试使用 Python 执行相同的 SQL,但它没有运行并且在 Python IDE 中出现很多语法错误。请有人帮我纠正 Python 代码。

filepath = 'C:\SampleTestFiles\MyWordDoc.doc'
file_type_id = 1
file_name = 'test'
filing_id = 57
created_at = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
created_by = 1
is_required = 1

Query = '''
SET @insertquery = 
DECLARE @Document AS VARBINARY(MAX);
SELECT @Document = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET( BULK \' + QUOTENAME(?,\'\'\'\') +\', SINGLE_BLOB) AS Doc;
INSERT INTO[TEST].[dbo].[MyTable]([file_type_id], [file], [file_name], [filing_id], [created_at], [created_by], [is_required])
VALUES(?,@Document, ?, ?, ?, ?, ?)
        '''
values = (filepath, file_type_id, file_name, filing_id, created_at, created_by, is_required)

# Execute SQL Insert Query
cursor = conn.cursor()
cursor.execute(Query, values)
cursor.close()
conn.commit()
print("File inserted..")

【问题讨论】:

  • 如果您遇到语法问题,您应该告诉我们这些是什么。
  • @Larnu:这也是你今天早些时候解决的问题:stackoverflow.com/questions/58977442/…我正在尝试使用 Python 执行相同的 SQL 代码。
  • 我认识到我自己的动态 SQL 风格,不用担心。但这并不能告诉我们您遇到的错误。
  • 我认为这是错误:filepath = 'C:\SampleTestFiles\MyWordDoc.doc',应该是 filepath = 'C:\\SampleTestFiles\\MyWordDoc.doc'
  • 成功了!我将 BULK 语句中的路径硬编码为: (BULK 'C:\\SampleTestFiles\\MyWordDoc.doc', SINGLE_BLOB) 现在我想看看是否可以用 python 中的变量替换路径。

标签: python sql sql-server pyodbc


【解决方案1】:

错误是有道理的:

每个问号“?”是一个参数。在

Query = '''
SET @insertquery = 
DECLARE @Document AS VARBINARY(MAX);
SELECT @Document = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET( BULK \' + QUOTENAME(?,\'\'\'\') +\', SINGLE_BLOB) AS Doc;
INSERT INTO[TEST].[dbo].[MyTable]([file_type_id], [file], [file_name], [filing_id], [created_at], [created_by], [is_required])
VALUES(?,@Document, ?, ?, ?, ?, ?) 

你有 6 个。 values = (filepath, file_type_id, file_name,filing_id, created_at, created_by, is_required) 提供参数列表,包含7个值。

如果你问我

VALUES(?,@Document, ?, ?, ?, ?, ?) 

应该

VALUES(?,?, ?, ?, ?, ?, ?) 

然后参数标记的计数将与提供的计数匹配

【讨论】:

  • 第7个参数,我用的是:`QUOTENAME(?,\'\'\'\')`
  • 您在此也删除了一些需要的单引号 ('),导致查询本身不再有效。
猜你喜欢
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 2021-07-27
  • 1970-01-01
相关资源
最近更新 更多