Я пытаюсь скопировать определенные данные (например, где состояние = «TX») из таблицы в одной базе данных на удаленном сервере в другую базу данных на моем сервере. Ошибка, которую я получаю:

Неверный синтаксис рядом с 'SELECT'. Ожидается EDGE_TYPE или FILETABLE" сразу после ключевого слова "AS".

Таблица, из которой я копирую, огромна, и у меня нет места на сервере, чтобы скопировать всю таблицу, и она мне никогда не понадобится. Я нашел сайты, которые показывают, как это сделать, но по какой-то причине они никогда не работают в SQL Server, хотя они работают в онлайн-запросах sql (школы w3: https://www.w3schools.com/sql/sql_create_table.asp #:~:text=the%20old%20table.-,Syntax,-CREATE%20TABLE%20new_table_name).

Вот мой код более или менее:

CREATE TABLE [DB1].dbo.PartialData AS
SELECT [col1]
      ,[col2]
      ,[col3]
      ,[col4]
FROM [DB2].[dbo].[FullData]
WHERE [DB2].[dbo].[FullData].State = 'TX';
-2
tgoodell 4 Фев 2022 в 01:43
4
Лучше избегать w3fools.com и использовать документацию для вашей СУБД - этот синтаксис не является частью синтаксиса t-sql.
 – 
Stu
4 Фев 2022 в 01:47

2 ответа

В SQL Server используйте select.. into...

SELECT col1
      ,col2
      ,col3
      ,col4
 INTO DB1.dbo.PartialData
 FROM DB2.dbo.FullData
WHERE State = 'TX';
2
Stu 4 Фев 2022 в 01:50
Имеет ли значение, что они находятся на разных серверах и у меня есть базовые привилегии на db2? Потому что я получаю сообщение об ошибке ::: Неверное имя объекта "DB2" ::: после ключевого слова "FROM"
 – 
tgoodell
4 Фев 2022 в 02:32
1
Он будет прекрасно работать с кросс-базой данных на одном и том же сервере, но не между разными серверами. В вашем вопросе ничего нет о том, что базы данных находятся на физически разных серверах, это другой ответ; вам нужно будет создать целевую таблицу и использовать openrowset или связанные серверы.
 – 
Stu
4 Фев 2022 в 02:34
Извините, я думал, что это имелось в виду, когда я сказал: «У меня нет места на сервере для копирования всей таблицы».
 – 
tgoodell
4 Фев 2022 в 02:35
Хорошо - это может означать что угодно, ни одного диска со свободным пространством, размером файловой группы, пространством для файла журнала, всегда лучше быть очень явным, чтобы получить наиболее точные ответы; кроме того, синтаксис вашего примера содержит имена из трех частей, которые могут работать ТОЛЬКО на одном сервере.
 – 
Stu
4 Фев 2022 в 02:38

Сложность будет заключаться в настройке связанных серверы.

Если вы связали сервер, на котором размещается db1, с сервером для db2, вы бы запросили, используя имя из 4 частей:

insert [db2].[dbo].[PartialData]
select * from [server1].[db1].[dbo].[fullData]

Вы бы вставили имя из 4 частей, если бы вы настроили связанный сервер в противоположном направлении.

insert [server2].[db2].[dbo].[PartialData]
select * from [db1].[dbo].[fullData]
0
Xingzhou Liu 4 Фев 2022 в 12:00