dado una tabla que tiene tres columnasINSERT INTO que la columna no identidad ID de clave copia filas y auto-incrementos
- ID (clave principal, no-autoincremental)
- GroupID
- SomeValue
Estoy tratando de escribir una sola instrucción SQL INSERT INTO que hará una copia de cada fila que tenga un GroupID en un nuevo GroupID.
Ejemplo tabla que comienza:
ID | GroupID | SomeValue
------------------------
1 | 1 | a
2 | 1 | b
meta después de ejecutar un INSERT sencilla INTO:
ID | GroupID | SomeValue
------------------------
1 | 1 | a
2 | 1 | b
3 | 2 | a
4 | 2 | b
pensé que podría hacer algo como:
INSERT INTO MyTable
( [ID]
,[GroupID]
,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
,@NewGroupID
,[SomeValue]
FROM MyTable
WHERE ID = @OriginalGroupID
)
Esto provoca una Violación PrimaryKey ya que terminará reutilizando el mismo valor Max (ID) +1 varias veces como parece.
¿Es mi único recurso a un grupo de instrucciones INSERT en una instrucción WHILE de T-SQL que tiene un valor de Contador incrementado?
Tampoco tengo la opción de convertir la ID en una columna de identidad de incremento automático, ya que no tendría código fuente de ruptura.
es mejor para mover subconsulta (especialmente si se trata de uno de cálculo de tiempo) para unirse, es más performante. si en cualquier caso, otras respuestas son lentas, puede usar el mío –
@Michael: 'SQL Server' es lo suficientemente inteligente como para calcular la expresión de esa manera una sola vez. – Quassnoi
@Quassnoi: en cuanto a rendimiento, siempre me siento incómodo con las subconsultas en la proyección de datos. No es ciencia de cohetes mover la subconsulta en la sección UNIR de ninguna manera. De todas formas, haré un perfil en SQL Server más tarde –