我正在处理一些ETL脚本,但是在使用MERGE语句时遇到了问题。我正在使用lis=[2,3,5,6,7,8,0,4,2,5,6,8,9,4,2,]
for index, value in enumerate(lis[:-1]): #don't go all the way to the end because you're comparing with the next
if lis[index+1]-value <= 1: #you wanted less than, right?
print (value)
运行如下所示的SQL脚本:
executemany
这里的问题是我需要在多个地方使用MERGE myTable as target
USING (
SELECT myID from myTable
WHERE myID = ?
) AS source (myID) ON (target.myID = source.myID)
WHEN NOT MATCHED THEN
INSERT (myID, myName, myProperty, myOtherProperty)
VALUES(?, ?, ?, ?)
WHEN MATCHED THEN
UPDATE SET myName=?, myProperty=?, etc...;
属性。既可以在myID
语句中使用,也可以在SELECT
和INSERT
语句中使用。您无法以完成操作的方式重复使用属性,因为UPDATE
顺序填充了数据帧中的属性,而且我找不到重新使用属性的方法。
根据我的理解,我最后的努力应该是使用?
循环来遍历数据帧并在每一行上执行一次执行。在我看来,这是我可以分配一些变量然后用于构建SQL查询的唯一方法,但是,我很想知道是否有更简单或更完善的方法来解决这个问题。
答案 0 :(得分:2)
是的。您可以将参数分配给局部变量并重用它们:
declare @myId int = ?;
declare @myName nvarchar(200) = ?;
declare @myProperty float = ?;
declare @myOtherProperty datetime2(7) = ?;
MERGE myTable as target
USING (
SELECT myID from myTable
WHERE myID = @myId
) AS source (myID) ON (target.myID = source.myID)
WHEN NOT MATCHED THEN
INSERT (myID, myName, myProperty, myOtherProperty)
VALUES(@myId, @myName, @myProperty, @myOtherProperty)
WHEN MATCHED THEN
UPDATE SET myName=@myName, myProperty=@myProperty, etc...;
此处的关键推动因素是您要向SQL Server发送TSQL批处理。不必是单个语句。
但是,如果要向SQL Server发送大量数据,也可以仅使用单个NVarchar(max)参数发送JSON文档,然后使用服务器上的OPENJSON将其解析为表。这样一来,您就可以将整个数据表发送到SQL Server,以便在MERGE中使用。