SQL Вставить несколько строк в ассоциацию таблиц 1: n

#sql #sql-server-2008 #loops #sql-server-2012

#sql #sql-server-2008 #циклы #sql-server-2012

Вопрос:

У меня есть 3 таблицы (упрощенные для вопроса), подобные следующим:

 Candidate
   - ID (primary key auto-numbered)
   - ProcessedOn
   - CandidateState

CandidateData
   - CandidateID
   - FieldKey
   - FieldValue

CandidateTransform
   - ID (primary key auto-numbered)
   - FieldKey 
   - FieldValue
  

CandidateTransform содержит данные, которые используются для заполнения CandidateData (т.е. FieldKey -> FieldKey и FieldValue -> Значение поля). Значение поля в CandeidateTransform содержит строку SQL, которая выбирает значение поля из другой базы данных / таблицы (информация о персонале) следующим образом:

 (SELECT firstName FROM Personnel WHERE id = @CandidateID)
  

Я мог сделать это ранее, поскольку мы одновременно обрабатывали только одного кандидата и создавали хранимую процедуру с инструкцией INSERT, подобной этой:

 DECLARE @NewCandidate TABLE (id bigint);

INSERT CloudRecruiting.Candidate (CandidateState, ActHdrKey, ActionProcessedOn, JobPostingID, Deleted)
OUTPUT INSERTED.CandidateKey INTO @NewCandidate
VALUES (0, 0, GETDATE(), @PlacementID, 0);

DECLARE @ID bigint;
SET @ID = (SELECT id FROM @NewCandidate);

DECLARE @CandidateID bigint;
SET @CandidateID = (SELECT candidate FROM Personnel WHERE id = @PlacementID);

INSERT INTO .CandidateData (CandidateKey, FieldKey, FieldValue) 
    VALUES (@ID, 1128, (SELECT ISNULL(LEFT(CONVERT(VARCHAR, dateOfBirth, 120), 10), '') FROM Personnel WHERE id = @CandidateID))
    , (@ID, 1159, (SELECT email FROM Personnel WHERE id = @CandidateID))
    , (@ID, 1284, (SELECT ssn FROM Personnel WHERE id = @CandidateID))
    , (@ID, 1303, CAST((SELECT payRate FROM Personnel WHERE id = @PlacementID) as nvarchar(MAX)))
    , (@ID, 1169, (SELECT firstName FROM Personnel WHERE id = @CandidateID))
    , (@ID, 1229, (SELECT middleName FROM Personnel WHERE id = @CandidateID))
    , (@ID, 1219, (SELECT lastName FROM Personnel WHERE id = @CandidateID))
    (etc.)
  

Теперь мы хотим сделать процесс более надежным, сохранив инструкции SELECT в таблице (CandidateTransform), которую клиент может изменять и иметь возможность обрабатывать несколько кандидатов в одном пакете с помощью хранимой процедуры, подобной этой (в настоящее время у нас есть SQL, который фиксирует идентификаторы кандидатов, которые нам нужно обработать, и сохраняет их во временной таблице) :

 for each (candidateID in tempTable)
   create entry in Candidate
   capture new id number from Candidate

   for each (sql in CandidateTransform)
      execute sql script
      store value in CandidateData with the new id, FieldKey and FieldValue
   end
end
  

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

Комментарии:

1. В принципе, то, что вы можете сделать с одной строкой, вы можете сделать с несколькими строками одновременно. Таким образом, вместо того, чтобы работать только с одной строкой, вы должны иметь возможность выбрать из / присоединиться к TempTable, а затем выполнить то же самое output inserted .... , что вы уже делаете со всеми строками за один раз

2. Более серьезная проблема заключается в том, как мне сохранить инструкции SLEECT, которые в настоящее время содержатся в инструкции INSERT, в таблице и прочитать все строки, чтобы получить нужные мне данные.

3. Вероятно, вам потребуется динамически создавать свой запрос на основе тех инструкций / данных, которые может изменить клиент. Итак, если вы сохраняете эти данные, затем добавьте их к остальной части вашего запроса и выполните его в виде строки.