Esta pregunta se acerca a lo que necesito, pero mi escenario es ligeramente diferente. La tabla de origen y la tabla de destino son las mismas y la clave primaria es un identificador único (guid). Cuando intento esto:
insert into MyTable
select * from MyTable where uniqueId = @Id;
Obviamente obtengo una violación de restricción de clave principal, ya que intento copiar sobre la clave primaria. En realidad, no quiero copiar la clave primaria en absoluto. Más bien, quiero crear uno nuevo. Además, me gustaría copiar selectivamente ciertos campos y dejar los otros nulos. Para hacer las cosas más complejas, necesito tomar la clave primaria del registro original e insertarla en otro campo en la copia (campo Id anterior).
Estoy seguro de que hay una solución fácil para esto, simplemente no conozco suficiente TSQL para saber qué es.
fuente
Ok, sé que es un problema antiguo pero publico mi respuesta de todos modos.
Me gusta esta solución Solo tengo que especificar las columnas de identidad.
La columna "id" es la columna de identidad y esa es la única columna que tengo que especificar. Es mejor que al revés de todos modos. :-)
Yo uso SQL Server. Es posible que desee utilizar "
CREATE TABLE
" y "UPDATE TABLE
" en la fila 1 y 2. Hmm, vi que en realidad no le di la respuesta que él quería. Él quería copiar la identificación a otra columna también. Pero esta solución es buena para hacer una copia con una nueva identificación automática.Edito mi solución con las ideas de Michael Dibbets.
Puede soltar más de una columna separándolas con un ",". El: id debe reemplazarse con el id de la fila que desea copiar. MyDatabase, MyTable e IndexField deben reemplazarse con sus nombres (por supuesto).
fuente
TempTable
, ¿no sería mejor usarlo#TempTable
, por lo que es una verdadera tabla temporal?use MyDatabase; SELECT * INTO #TempTable FROM [TABLE] WHERE [indexfield] = :id; ALTER TABLE #TempTable DROP COLUMN [indexfield]; INSERT INTO [TABLE] SELECT * FROM #TempTable; DROP TABLE #TempTable;
esta manera, sé que se limpiará lo antes posible sin demoras al escribir un archivo intermitente en el disco.$identity
si no desea codificar el nombre de su columna de identidadSupongo que estás tratando de evitar escribir todos los nombres de columna. Si está usando SQL Management Studio, puede hacer clic con el botón derecho en la tabla y en Script As Insert .. luego puede jugar con esa salida para crear su consulta.
fuente
Especifique todos los campos excepto su campo ID.
fuente
Tengo el mismo problema en el que quiero que un solo script funcione con una tabla que tiene columnas agregadas periódicamente por otros desarrolladores. No solo eso, sino que estoy respaldando muchas versiones diferentes de nuestra base de datos, ya que es posible que no todos los clientes estén actualizados con la versión actual.
Tomé la solución de Jonas y la modifiqué un poco. Esto me permite hacer una copia de la fila y luego cambiar la clave principal antes de volver a agregarla a la tabla fuente original. Esto también es muy útil para trabajar con tablas que no permiten valores NULL en columnas y no desea tener que especificar el nombre de cada columna en INSERT.
Este código copia la fila de 'ABC' a 'XYZ'
Una vez que haya terminado, suelte la tabla temporal.
fuente
Sé que mi respuesta llega tarde a la fiesta. Pero la forma en que resolví es un poco diferente a todas las respuestas.
Tuve una situación, necesito clonar una fila en una tabla, excepto algunas columnas. Esos pocos tendrán nuevos valores. Este proceso debería ser compatible automáticamente con futuros cambios en la tabla. Esto implica, clonar el registro sin especificar ningún nombre de columna.
Mi enfoque es
fuente
fuente
Si "clave" es su campo PK y es autonumérico.
generará un nuevo registro, copiando campo1 y campo2 del registro original
fuente
Mi tabla tiene 100 campos, y necesitaba una consulta para simplemente funcionar. Ahora puedo cambiar cualquier número de campos con alguna lógica condicional básica y no preocuparme por su posición ordinal.
Reemplace el nombre de la tabla a continuación con el nombre de su tabla
Reemplace el nombre del campo de identidad original con su nombre de campo PK
Reemplace los nombres de la tabla nuevamente (tanto el nombre de la tabla de destino como el nombre de la tabla de origen); edita tus
where
condicionesfuente
Puedes hacer así:
Allí, en lugar de 112, debe colocar un número de identificación máxima en la tabla DENI / FRIEN01P.
fuente
Así es como lo hice usando ASP classic y no pude hacer que funcionara con las respuestas anteriores y quería poder copiar un producto en nuestro sistema a un nuevo product_id y lo necesitaba para poder funcionar incluso cuando agregue más columnas a la tabla.
fuente