1

更新時に問題が発生しました。別のデータベースの別のテーブルで更新を使用していましたが、フィールドの使用は同じであるため、「マルチパート識別子が見つかりませんでした」というメッセージが表示されました。助けてください。

コードは次のとおりです。

UPDATE [interface].[dbo].[tre_bos_account_update]
SET [interface].[dbo].[tre_bos_account_update].n_tre_bos_account_update_start_balance = [SasTempDB]..OLT_Balance_Update.StartOfDayBalance
FROM (SELECT StartOfDayBalance from OLT_Balance_Update 
WHERE CONVERT(varchar(12), [sastempdb].dbo.OLT_Balance_Update.DateTrx) = CONVERT(varchar(12), GETDATE()))OLT_Balance_Update
WHERE [SasTempDB]..OLT_Balance_Update.ClientNo = [interface].dbo.tre_bos_account_update.vc_tre_bos_account_update_account_no
4

1 に答える 1

2

OLT_Balance_Updateステートメント内の派生テーブルのエイリアスであり、データベースの一部ではありません。

[SasTempDB]..メインクエリで参照する場所から削除し、OLT_Balance_Updateおそらく派生テーブルの from 句に追加します。また、派生テーブルに ClientNo を追加する必要があります。

このようなもの:

UPDATE [interface].[dbo].[tre_bos_account_update]
SET [interface].[dbo].[tre_bos_account_update].n_tre_bos_account_update_start_balance = OLT_Balance_Update.StartOfDayBalance
FROM
  (
   Select StartOfDayBalance, ClientNo 
   from [SasTempDB]..OLT_Balance_Update -- This is the actual table in [SasTempDB]
   where CONVERT(varchar(12), [sastempdb].dbo.OLT_Balance_Update.DateTrx) = CONVERT(varchar(12), GETDATE())
  ) OLT_Balance_Update -- This is a table alias for a derived table
WHERE OLT_Balance_Update.ClientNo = [interface].dbo.tre_bos_account_update.vc_tre_bos_account_update_account_no

あなたのクエリを見ると、これは同等であると思います。

update T
set n_tre_bos_account_update_start_balance = O.StartOfDayBalance
from interface.dbo.tre_bos_account_update as T
  inner join SasTempDB.dbo.OLT_Balance_Update as O
    on T.vc_tre_bos_account_update_account_no = O.ClientNo
where O.OLT_Balance_Update.DateTrx >= dateadd(day, datediff(day, 0, getdate()), 0) and
      O.OLT_Balance_Update.DateTrx < dateadd(day, 1+datediff(day, 0, getdate()), 0) 

dateadd/datediffトリックをgetdate()使用すると、日付から時間部分が削除され、/ を使用して比較すると>==SQL Server はインデックスを使用しOLT_Balance_Update.DateTrxて必要な行を見つけることができます。

于 2012-08-07T08:11:51.760 に答える