2012-03-21 14 views
12

moich testów wydają się potwierdzać, żeCzy INSERT TO ... SELECT ... zawsze pasuje do pól po pozycji porządkowej?

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

mapy b.y do a.x, to pola są dopasowane tylko przez porządkowej pozycji, a nie według nazwy. Czy zawsze tak jest, tzn. Czy mogę polegać na tym zachowaniu? Niestety, the documentation nie określa tego (lub nie znalazłem).

+2

Myślę, że zawsze jest porządkowa –

+0

Zastanów się, czy b nie ma ani x, ani y. Zwykły to jedyny sposób, który ma sens. INSERT INTO a (x, y) SELECT f, g FROM b – Paparazzi

Odpowiedz

12

To prawda, SQL Server nie próbuje mapować nazw kolumn, ponieważ można zastosować aliasy do danych źródłowych, które lubisz. Zawsze będzie odnosić się do pozycji porządkowej.

3

Tak. To dlatego, że nie używa pozycji porządkowej, to po prostu rozdziela zapytanie według części. Najpierw wybierz z b, nie biorąc pod uwagę nazw kolumn, ponieważ SQL nie rozwiązuje problemów przy użyciu nazw kolumn (możesz tworzyć sprzężenia o różnych nazwach kolumn). Następnie doda dane do, w ten sam sposób, w jaki określisz wybór w b. W rzeczywistości, jeśli zmienisz zamówienie, zostanie ono wstawione w innej kolejności;) ..

+0

+1 "ponieważ nie używa pozycji porządkowej" – onedaywhen

7

Tak, masz rację.

Kolejność pól w instrukcji INSERT INTO nie musi być zgodna z definicją tabeli.

Jednak nazwy alias/pola SELECT zostaną zignorowane, a wartości wstawione do pól określonych w instrukcji 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