Sql server insert into sql: Инструкция INSERT (Transact-SQL) — SQL Server

sql — Использование предложения WITH в инструкции INSERT

Мне было интересно, возможно ли это. У меня есть существующий запрос, который использует предложение WITH для применения некоторых агрегированных данных к запросу SELECT следующим образом: (значительно упрощено)

 ;WITH псевдоним (y,z)
КАК
(
    ВЫБЕРИТЕ y,z ИЗ таблицыb
)
SELECT y, z FROM псевдоним
 

Теперь я хочу ВСТАВИТЬ результаты этого запроса в другую таблицу.

Я пробовал следующее:

 INSERT INTO tablea(a,b)
;С псевдонимом (y,z)
КАК
(
    ВЫБЕРИТЕ y,z ИЗ таблицыb
)
SELECT y, z FROM псевдоним
 

но я получаю ошибку:

Неправильный синтаксис рядом с ‘;’.

Итак, я попытался без точки с запятой, но получил ошибку:

Неверный синтаксис рядом с ключевым словом ‘WITH’.

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

Возможно ли то, что я пытаюсь сделать, с другим синтаксисом?

  • sql
  • sql-сервер
  • выражение общей таблицы
  • с пунктом

2

Вам нужно будет поместить INSERT INTO сразу после CTE . Таким образом, код будет таким:

 ;С псевдонимом (y,z)
КАК
(
    ВЫБЕРИТЕ y,z ИЗ таблицыb
)
ВСТАВИТЬ В таблицуa(a,b)
ВЫБЕРИТЕ г, г
ОТ псевдонима
 

См. SQL Fiddle с демонстрацией

Другой способ без использования CTE заключается в заключении его в подзапрос,

 INSERT INTO tablea(a,b)
ВЫБЕРИТЕ г, г
ОТ
(
    ВЫБЕРИТЕ y,z ИЗ таблицыb
) псевдоним
 

1

Для завершения оператора используется точка с запятой. Поэтому, когда вы используете ;WITH, завершает предыдущий оператор. Однако это не то, почему вы получаете ошибку здесь. Проблема здесь с вашим оператором INSERT INTO, который ищет синтаксис VALUES или SELECT.

Оператор INSERT INTO можно использовать двумя способами: явно указав ЗНАЧЕНИЯ или предоставив результирующий набор с помощью оператора SELECT.

В моем случае предложенный ответ был неприменим, я мог подумать, что это показатель версии SQL Server, которая в моем случае — SQL Server 2016. В качестве альтернативы вы можете использовать временные таблицы через этот фрагмент кода:

; WITH псевдоним (y ,з)
КАК (ВЫБЕРИТЕ y,z ИЗ таблицыb)
ВЫБЕРИТЕ Г, Я
В #TEMP_TABLE
ОТ псевдонима
 

З

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Обязательно, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Вставить несколько значений с помощью INSERT INTO (SQL Server 2005)

В SQL Server 2005 я пытаюсь выяснить, почему я не могу вставить несколько полей в таблицу. Следующий запрос, который вставляет одну запись, работает нормально:

 INSERT INTO [MyDB].[dbo].[MyTable]
           ([Идентификатор поля]
           ,[Описание])
     ЦЕННОСТИ
           (1000, N'тест')
 

Однако следующий запрос, в котором указано более одного значения, завершается ошибкой:

 INSERT INTO [MyDB].[dbo].[MyTable]
           ([Идентификатор поля]
           ,[Описание])
     ЦЕННОСТИ
           (1000,N'тест'),(1001,N'тест2')
 

Я получаю это сообщение:

 Сообщение 102, уровень 15, состояние 1, строка 5
Неправильный синтаксис рядом с ','.
 

Когда я искал справку для INSERT в SQL Sever Management Studio, в одном из их примеров было показано использование синтаксиса «Значения», который я использовал (с группами значений в круглых скобках и разделенных запятыми). Справочная документация, которую я нашел в SQL Server Management Studio, выглядит так, как будто она предназначена для SQL Server 2008, поэтому, возможно, это причина того, что вставка не работает. В любом случае, я не могу понять, почему это не сработает.

  • sql
  • sql-сервер
  • sql-сервер-2005
  • tsql

2

Используемый синтаксис является новым для SQL Server 2008:

 INSERT INTO [MyDB].[dbo].[MyTable]
       ([Идентификатор поля]
       ,[Описание])
 ЦЕННОСТИ
       (1000,N'тест'),(1001,N'тест2')
 

Для SQL Server 2005 вам придется использовать несколько операторов INSERT :

 INSERT INTO [MyDB].[dbo].[MyTable]
       ([Идентификатор поля]
       ,[Описание])
 ЦЕННОСТИ
       (1000, N'тест')
ВСТАВЬТЕ В [MyDB].[dbo].[MyTable]
       ([Идентификатор поля]
       ,[Описание])
 ЦЕННОСТИ
       (1001, N'test2')
 

Другой вариант — использовать UNION ALL :

 INSERT INTO [MyDB].[dbo].[MyTable]
       ([Идентификатор поля]
       ,[Описание])
SELECT 1000, N'test' UNION ALL
ВЫБЕРИТЕ 1001, N'test2'
 

1

Вы также можете использовать следующий синтаксис: —

 ВСТАВИТЬ В MyTable (FirstCol, SecondCol)
ВЫБЕРИТЕ «Первый», 1
СОЮЗ ВСЕХ
ВЫБЕРИТЕ «Второй», 2
СОЮЗ ВСЕХ
ВЫБЕРИТЕ «Третий», 3
СОЮЗ ВСЕХ
ВЫБЕРИТЕ «Четвертый», 4
СОЮЗ ВСЕХ
ВЫБЕРИТЕ «Пятый», 5
ИДТИ
 

Отсюда

В SQL Server 2008, 2012, 2014 вы можете вставлять несколько строк с помощью одного оператора SQL INSERT.