2012-06-28 80 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) 

这是给我的错误:更新选择

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.

我不能,我的生活,找出如何从结果更新+串联“EntityData”内Select语句...

+1

不知道我理解你所说的“从内Select语句的结果‘’更新+串联” EntityData意味着你是什么意思添加“实体数据”到选择的结果,或添加EntityData对结果的现有值,还是别的? – Bort

+0

那么,EntityData会从内部select语句中追加NVARCHAR响应... – MatBee

回答

2

我做了一些新的变化:

  • 单字母别名可读性
  • 修复专有的SQL Server更新来自语法
  • 消除不相关的WHERE EXISTS子句

您可能仍需要决定在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值。