-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, '') ...

そうすれば、サブ選択の値の 1 つが の場合NULL、連結の結果として NULL 値が得られることはありません。

于 2012-06-28T20:27:41.927 に答える
2

私はいくつかの変更を加えました:

  • 読みやすくするための 1 文字のエイリアス
  • 独自の 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 に答える