2014-11-20 3 views
0

Я пытаюсь скопировать данные таблицы из резервной базы данных-заглушки в нашу базу данных в реальном времени (как авария произошла в нашей программе Visma Business, где кто-то управлял чтобы перезаписать 1300 имен клиентов), но мне сложно определить идеальный код для этого, я огляделся и да, есть несколько подобных проблем, но я просто не могу заставить это работать, хотя я пробовал различные решения.Попытка скопировать одну таблицу из другой базы данных в другую в SQL Server 2008 R2

Вот простой код, который я использовал в прошлый раз, теоретически все, что мне нужно, это эквивалент mysqls On Duplicate, который будет MERGE на SQL-сервере? Я просто не совсем знал, что писать, чтобы заставить это слияние работать.

INSERT [F0001].[dbo].[Actor] 
SELECT * FROM [FDummy].[dbo].[Actor] 

Сообщение об ошибке я получаю с этим: Нарушение ограничения PRIMARY KEY 'PK__Actor. Невозможно вставить дубликат ключа в объект 'dbo.Actor'.

+0

Так что вы хотите, чтобы все записи в F0001.dbo.Actor быть обновлены с данными FDummy.dbo. Актер, если он существует, иначе вставьте данные из FDummy.dbo.Acor? –

+0

Если это только имена, которые были перезаписаны, (поэтому идентификаторы клиентов должны быть одинаковыми в резервной и живой системе?), Почему бы просто не генерировать операторы обновления из выбранного в вашей резервной копии? STH.например, 'SELECT 'UPDATE Customer SET Name =' + Name + 'WHERE CustomerID =' + CAST (CustomerID AS NVARCHAR (MAX)) FROM Customers WHERE ID IN (диапазон идентификаторов, где имя перезаписывается)' – DrCopyPaste

+0

Да, я хочу всю информацию обновлено с Fdummy до f0001, так как я думаю, что было бы проще сделать то только имена? или я могу быть бредовым там. – Tommy

ответ

1

Сообщение об ошибке просто «Вы не можете добавить одно и то же значение, если атрибут имеет ограничение PK». Если у вас уже есть вся информация в вашей резервной таблице, то вы должны сделать это TRUNCATE TABLE, который удаляет все строки из таблицы, но структура таблицы и ее столбцы, ограничения, индексы и т. Д. Остаются.

После этого шага вы должны следовать этому answer. Или, альтернативно, я рекомендую инструмент под названием Kettle, который является открытым исходным кодом и прост в использовании для этих видов перемещений данных. Это сэкономит вам много работы.

+0

Работает ли чайник с SQL Server 2008 R2? – Tommy

+1

TRUNCATE TABLE перед тем, как мой код сделал это !, спасибо! – Tommy

+0

Добро пожаловать. Да, он работает с SQL 2008! @Tommy – mrgenco

0

Вот вещь, которая может быть причиной:

  1. У вас есть несколько строк в [FDummy].[dbo].[Actor] с теми же данными в столбце, который будет вставлен в столбец первичного ключа из [F0001].[dbo].[Actor].
  2. У Вас есть существующие строки в [FDummy].[dbo].[Actor] с некоторым значением x в столбце первичного ключа, и есть/есть строка (ы) в [F0001].[dbo].[Actor] с таким же значением x в колонне, которая собирается быть вставлена ​​в столбце первичного ключа.

пункт Список

-- to check first point. if it returns row then you have some problem 
SELECT ColumnGoingToBeMappedWithPK, 
     Count(*) 
FROM [FDummy].[dbo].[Actor] 
GROUP BY ColumnGoingToBeMappedWithPK 
HAVING Count(*) > 1 

-- to check second point. if count is greater than 0 then you have some problem 
SELECT Count(*) 
FROM [FDummy].[dbo].[Actor] a 
     JOIN [F0001].[dbo].[Actor] b 
     ON a.ColumnGoingToBeMappedWithPK = b.PrimaryKeyColumn 
+0

Обе таблицы идентичны в настройках, это просто имена пользователей, которые меняют, которые я хочу заменить – Tommy

0

MERGE заявление будет, возможно, лучше для вас здесь, если первичный ключ Actor таблицы не используется повторно после того, как предыдущая запись будет удалена, так что не autoincremented и сказать запись с идентификатором 13 на F0001.dbo.Actor не то же самое «актер» информация, как на FDummy.dbo.Actor

Чтобы использовать оператор с кодом, это будет выглядеть примерно так:

begin transaction 

    merge [F0001].[dbo].[Actor] as t -- the destination 
    using [FDummy].[dbo].[Actor] as s -- the source 
    on (t.[PRIMARYKEY] = s.[PRIMARYKEY]) -- update with your primary keys 
    when matched then 
      update set t.columnname1 = s.columnname1, 
        t.columnname2 = s.columnname2, 
        t.columnname3 = s.columnname3 
        -- repeat for all your columns that you want to update 
    output $action, 
     Inserted.*, 
     Deleted.*; 

rollback transaction -- change to commit after testing 

Дальнейшее чтение может быть сделано в источниках ниже:
MERGE (Transact-SQL)
Inserting, Updating, and Deleting Data by Using MERGE
Using MERGE in SQL Server to insert, update and delete at the same time

 Смежные вопросы

  • Нет связанных вопросов^_^