SQL 2005 копирует один столбец между базами данных

StackOverflow https://stackoverflow.com/questions/52356

  •  09-06-2019
  •  | 
  •  

Вопрос

Я все еще новичок в T-SQL и SQL 2005.Мне нужно импортировать столбец целых чисел из таблицы в базе данных1 в идентичную таблицу (отсутствует только нужный мне столбец) в базе данных2.Обе базы данных sql 2005.Я попробовал встроенную команду импорта в Server Management Studio, но она заставляет меня копировать всю таблицу.Это вызывает ошибки из-за ограничений и столбцов «только для чтения» (что бы ни означало «только для чтения» в sql2005).Я просто хочу взять один столбец и скопировать его в таблицу.

Должен быть простой способ сделать это.Что-то вроде:

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable
Это было полезно?

Решение

Вставка этого не сделает, поскольку будет предпринята попытка вставить новые строки в конец таблицы.Похоже, вы пытаетесь добавить столбец в конец существующих строк.

Я не уверен, что синтаксис правильный, но, если я вас понял, то это сделает то, что вам нужно.

  1. Создайте столбец, допускающий значения NULL в базе данных2.

  2. Выполните обновление:

    Обновление базы данных2.dbo.tablename set batabase2.dbo.tablename.colname = database1.dbo.tablename.colname из базы данных2.dbo.tablename inner join database1.dbo.tablename на базе данных2.dbo.tablename.keycol = dataBase1.dbo.tablename. Keycol

Другие советы

Существует простой способ, очень похожий на этот, если обе базы данных находятся на одном сервере.Полностью квалифицированное имя - dbname.owner.table - обычно владелец - DBO, и есть ярлык для ".dbo". Что "..", так ...

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable

сначала создайте столбец, если он не существует:

ALTER TABLE database2..targetTable
ADD targetColumn int null -- or whatever column definition is needed

и поскольку вы используете Sql Server 2005, вы можете использовать новый ОБЪЕДИНИТЬ заявление.А ОБЪЕДИНИТЬ Преимущество оператора заключается в том, что он может рассматривать все ситуации в одном операторе. например, отсутствующие строки из источника (можно вставлять), отсутствующие строки из места назначения (можно удалять), совпадающие строки (можно обновлять), и все это делается атомарно в одной транзакции.Пример:

MERGE database2..targetTable AS t
USING (SELECT sourceColumn FROM sourceDatabase1..sourceTable) as s
ON t.PrimaryKeyCol = s.PrimaryKeyCol -- or whatever the match should be bassed on
WHEN MATCHED THEN 
    UPDATE SET t.targetColumn = s.sourceColumn
WHEN NOT MATCHED THEN
    INSERT (targetColumn, [other columns ...]) VALUES (s.sourceColumn, [other values ..])

Оператор MERGE был введен для решения таких случаев, как ваш, и я рекомендую его использовать, он намного более мощный, чем решения, использующие несколько пакетных операторов sql, которые по сути выполняют то же самое, что и MERGE, в одном операторе, но без дополнительной сложности.

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

DECLARE @FirstField nvarchar(100)

DECLARE ACursor CURSOR FOR
SELECT FirstField FROM FirstTable 

OPEN ACursor
FETCH NEXT FROM ACursor INTO @FirstField
WHILE @@FETCH_STATUS = 0
BEGIN

   INSERT INTO SecondTable ( SecondField ) VALUES ( @FirstField )

   FETCH NEXT FROM ACursor INTO @FirstField

END

CLOSE ACursor   
DEALLOCATE ACursor

Слияние доступно только в SQL 2008, а не в SQL 2005.

вставить в Test2.dbo.MyTable (MyValue) выбрать MyValue из Test1.dbo.MyTable

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top