2012-03-21 8 views
12

Mis pruebas parecen confirmar que¿INSERT INTO ... SELECT ... siempre coincide con los campos por posición ordinal?

INSERT INTO a (x, y) SELECT y, x FROM b 

mapas b.y a a.x, es decir, los campos se corresponden solamente por la posición ordinal y no por su nombre. ¿Es este el caso siempre, es decir, puedo confiar en ese comportamiento? Desafortunadamente, the documentation no especifica esto (o no lo encontré).

+2

creo que siempre es ordinal –

+0

Considere si b no tenía ya sea x o y. Ordinal es la única forma que tiene sentido. INSERT INTO a (x, y) SELECCIONE f, g DESDE b – Paparazzi

Respuesta

12

Correcto, SQL Server no intenta hacer ningún mapeo de los nombres de las columnas ya que puede aplicar cualquier alias a los datos de origen que desee. Siempre referenciará la posición ordinal.

3

Sí. Es porque no está utilizando la posición ordinal, solo está resolviendo la consulta por partes. Primero seleccione de b, sin tener en cuenta los nombres de las columnas, ya que SQL no resuelve las cosas usando los nombres de las columnas (puede hacer combinaciones de diferentes nombres de columnas). Luego agregará los datos a a, de la misma manera que especifica la selección en b. De hecho, si cambia el orden, se insertará en otro orden;) ..

+0

+1 "porque no está utilizando la posición ordinal" – onedaywhen

7

Sí, está en lo cierto.

El orden de los campos en la declaración INSERT INTO no necesita coincidir con la definición de la tabla.

Pero los nombres de alias/campos de SELECT se ignorarán y los valores se insertarán en los campos nombrados por la instrucción INSERT INTO.

CREATE TABLE test (
    a  AS INT, 
    b  AS INT, 
    c  AS INT 
) 
INSERT INTO 
    test (
    b, 
    c, 
    a 
) 
SELECT 
    1 AS a, 
    2 AS b, 
    3 AS c 

SELECT * FROM test 

a | b | c 
---+---+--- 
3 | 1 | 2 
Cuestiones relacionadas