2013-12-16 7 views
2

При вставке данных в таблицу SQL Server можно указать, в какой столбец вы хотите вставить данные?SQL: как вставить данные в таблицу с именами столбцов

Для таблицы с

Я знаю, что вы можете иметь синтаксис, как это:

INSERT INTO MyTable (Name, col4_on, col8_on, col9_on) 
VALUES ('myName', 0, 1, 0) 

Но выше синтаксис становится громоздким, когда у вас есть много столбцов, особенно если они имеют двоичные данные. Трудно совпадение, с которым 1 и 0 идут с каким столбцом. Я надеюсь, что есть именованные параметры как синтаксис (похожи на то, что C# имеет), который выглядит следующим образом:

INSERT INTO MyTable 
VALUES (Name: 'myName', col4_on: 0, col8_on: 1, col9_on: 0) 

Благодарность

+2

Я думаю, что первые из них является единственным способом сделать это. В чем разница между необходимостью ввода имен столбцов в сценарии 1 и сценарии 2? Такое же количество работы, на мой взгляд. Кроме того, вам даже не нужны имена столбцов. – PaulG

+0

ЕСЛИ у вас есть столько столбцов, что это проблема, это может быть проблема с дизайном db. Просто сохраните имена столбцов в txt, copy-paste. – Mihai

ответ

0

Я выяснил путь вокруг этого, но это r Ather Hacky и работает только для таблиц, в которых есть столбцы с уникальными значениями:

INSERT INTO MyTable (Name) 
VALUES ('myName') 
UPDATE MyTable 
SET col4_on=0, col8_on=1, col9_on=0 
WHERE Name = 'myName' 

Это может быть разложено в многократную вставку строки следующим образом:

INSERT INTO MyTable (Name) 
VALUES ('row1'), ('row2'), ('row3') 
UPDATE MyTable SET col4_on=0, col8_on=1, col9_on=0 WHERE Name = 'row1' 
UPDATE MyTable SET col4_on=1, col8_on=0, col9_on=0 WHERE Name = 'row2' 
UPDATE MyTable SET col4_on=1, col8_on=1, col9_on=1 WHERE Name = 'row3' 
0

Не вы не можете сделать это, единственной альтернативой для вас будет вставки из отборной

вставки в MyTable выберите «val1» как col1, «val4» как COL4, «Val8» как col8 --Если каких-либо дополнительных столбцов, то просто сделать «нулевой, как col10»

предполагая порядок в таблице

0
INSERT INTO MyTable (col1, col4, col8) 
VALUES ('val1', 'val4', 'val8') 

Это утверждение будет добавить значения в столбцах, указанных в вашем INSERT INTO заявлении, вы можете написать приведенный выше запрос в следующих форматах он не будет делать никакой разницы.

INSERT INTO MyTable (col8, col1, col4) 
VALUES ('val8', 'val1', 'val4') 

ИЛИ

INSERT INTO MyTable (col4, col8, col1) 
VALUES ('val4', 'val8', 'val1') 

добавить несколько строк в то время, вы можете передать несколько строк в то время в вас значение дизъюнкции что-то вроде этого

INSERT INTO MyTable (col4, col8, col1) 
VALUES ('val4', 'val8', 'val1'), 
     ('val4', 'val8', 'val1'), 
     ('val4', 'val8', 'val1'), 
     ('val4', 'val8', 'val1') 

Порядка из значения должны соответствовать порядку столбцов , указанным в инструкции INSERT INTO.

Все вышеуказанные утверждения будут иметь тот же результат.

держать одну вещь в виду, как только вы упоминали столбец вы должны указать значение для него

как это

INSERT INTO MyTable (col1, col4, col8) 
VALUES ('val1', null, 'val8') 

, но вы не можете сделать что-то вроде этого

INSERT INTO MyTable (col1, col4, col8) 
VALUES ('val1', 'val8') 
1

Нет , нет никакого способа сделать конкретно то, что вы хотите. Самое близкое, что вы можете сделать, это использовать порядок создания столбцов, чтобы избежать использования имен столбцов в команде insert.Как это:

Если у вас есть таблица, как

tableA (id, name, phone) 

Вы можете вставить значения на нем с помощью

insert into tableA values (1, 'Name', '555-9999'); 

Но будьте осторожны, вы должны следовать точный порядок на полях вашего table, в противном случае вы можете иметь ошибку и худший, поместить неправильные данные в неправильные поля.

4

Необходимо указать имена столбцов. Однако есть одно исключение. Если вы вставив точно одинаковое количество столбцов в таблице назначения имеет в том же порядке как они находятся в таблице, используйте следующий синтаксис:

INSERT INTO MyTable 
VALUES ('val1A', 'val4A', 'val8A') 

Заметьте, что это хрупкий способ выполнения INSERT, потому что, если эта таблица изменится или столбцы упорядочены по-разному в другой системе, то может потерпеть неудачу или, что еще хуже, может помещать неправильные данные в каждый столбец.

Я обнаружил, что когда я столкнулся с множеством столбцов, я считаю, что запросы легче читать, если я могу их каким-то образом сгруппировать. Если имена столбцов длинные, я могу поставить их на отдельные линии, как так:

INSERT INTO MyTable 
(
    MyTable_VeryLongName_Col1, 
    MyTable_VeryLongName_Col4, 
    MyTable_VeryLongName_Col8, 
    -- etc. 
) 
SELECT 
    Very_Long_Value_1, 
    Very_Long_Value_4, 
    Very_Long_Value_8, 
    -- etc. 

Или вы можете сгруппировать 2 колонки на линии, или положить пространства на каждые 5 или комментировать каждый 10-й линии, и т.д., что заставляет его легче читать.

Если вы обнаружили, в том числе имена столбцов обременительных, вставляя много строк, а затем попытаться цепочки данных вместе:

INSERT INTO MyTable (col1, col4, col8) 
VALUES ('val1A', 'val4A', 'val8A'), 
    ('val1B', 'val4B', 'val8B'), 
    -- etc. 

Или UNION их вместе:

INSERT INTO MyTable (col1, col4, col8) 
SELECT 'val1A', 'val4A', 'val8A' 
UNION ALL 'val1B', 'val4B', 'val8B' 
UNION ALL ... -- etc. 

Или выберите их из другого стол:

INSERT INTO MyTable (col1, col4, col8) 
SELECT val1, va4, val8 
FROM MyOtherTable 
WHERE -- some condition is met 
+0

+1 для синтаксиса Union All. Гораздо чище. – granadaCoder

+0

В настоящее время я использую метод цепочки, но причина, по которой это громоздко, состоит в том, что многие из столбцов, которые у меня содержат двоичные данные, и может быть трудно сопоставить то, что 1 и что 0 идет с какой колонкой во время обзоров кода –

+0

Я понимаю. У нас есть аналогичные проблемы в нашем коде. Я отредактировал свой пост с некоторыми из наших стратегий, которые мы использовали, чтобы сделать такие запросы более удобными для чтения. –

Смежные вопросы