обновить хранимую процедуру с помощью оператора слияния + выбора - PullRequest
0 голосов
/ 19 июня 2020

Я следую приведенному ниже подходу для выполнения операции Upsert. Проблема в том, что мне также нужно выполнить выбор, чтобы получить уникальный идентификатор, который должен использоваться в операторе вставки.

Кажется, что этот выбор должен быть в части USING прямо под строкой MERGe, однако я не могу найти способ работать с обоими (выбранный / предоставленный тип параметра)

текущий

CREATE PROCEDURE spUpsertEmployee @employee EmployeeType READONLY
AS
BEGIN
  MERGE employee AS target_sqldb
  USING @employee AS source_tblstg
  ON (target_sqldb.employee_id = source_tblstg.RowKey)
  WHEN MATCHED THEN
      UPDATE SET 
      department = source_tblstg.PartitionKey,
      first_name = source_tblstg.FirstName,
      last_name = source_tblstg.LastName,
      gender = source_tblstg.Gender,
      role = source_tblstg.Role
  WHEN NOT MATCHED THEN
      INSERT (
          employee_id,
          department,
          first_name,
          last_name,
          gender,
          role
        )
      VALUES (
          source_tblstg.RowKey,
          source_tblstg.PartitionKey,
          source_tblstg.FirstName,
          source_tblstg.LastName,
          source_tblstg.Gender,
          source_tblstg.Role
        );
END

желаемый

CREATE PROCEDURE spUpsertEmployee @employee EmployeeType READONLY
AS
BEGIN
  MERGE employee AS target_sqldb
  USING @employee AS source_tblstg
  ON (target_sqldb.employee_id = source_tblstg.RowKey)
  WHEN MATCHED THEN
      UPDATE SET 
      department = source_tblstg.PartitionKey,
      first_name = source_tblstg.FirstName,
      last_name = source_tblstg.LastName,
      gender = source_tblstg.Gender,
      role = source_tblstg.Role
  WHEN NOT MATCHED THEN
      INSERT (
          employee_id,
          department,
          id,
          first_name,
          last_name,
          gender,
          role
        )
      VALUES (
          source_tblstg.RowKey,
          source_tblstg.PartitionKey,
          (SELECT TOP 1 ID FROM OTHER_TABLE),
          source_tblstg.FirstName,
          source_tblstg.LastName,
          source_tblstg.Gender,
          source_tblstg.Role
        );
END
...