有没有一种方法可以在执行期间重用变量?

时间:2019-04-15 17:25:49

标签: python sql sql-server pandas

我正在处理一些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语句中使用,也可以在SELECTINSERT语句中使用。您无法以完成操作的方式重复使用属性,因为UPDATE顺序填充了数据帧中的属性,而且我找不到重新使用属性的方法。

根据我的理解,我最后的努力应该是使用?循环来遍历数据帧并在每一行上执行一次执行。在我看来,这是我可以分配一些变量然后用于构建SQL查询的唯一方法,但是,我很想知道是否有更简单或更完善的方法来解决这个问题。

1 个答案:

答案 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中使用。