これがSQL Server 2008なら、TABLE型パラメータとIN句で一発解決なのですが、SQL Server 2005ということなので、ちょっと残念です。
さて、解決方法ですが、普通マッチさせるには
SQL文のIN句を使う必要があるのと、またそのIN句はTABLE型に
対応したものでなければいけません。
しかし、SQL Sever 2005は、TABLE型の引数を受け付けることが
できないので、下記のようなFunctionを作って処理させないと
処理できないです。例えばこんな感じですかね。
1.SQL Server 2005上に、下記のFunctionを作成する
CREATE FUNCTION [dbo].[SplitText]
(
@Texts as nvarchar(max)
)
RETURNS @Table TABLE([Text] varchar(max))
AS
BEGIN
DECLARE @SeparatorChar AS CHAR(1)
DECLARE @NullText AS NVARCHAR(16)
DECLARE @Cnt int;
DECLARE @NextChar nvarchar(1);
DECLARE @SaveText nvarchar(max);
SELECT @SeparatorChar = ',',
@NullText = '',
@Cnt = 1,
@NextChar = '',
@SaveText = '';
WHILE @Cnt <= LEN(@Texts)
BEGIN
SET @NextChar = SUBSTRING(@Texts, @Cnt, 1);
IF @NextChar = @SeparatorChar
BEGIN
IF @SaveText = @NullText SET @SaveText = NULL;
INSERT INTO @Table VALUES(@SaveText);
SET @SaveText = '';
END
IF @NextChar <> @SeparatorChar
BEGIN
SET @SaveText = @SaveText + SUBSTRING(@Texts, @Cnt, 1);
END
SET @Cnt = @Cnt + 1;
END
IF @SaveText = @NullText SET @SaveText = NULL;
INSERT INTO @Table VALUES(@SaveText);
RETURN
END
2.作成しているストアドの引数の型をINTではなく、NVARCHAR(MAX)
に変更する
ALTER PROCEDURE [dbo].[XXXXX]
(@会員番号 NVARCHAR(MAX))
AS .....
3.作成しているストアドから1.で作成したFunctionを呼び出すよう
修正する
SELECT * FROM TB会員
WHERE 会員番号 IN(SELECT * FROM [dbo].[SplitText](@会員番号))
これでOKなのですが、作成したストアドを呼び出す時は、
検索したい複数の会員番号を ","(カンマ)で区切って下さい。
例:
DECLARE @会員番号 NVARCHAR(MAX)
SET @会員番号 = '1,2,3,4,5,6,7,8'
EXEC [スキーマ名].[作成したストアド] @会員番号
こんな感じで対応できるのであれば、ご検討下さい。
#なお上記のFunctionは、
http://blogs.wankuma.com/mura/archive/2008/01/07/116304.aspx
で公開されていますが、私が若干アレンジ加えております。
ご参考になれば幸いです。
お礼
ご解答ありがとうございます! 私も質問する前に[,]区切りでのストアドは作成してみたのですがサンプルで私が記述したのとは違い、実際に扱う上での選択されるデータ量が多くなる可能性があるので、nvarchar(MAX)にしてしまうと、どれだけのメモリを使うか検討もつかないという状況になってしまうのです。 そのため、[,]区切りを避けていたのですが・・・。 やはり,区切りでファンクション処理を行う方がスマートですよね。 もっとも・・・一番スマートなのはワークテーブルを使うことなのですが・・・。 ありがとうございましたっ!