Если предположить, что QuestionID и SelectionID являются IDENTITY
столбцами, вы можете сделать что-то простое, например:
INSERT INTO Questions (Question,CategoryID)
SELECT q.Question, 2
FROM Questions q
WHERE q.CategoryID = 1
, который скопировал бы все Вопросы из Категории 1 в Категория 2.
Проблема связана с копированием Выборов, поскольку у вас нет способа связать Вопрос с его Выбором. Таким образом, вы можете сказать: «Принесите мне все варианты ответов по всем Вопросам в категории 1», но у вас нет возможности узнать новые идентификаторы QuestionID для этих Вопросов в категории 2.
Основываясь на предоставленной вами схеме, я бы решил написать хранимую процедуру, которая перебирает вопросы, которые вы хотите скопировать, точно так же, как ваш псевдокод C #. В то время как некоторые люди ненавидят мысль об использовании CURSOR в T-SQL, для такой ситуации она была создана. Грубый удар в темноте (непроверенный) будет выглядеть примерно так:
CREATE PROCEDURE PrcCopyQuestions (
@CategoryID_from NUMERIC
@CategoryID_to NUMERIC
)
AS
DECLARE
@old_QuestionID NUMERIC(10,0)
@new_QuestionID NUMERIC(10,0)
@Question VARCHAR(255)
DECLARE c_questions CURSOR FOR
SELECT QuestionID, Question
FROM Questions
WHERE CategoryID = @CategoryID_from
FOR READ ONLY
BEGIN
OPEN c_questions
WHILE (1=1)
BEGIN
FETCH c_questions INTO @old_QuestionID, @Question
IF @@SQLSTATUS <> 0 BREAK
INSERT INTO Questions (Question,CategoryID)
SELECT @Question, @CategoryID_to
SELECT @new_QuestionID = @@IDENTITY
INSERT INTO Selections (Selection, QuestionID)
SELECT s.Selection, @new_QuestionID
FROM Selections s
WHERE QuestionID = @old_QuestionID
END
CLOSE c_questions
DEALLOCATE CURSOR c_questions
END