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.