【发布时间】: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