SQL 2005 копировать один столбец между базами данных - PullRequest
2 голосов
/ 09 сентября 2008

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

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

INSERT INTO database1.myTable columnINeed
SELECT columnINeed from database2.myTable

Ответы [ 6 ]

5 голосов
/ 09 сентября 2008

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

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

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

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

    ОБНОВЛЕНИЕ database2.dbo.tablename SET database2.dbo.tablename.colname = database1.dbo.tablename.colname FROM database2.dbo.tablename INNER ПРИСОЕДИНЯЙТЕСЬ к database1.dbo.tablename ON database2.dbo.tablename.keycol = database1.dbo.tablename.keycol

2 голосов
/ 09 сентября 2008

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

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

и поскольку вы используете Sql Server 2005, вы можете использовать новый оператор MERGE . Оператор MERGE обладает тем преимуществом, что может обрабатывать все ситуации в одном операторе , например, пропущенные строки из источника (можно делать вставки), пропущенные строки из пункта назначения (можно удалять), сопоставление строки (можно делать обновления), и все делается атомарно в одной транзакции. Пример:

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 делает в одном операторе без дополнительной сложности.

2 голосов
/ 09 сентября 2008

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

INSERT INTO Datbase1..MyTable
    (ColumnList)
SELECT FieldsIWant
  FROM Database2..MyTable
1 голос
/ 05 декабря 2008

MERGE доступен только в SQL 2008 НЕ SQL 2005

1 голос
/ 09 сентября 2008

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

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
0 голосов
/ 09 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...