Есть ли способ повторно использовать переменные во время выполнения? - PullRequest
0 голосов
/ 15 апреля 2019

Я работаю над некоторыми сценариями ETL и столкнулся с проблемой, когда использую инструкцию MERGE.Я использую executemany для запуска сценария SQL, который выглядит следующим образом:

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.Вы не можете повторно использовать свойства так, как я это сделал, потому что ? s заполнены свойствами из фрейма данных, и я не могу найти способ повторно использовать свойства.

Насколько я понимаю, мойпоследнее усилие по канаве должно было использовать цикл for для итерации по фрейму данных и выполнения одиночного выполнения в каждой строке.На мой взгляд, это единственный способ, которым я могу назначить некоторые переменные, чтобы затем использовать их для построения моего SQL-запроса, однако я хотел бы знать, есть ли более простой или лучший способ сделать это.

1 Ответ

2 голосов
/ 15 апреля 2019

Да. Вы можете назначить параметры локальным переменным и использовать их повторно:

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...;

Ключевым параметром здесь является то, что вы отправляете пакет TSQL на SQL Server. Это не должно быть одно утверждение.

Однако, если вы хотите отправить много данных на SQL Server, вы также можете просто отправить документ JSON с помощью одного параметра NVarchar (max) и проанализировать его в таблице, используя OPENJSON на сервер. Это позволило бы вам отправить всю таблицу данных на SQL Server для использования в MERGE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...