Как я могу скопировать данные с помощью T-SQL? - PullRequest
1 голос
/ 11 июня 2009

У меня есть таблицы с именами Categories, Questions и Selections. Соотношение таблиц: может быть 1 или более Selections в Question и может быть один или несколько Questions в Category.

Столбцы таблицы следующие:

Категория
- CategoryID (шт.)
- Имя

Вопросы
- QuestionID (pk)
- вопрос
- CategoryID (fk)

Выбор
- SelectionID (pk)
- Выбор
- QuestionID (fk)

Я хочу преобразовать этот код из C # в SQL:

private int fromCategoryID = 1;
private int toCategoryID = 2;

Category cat1 = new Category(); //this is the category we will get questions from.
Category cat2 = new Category(); //this is the category we copy the questions to.

// code to populate the 2 category instances and their children (Questions) and
// children's children (Selections) removed for brevity.

// copy questions and selections from cat1 to cat2
foreach(Question q from cat1.Questions)
{
Question newQuestion = new Question();
newQuestion.Question = q.Question;

foreach(Selection s in q.Selections)
{
Selection newSelection = new Selection();
newSelection.Selection = s.Selection;

q.Selections.Add(newSelection);
}

cat2.Questions.Add(newQuestion);
}

Как это можно сделать в SQL?

Ответы [ 3 ]

2 голосов
/ 11 июня 2009

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

declare @FromCategoryId int
declare @NewCategoryId int

set @NewCategoryId = 3
set @FromCategoryId = 2

insert into Questions 
select Question, @NewCategoryId
from Questions
where CategoryId = @FromCategoryId

insert into Selections
select S.Selection, QNew.QuestionId
from Questions QOld
join Questions QNew
on QOld.Question = QNew.Question
and QOLD.CategoryId = @FromCategoryId
and QNEW.CategoryId = @NewCategoryId
join Selections S
on S.QuestionId = QOld.QuestionId

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

1 голос
/ 11 июня 2009

Если предположить, что 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
1 голос
/ 11 июня 2009

Синтаксис вставки / выбора в T-SQL может дать вам начало:

Вы можете выбрать определенные столбцы из таблицы вместе с некоторыми ручными значениями и вставить их обратно в таблицу:

Вот простой пример (вероятно, не совсем то, что вы хотите):

insert into [Questions] (Question, CategoryID)
select Question, @Category2ID
from [Questions]
where CategoryID = @Category1ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...