Esto es bastante fácil de lograr, pero debe hacer un seguimiento de todo sobre la marcha. Por lo general, creo un solo SP para esto, que toma como entrada el cuestionario para copiar.
DECLARE @newQuestionnaireId INT
INSERT INTO Questionnaire
(Id,Description)
SELECT Id, Description
FROM Questionnaire
WHERE ID = @sourceQuestionnaireID
SET @newquestionnaireId = SCOPE_IDENTITY()
En este punto, tiene un nuevo registro de encabezado y el Id generado recientemente para la copia. El siguiente paso es cargar las categorías en una tabla temporal que tiene un campo adicional para el nuevo Id
DECLARE @tempCategories TABLE (id INT, description VARCHAR(50),newId INT)
INSERT INTO @tempCategories(id,description)
SELECT id, description FROM Category
WHERE questionnaireId = @sourceQuestionnaireId
Ahora, usted tiene una tabla temporal con todas las categorías de insertar, junto con un campo para rellenar el nuevo ID para esta categoría Use un cursor para recorrer la lista que inserta el nuevo registro, y use una llamada SCOPE_IDENTITY similar para rellenar el nuevo Id.
DECLARE cuCategory CURSOR FOR SELECT Id, Description FROM @tempCategories
DECLARE @catId INT, @catDescription, @newCatId INT
OPEN cuCategory
FETCH NEXT FROM cuCategory INTO @catId,@catDescription
WHILE @@FETCH_STATUS<>0
BEGIN
INSERT INTO Category(description,questionnaireId)
VALUES(@catDescription,@newQuestionnaireId)
SET @newCatId = SCOPE_IDENTITY()
UPDATE @tempCategories SET [email protected]
WHERE [email protected]
FETCH NEXT FROM cuCategory INTO @catId,@catDescription
END
CLOSE cuCategory
DEALLOCATE cuCategory
En este punto se tienen ahora una tabla temporal que mapea la catId del cuestionario original a la catId para el nuevo cuestionario. Esto puede usarse para llenar la mesa final de la misma manera, que dejaré como ejercicio para ti, pero no dudes en publicar aquí si tienes dificultades.
Por último, sugiero que toda esta operación se lleve a cabo dentro de una transacción para salvarlo de la mitad de las copias completadas cuando algo sale mal.
Un par de descargos de responsabilidad: todo lo anterior se escribió rápidamente, no espere que funcione sin problemas. En segundo lugar, he supuesto que todos sus PK son campos de identidad, ¡lo que deberían ser! Si no son simplemente, reemplace las llamadas SCOPE_IDENTITY() con la lógica apropiada para generar el siguiente ID.
Editar: documentation for Cursor operations can be foundhere
Realmente no ver el problema aquí ... sólo tienes que copiar los datos e insertar el uso de 'SET_IDENTITY_INSERT [Tabla A] ON' mismo para B y C. Si – Jamiec
inserte un registro en la tabla A, este registro obtenga una ID, digamos 104. Entonces, tengo que insertar una nueva fila en la tabla B, que tiene una referencia a la tabla A, por lo que table_A_id debe ser el mismo: 104 – Martijn
No debería ser un problema, siempre que esté copiando a donde sea que esté copiando, ya que los nuevos datos tendrán las mismas PK usando IDENTITY_INSERT. ¿A dónde estás tratando de copiar? ¿Otra base de datos idéntica quizás? – Jamiec