-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 )

这给了我一个错误:

消息 515,级别 16,状态 2,第 1 行
无法将值 NULL 插入列 'EntityData',表 'DB4010.dbo.EntityStagedData';列不允许空值。更新失败。

对于我的一生,我无法弄清楚如何从内部 Select 语句的结果中更新+连接“EntityData”......

4

2 回答 2

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 值。

于 2012-06-28T20:27:41.927 回答
2

我做了一些改变:

  • 单字母别名以提高可读性
  • 修复专有的 SQL Server UPDATE FROM 语法
  • 消除不相关的 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;
于 2012-06-28T20:36:24.243 回答