2012-06-28 4 views
-1
UPDATE DB4010.dbo.EntityStagedData 
SET 
EntityData = (
    SELECT 
     geo.City + ' ' + geo.Description + ' ' + geo.Street + ' ' + 
     geo2.City + ' ' + geo2.Description + ' ' + geo2.Street 
    FROM DB4010.dbo.RouteTemplates templates 
     INNER JOIN DB4010.dbo.RouteTemplateClients clients 
     ON clients.RouteTemplateID = templates.RouteTemplateID 
     INNER JOIN DB4010.dbo.RouteTemplateStopMasters masters 
     ON masters.RouteTemplateClientID = clients.RouteTemplateClientID 
     INNER JOIN DB4010.dbo.RouteTemplateStopDetails details 
     ON details.RouteTemplateStopID = masters.PickupStopID 
     INNER JOIN DB4010.dbo.RouteTemplateStopDetails details2 
     ON details2.RouteTemplateStopID = masters.DeliveryStopID 
     INNER JOIN DB4010.dbo.Geofences geo 
     ON geo.GeofenceID = details.GeofenceID 
     INNER JOIN DB4010.dbo.Geofences geo2 
     ON geo2.GeofenceID = details2.GeofenceID 
    WHERE clients.RouteTemplateID = DB4010.dbo.EntityStagedData.EntityID 
) 
WHERE EXISTS (SELECT RouteTemplateID FROM DB4010.dbo.RouteTemplates) 

Это дает мне ошибку:UPDATE от внутреннего комплекса ВЫБРАТЬ

Msg 515, Level 16, State 2, Line 1
Cannot insert the value NULL into column 'EntityData', table 'DB4010.dbo.EntityStagedData'; column does not allow nulls. UPDATE fails.

я не могу, для жизни меня, выяснить, как обновить + Concatenate «EntityData» из результатов внутренний Выберите оператор ...

+1

Не уверен, что я понимаю, что вы имеете в виду под «обновлением + сцепить„EntityData“из результатов внутреннего заявление Выберите» Вы имеете в виду добавить «Entity Data» в результате выбора, или добавить существующее значение EntityData для результата или что-то еще? – Bort

+0

Ну, EntityData добавляется с ответом NVARCHAR из внутреннего оператора select ... – MatBee

ответ

2

Я сделал несколько изменений:

  • односимвольных псевдонимов для читаемости
  • исправления патентованного UPDATE SQL Server от синтаксиса
  • устранения коррелированно ГДЕ СУЩЕСТВУЕТ пункт

Вы все равно можете решить, что делать в случаях, когда geo.City и т. Д. Содержат значения NULL. Вам может потребоваться просто обернуть выражение в COALESCE или полностью удалить NULL-строки из соединения.

UPDATE s SET EntityData = 
     geo.City + ' ' + geo.Description + ' ' + geo.Street + ' ' + 
     geo2.City + ' ' + geo2.Description + ' ' + geo2.Street 
FROM DB4010.dbo.EntityStagedData AS s 
INNER JOIN DB4010.dbo.RouteTemplateClients AS c 
    ON c.RouteTemplateID = s.EntityID 
INNER JOIN DB4010.dbo.RouteTemplates AS t 
    ON t.RouteTemplateID = c.RouteTemplateID 
INNER JOIN DB4010.dbo.RouteTemplateStopMasters AS m 
    ON m.RouteTemplateClientID = c.RouteTemplateClientID 
INNER JOIN DB4010.dbo.RouteTemplateStopDetails AS d 
    ON d.RouteTemplateStopID = m.PickupStopID 
INNER JOIN DB4010.dbo.RouteTemplateStopDetails AS d2 
    ON d2.RouteTemplateStopID = m.DeliveryStopID 
INNER JOIN DB4010.dbo.Geofences AS geo 
    ON geo.GeofenceID = d.GeofenceID 
INNER JOIN DB4010.dbo.Geofences AS geo2 
    ON geo2.GeofenceID = d2.GeofenceID; 
+0

Это похоже только на одну строку, а не на каждую строку, возвращаемую в моей исходной инструкции SELECT ... – MatBee

+0

Какая строка? Есть ли предложение where, которое вы добавили, о котором вы нам не рассказываете? Возможно, способ, которым вы написали соединение, означает, что может быть только одна строка? Исходный SELECT (внутри скобок) не мог быть запущен сам по себе, поэтому вам нужно будет указать более подробную информацию, если вы хотите получить ответ. –

2

Вы можете обернуть первый раздел в COALESCE заявлении как таковой:

SET EntityData = COALESCE(( SELECT   geo.City + ' ' + geo.Description 
    + ' ' + geo.Street + ' ' +   geo2.City + ' ' + geo2.Description + ' ' 
    + geo2.Street  
FROM DB4010.dbo.RouteTemplates templates   
INNER JOIN DB4010.dbo.RouteTemplateClients clients ON clients.RouteTemplateID = 
    templates.RouteTemplateID   
INNER JOIN DB4010.dbo.RouteTemplateStopMasters masters ON 
    masters.RouteTemplateClientID = clients.RouteTemplateClientID   
INNER JOIN DB4010.dbo.RouteTemplateStopDetails details ON 
    details.RouteTemplateStopID = masters.PickupStopID   
INNER JOIN DB4010.dbo.RouteTemplateStopDetails details2 ON 
    details2.RouteTemplateStopID = masters.DeliveryStopID   
INNER JOIN DB4010.dbo.Geofences geo ON geo.GeofenceID = details.GeofenceID   
INNER JOIN DB4010.dbo.Geofences geo2 ON geo2.GeofenceID = details2.GeofenceID  
WHERE clients.RouteTemplateID = DB4010.dbo.EntityStagedData.EntityID), '') 

в установите значение в пустое значение.

Если вы хотите, чтобы получить как можно больше информации, как это возможно, обернуть каждую отдельную часть в COALESCE заявления для удаления NULL значения, такие как:

SELECT   COALESCE(geo.City, '') + ' ' + COALESCE(geo.Description, '') ... 

Таким образом, если один из ваших значений в суб-выберите NULL, вы не получите значение NULL в результате конкатенации.

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