SQL 2005 копирует один столбец между базами данных
-
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
Решение
Вставка этого не сделает, поскольку будет предпринята попытка вставить новые строки в конец таблицы.Похоже, вы пытаетесь добавить столбец в конец существующих строк.
Я не уверен, что синтаксис правильный, но, если я вас понял, то это сделает то, что вам нужно.
Создайте столбец, допускающий значения NULL в базе данных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.Вместо этого вам может потребоваться обновление.Для этого вам понадобится общий ключ.