似乎您可以使用表类型参数来执行此操作。我会注意到我的 Python 不是很好,所以我不知道您是否可以在不使用存储过程的情况下 做到这一点。
不管怎样,首先让我们创建一个示例表:
CREATE TABLE dbo.SomeTable (ID int IDENTITY(1,1),
SomeString varchar(10),
SomeInt int,
SomeDate date,
SomeGUID uniqueidentifier);
GO
然后是样本类型。我故意省略了SomeGUID:
CREATE TYPE dbo.SomeType AS table (SomeString varchar(10),
SomeInt int,
SomeDate date);
然后您需要创建一个接受上述TYPE 作为参数的过程。在下面,我为SomeGUID 定义了整个数据集的静态值,以证明所有行都插入到对最终结果集中的 proc 的一次调用中:
CREATE OR ALTER PROC dbo.SomeProc @SomeData dbo.SomeType READONLY AS
BEGIN
DECLARE @UID uniqueidentifier = NEWID();
INSERT INTO dbo.SomeTable (SomeString, SomeInt, SomeDate, SomeGUID)
SELECT SomeString,
SomeInt,
SomeDate,
@UID
FROM @SomeData;
END;
GO
现在是蟒蛇。为此,我编写了下面的简单脚本,参考this answer 寻求帮助。我已经包含了完整的工作解决方案的整个脚本,但显然有些不适用于您的脚本,并且您可能没有使用环境文件:
#!/usr/bin/env python3
#Import the bare minimums for this to work
import pyodbc, os
from dotenv import load_dotenv
#Get the details from my environemental file
load_dotenv()
SQLServer = os.getenv('SQL_SERVER')
SQLDatabase = os.getenv('SQL_DATABASE')
SQLLogin = os.getenv('SQL_LOGIN')
SQLPassword = os.getenv('SQL_PASSWORD')
#Create the full connection string
SQLConnString = 'Driver={ODBC Driver 17 for SQL Server};Server=' + SQLServer + ';Database=' + SQLDatabase + ';UID='+ SQLLogin +';PWD=' + SQLPassword
#Define the data that is going to be inserted into the table.
MyData = [('abc',1,'20200527'),('def',2,'20210527')]
#Turn it into a tuple. explained in https://stackoverflow.com/a/61156422/2029983
params = (MyData,)
#And then execute the procedure, passing params as the parameters; which is a table
with pyodbc.connect(SQLConnString,timeout=20) as sqlConn:
with sqlConn.cursor() as cursor:
cursor.execute('EXEC dbo.SomeProc ?;', params)
sqlConn.commit()
然后,当我运行 SELECT * FROM dbo.SomeTable 时,我得到以下数据:
| ID |
SomeString |
SomeInt |
SomeDate |
SomeGUID |
| 1 |
abc |
1 |
2020-05-27 |
945a3656-54ee-47a2-962c-7a34c7f50635 |
| 2 |
def |
2 |
2021-05-27 |
945a3656-54ee-47a2-962c-7a34c7f50635 |