1

私は次のようにSQLクエリを書いています:

ALTER proc [dbo].[Invoice_GetHomePageInvoices] (
      @AreaIdList varchar(max)
,      @FinancialYearStartDate datetime = null
,      @FinancialYearEndDate datetime = null
) as

    set nocount on

    select *
    from Invoice i
    left outer join Organisation o on i.OrganisationId = o.Id
    left outer join Area a on i.AreaId = a.Id
where i.InvoiceDate BETWEEN @FinancialYearStartDate AND @FinancialYearEndDate

@AreaIdListパラメーターは、「1,2,3」などの形式になります。

@AreaIdList内のいずれかのIDと等しいエリアIDを持つ請求書のみを返す行を追加したいと思います。

ieで検索するのがareaIdにある場合、ステートメントを実行する方法を知っています。問題は、i.AreaId == areaId@AreaIdList内のすべてのエリアIDについて比較する必要があるこのリストです。

誰かがあなたがこれについてどうするか教えてもらえますか?

4

1 に答える 1

0

ID リストをテーブルにアンパックして使用するwhere AreadID in (select ID from ...)

ALTER proc [dbo].[Invoice_GetHomePageInvoices] (
       @AreaIdList varchar(max)
,      @FinancialYearStartDate datetime = null
,      @FinancialYearEndDate datetime = null
) as

set nocount on

set @AreaIdList = @AreaIdList+','
declare @T table(ID int primary key)
while len(@AreaIdList) > 1
begin
  insert into @T(ID) values (left(@AreaIdList, charindex(',', @AreaIdList)-1))
  set @AreaIdList = stuff(@AreaIdList, 1, charindex(',', @AreaIdList), '')
end

select *
from Invoice i
  left outer join Organisation o on i.OrganisationId = o.Id
  left outer join Area a on i.AreaId = a.Id
where i.InvoiceDate BETWEEN @FinancialYearStartDate AND @FinancialYearEndDate and
      i.AreadID in (select ID from @T) 
于 2012-04-17T06:05:56.790 に答える