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