2012-06-22 4 views
0

Im в настоящее время пытается переместить данные из одной таблицы в другую. В previous question I asked today мне посоветовали использовать инструкцию insert. При попытке запустить инструкцию я получаю сообщение об ошибке с SQL Server следующим образом:INSERT INTO таблица, которая требует Join

Невозможно вставить значение NULL в столбец «Родитель», таблица «*****. Dbo.Product»; столбец не допускает нулей. INSERT терпит неудачу.

Это заявление, которое я создал,

BEGIN TRANSACTION 
INSERT INTO [*****].[dbo].[Product] 
([PDate] 
    ,[SDate] 
    ,[CreatedBy] 
    ,[CreatedDate] 
    ,[UpdatedBy] 
    ,[UpdatedDate]) 
SELECT d.[PDate] 
    ,d.[SDate] 
    ,d.[CreatedBy] 
    ,d.[CreatedDate] 
    ,d.[UpdatedBy] 
    ,d.[UpdatedDate] 
FROM [*****].[dbo].[ProductData] AS d 
JOIN [*****].[dbo].[Product] AS t 
ON d.ProductDataID = t.ProductDataID 
ROLLBACK TRANSACTION 

мне нужно убедиться, что данные совпадают правильно

Edit: К сожалению, произошла ошибка, когда я переписывал сценарий. UseDRM находится в обоих разделах моего исходного сценария. Что я хочу сделать, это скопировать данные из таблицы ProductData в таблицу Product.

+0

какой-то столбец имеет значение null в предложении select – Nighil

+1

опубликовать таблицу продуктов. Дизайн –

+0

Я думаю, что происходит то, что инструкция insert пытается добавить новые строки в таблицу, а не заполнять существующие строки. –

ответ

0

я, наконец, понял, что я делаю неправильно, вместо того, чтобы использовать INSERT INTO заявления Я должен был использовать инструкцию UPDATE

UPDATE [********].[dbo].[Product] 
SET [PDate] = [********].[dbo].[ProductData].[PDate] 
    ,[SDate] = [********].[dbo].[ProductData].[SDate] 
    ,[CreatedBy] = [********].[dbo].[ProductData].[CreatedBy] 
    ,[CreatedDate] = [********].[dbo].[ProductData].[CreatedDate] 
    ,[UpdatedBy] = [********].[dbo].[ProductData].[UpdatedBy] 
    ,[UpdatedDate] = [********].[dbo].[ProductData].[UpdatedDate] 
FROM [********].[dbo].[ProductData], [********].[dbo].[Product] 
WHERE [********].[dbo].[Product].[ProductDataID] = [********].[dbo].[ProductData].[ProductDataID] 

Прошу прощения за мой неправильный вопрос, который плохо написан

3

Столбец Parent не имеет значения NULL и не имеет значения по умолчанию, поэтому вам нужно добавить его в свой запрос.

+0

Я добавил эти новые столбцы в таблицу продуктов, и я хочу, чтобы они могли заполнять их из данных ProductData, где совпадает ProductDataID, (productDataID используется в обеих таблицах) –

+0

Невозможно ответить на ваш вопрос, если вы не публикуете определение «Продукт». –

2

Попробуйте использовать ISNULL в выбранном запросе, чтобы проверить, является ли значение нулевым & заменить его значением по умолчанию.

Например .:

BEGIN TRANSACTION 
    INSERT INTO [*****].[dbo].[Product] 
    ([PDate] 
     ,[SDate] 
     ,[UseDRM] 
     ,[CreatedBy] 
     ,[CreatedDate] 
     ,[UpdatedBy] 
     ,[UpdatedDate]) 
    SELECT Isnull(d.[PDate], '1/1/1900') 
     ,Isnull(d.[SDate], '1/1/1900') 
     ,Isnull(d.[UseDRM], "") 
     ,Isnull(d.[CreatedBy], "") 
     ,Isnull(d.[CreatedDate], '1/1/1900') 
     ,Isnull(d.[UpdatedBy], "") 
     ,Isnull(d.[UpdatedDate], '1/1/1900') 
    FROM [*****].[dbo].[ProductData] AS d 
    JOIN [*****].[dbo].[Product] AS t 
    ON d.ProductDataID = t.ProductDataID 
    ROLLBACK TRANSACTION 
+1

Я не думаю, что это решит эту проблему - сообщение об ошибке говорит, что столбец «Родительский» вызывает проблему и ** он вообще не включен в инструкцию INSERT **. –

+1

Я согласен, проблема в том, что INSERT не ссылается на столбец в целевой таблице, и для этого столбца требуется значение. – MatBailie

2
BEGIN TRANSACTION 
INSERT INTO [*****].[dbo].[Product] 
([PDate] 
    ,[SDate]//Check Columns no here it is 6 total 
    ,[CreatedBy] 
    ,[CreatedDate] 
    ,[UpdatedBy] 
    ,[UpdatedDate]) 
SELECT d.[PDate] //Check columns numbers here it is 7 here 
    ,d.[SDate] 
    ,d.[UseDRM] 
    ,d.[CreatedBy] 
    ,d.[CreatedDate] 
    ,d.[UpdatedBy] 
    ,d.[UpdatedDate] 
FROM [*****].[dbo].[ProductData] AS d 
JOIN [*****].[dbo].[Product] AS t 
ON d.ProductDataID = t.ProductDataID 
ROLLBACK TRANSACTION 

правильно это, то это будет нормально d.[UseDRM] не в вкладыше