Puede usar una combinación para crear y completar la nueva tabla de una vez:
SELECT
t.*
INTO
dbo.NewTable
FROM
dbo.TableWithIdentity AS t
LEFT JOIN dbo.TableWithIdentity ON 1 = 0
;
Debido a la 1 = 0
condición, el lado derecho no tendrá coincidencias y, por lo tanto, evitará la duplicación de las filas del lado izquierdo, y como se trata de una unión externa, las filas del lado izquierdo tampoco se eliminarán. Finalmente, como se trata de una unión, se elimina la propiedad IDENTITY.
Seleccionar solo las columnas del lado izquierdo, por lo tanto, producirá una copia exacta de dbo.TableWithIdentity solo en términos de datos, es decir, con la propiedad IDENTITY despojada.
Dicho todo esto, Max Vernon ha planteado un punto válido en un comentario que vale la pena tener en cuenta. Si observa el plan de ejecución de la consulta anterior:
notará que la tabla fuente se menciona en el plan de ejecución solo una vez. La otra instancia ha sido eliminada por el optimizador.
Por lo tanto, si el optimizador puede establecer correctamente que el lado derecho de la combinación no es necesario en el plan, debería ser razonable esperar que en una versión futura de SQL Server pueda darse cuenta de que la propiedad IDENTITY no necesita ser eliminado tampoco, ya que ya no hay otra columna IDENTIDAD en el conjunto de filas de origen de acuerdo con el plan de consulta. Eso significa que la consulta anterior podría dejar de funcionar como se esperaba en algún momento.
Pero, como lo señaló correctamente ypercubeᵀᴹ , hasta ahora el manual ha declarado explícitamente que si hay una unión, la propiedad IDENTITY no se conserva:
Cuando se selecciona una columna de identidad existente en una nueva tabla, la nueva columna hereda la propiedad IDENTITY, a menos que [...] la instrucción SELECT contenga una unión.
Por lo tanto, mientras el manual lo siga mencionando, probablemente podamos estar seguros de que el comportamiento seguirá siendo el mismo.
Felicitaciones a Shaneis y ypercubeᵀᴹ por mencionar un tema relacionado en el chat.
JOIN (SELECT 1) AS dummy ON 1 = 1
Funcionaría también?CROSS JOIN (SELECT 1)
,INNER JOIN (SELECT 1) ON 1=1
,LEFT JOIN (SELECT 1) ON 1=0
OON 1=1
- no despoja a la IDENTIDAD. Parece que debe ser un objeto declarado o creado .Prueba este código ...
La
ISNULL
llamada asegura que la nueva columna se cree conNOT NULL
nulabilidad.fuente
ISNULL()
o el+0
que lo hace? ¿O se necesitan ambos?Solo para mostrar una forma diferente:
Puede usar un servidor vinculado .
Puede crear temporalmente un servidor vinculado al servidor local utilizando esto:
En ese momento, ejecutará el
select * into
código, haciendo referencia allocalserver
servidor vinculado de cuatro partes:Una vez que se complete, limpie el
localserver
servidor vinculado con esto:O podría usar la
OPENQUERY
sintaxisfuente
La propiedad de identidad no se transfiere si la instrucción select contiene una unión, y así
también dará el comportamiento deseado (de la
id
columna copiada para no mantener laIDENTITY
propiedad. Sin embargo, tendrá el efecto secundario de no copiar ninguna fila en absoluto (como con algunos otros métodos), por lo que deberá hacer lo siguiente:(gracias AakashM!)
fuente
La manera fácil es hacer que la columna sea parte de una expresión.
Ejemplo:
si la tabla dbo.Employee tiene una identidad en la columna ID, entonces, en el siguiente ejemplo, la tabla temporal #t también tendrá una IDENTIDAD en la columna ID.
Cambie esto para aplicar una expresión a ID y ya no tendrá una IDENTIDAD en la columna ID. En este caso, aplicamos una adición simple a la columna ID.
Otros ejemplos de expresiones para otros tipos de datos podrían incluir: convert (), concatenación de cadenas o Isnull ()
fuente
A veces, desea insertar desde una tabla donde no sabe (o no le importa) si la columna se creó con IDENTITY o no. Puede que ni siquiera sea una columna entera con la que esté trabajando. En este caso, lo siguiente funcionará:
ISNULL eliminará el atributo IDENTITY de la columna pero lo insertará con el mismo nombre y tipo que la columna original y también hará que no sea anulable. TOP (0) creará una tabla vacía que luego puede usar para insertar filas seleccionadas. También puede hacer que la tabla se comprima antes de insertar datos si es necesario.
fuente
eliminará la identidad.
La desventaja es que se
id
convierte en anulable, pero podría agregar esa restricción.fuente
Usted no
select * into
conserva la identidadfuente
*
.identity
propiedad no siempre se conserva, como señalaron otras respuestas.