さて、最初の質問です。皆さんはあなたがどれだけ知っているかで私を怖がらせますので、優しくしてください...
区切り文字列を渡して、ストアドプロシージャで配列に変換してから、配列を使用して列の値をチェックしようとしています。これがキャッチです。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
長い質問でごめんなさい。私はただそこにすべての情報を入手したかったのです。私は何日も研究を続けてきましたが、どこを見ればよいかわからないか、明らかな何かが欠けています。