-1

さて、最初の質問です。皆さんはあなたがどれだけ知っているかで私を怖がらせますので、優しくしてください...

区切り文字列を渡して、ストアドプロシージャで配列に変換してから、配列を使用して列の値をチェックしようとしています。これがキャッチです。1つの関連付けをチェックし、それを拡張して複数の関連付けを可能にする既存のテーブルを取得しようとしています。

したがって、列annAssociationsには3つのID、4、16、32が含まれる可能性がありますが、クエリ対象のgroupId、6、12、32に属しているかどうかを確認する必要があります。値の1つが一致したため、その行を返す必要があります。

存在する手順は次のとおりです。

CREATE PROCEDURE [dbo].[sp_annList] 
-- Date Range of Announcements.
@dateBegin datetime,
@dateEnd datetime,
    -- Announcement type and associations.
@annType varchar(50),
@annAssociation varchar(255)

AS
BEGIN

-- Set the SELECT statement for the announcements.
SET NOCOUNT ON;
-- See if this should be a limited query
IF @annAssociation <> ''
    Begin
        SELECT * 
        FROM announcements
        WHERE (date1 <= @dateEnd AND date2 >= @dateBegin) -- See if the announcement falls in the date range.
            AND annType = @annType -- See if the announcement is the right type.
            AND annAssociations LIKE (select SplitText from dbo.fnSplit(@annAssociation, ','))
        ORDER BY title
    END
Else 
    Begin
        SELECT *
        FROM announcements
        WHERE (date1 <= @dateEnd AND date2 >= @dateBegin)
            AND annType = @annType
        ORDER BY title
    End
END

そして、これが私が区切り文字列を変換して一時テーブルに格納するために使用しているメソッドです。

CREATE Function [dbo].[fnSplit](@text text, @delimitor nchar(1))

RETURNS
@table TABLE
(
[Index] int Identity(0,1),
[SplitText] varchar(10)
)
AS

BEGIN
declare @current varchar(10)
declare @endIndex int
declare @textlength int
declare @startIndex int

set @startIndex = 1

if(@text is not null)
begin
    set @textLength = datalength(@text)

    while(1=1)
    begin
        set @endIndex = charindex(@delimitor, @text, @startIndex)

        if(@endIndex != 0)
        begin
            set @current = substring(@text,@startIndex, @endIndex - @StartIndex)
            Insert Into @table ([SplitText]) values(@current)
            set @startIndex = @endIndex + 1   
        end
        else
        begin
            set @current = substring(@text, @startIndex, datalength(@text)-@startIndex+1)
            Insert Into @table ([SplitText]) values(@current)
            break
        end
    end

end

return
END

長い質問でごめんなさい。私はただそこにすべての情報を入手したかったのです。私は何日も研究を続けてきましたが、どこを見ればよいかわからないか、明らかな何かが欠けています。

4

1 に答える 1

0

このアプローチよりもパフォーマンスが大幅に向上することはおそらくないでしょう(CLR分割関数を使用するとパフォーマンスが向上する可能性がありますが、3つまたは4つの項目では大きな違いは見られません)。

SELECT * 
  FROM announcements AS a
  WHERE ...
  AND EXISTS (SELECT 1 FROM dbo.fnSplit(@annAssociation) AS n
    WHERE ',' + a.annList + ',' LIKE '%,' + n.SplitText + ',%');

ここで重要なのは、リストの1つだけを分割する必要があるということです。

実際には、列に複数の値を格納するのをやめる必要がありますannAssocations。各IDは個別のデータであり、個別に保存する必要があります(正規化への準拠に加えて、このようなクエリが簡単になります)。

于 2012-06-12T00:24:12.030 に答える