varchar フィールドを含むテーブルがあるとします。
CREATE TABLE [MyTable] (
[MyId] varchar(3) NOT NULL,
.....
)
[MyId]列には、A1、A2... A99、B1、B2..B99、C1 など (Z99 まで) のような連続した英数字の値が含まれます。
私がしたいのは、MyIdフィールドが特定のプレフィックスに一致するテーブルから行を抽出することです...たとえば、シリーズ A、C、P、および X から行をフェッチしたいと思います。
そして、引数で指定されたプレフィックスのアルファベットに基づいてクエリを動的に構築する sproc を使用してこれを行いたいと思います。
なんかこんなこと考えてる…
CREATE PROCEDURE [dbo].[uspFilterMyTable]
@prefixArray varchar(max)
AS
... -- split individual characters from @prefixArray into an array
SELECT * FROM [MyTable]
WHERE
[MyId] LIKE ....
OR
[MyId] LIKE .... -- iterate all characters from @prefixArray
ストアド プロシージャの主な部分は、次の疑似コードのようになると思います。
DECLARE @sql nvarchar(max)
-- iterate through all the characters
SET @sql = 'SELECT * FROM [MyTable] WHERE [MyId] LIKE ' + @charInTheArray + '%'
SET @sql = @sql + ' OR [MyId] LIKE ' + @nextCharInArray + '%'
EXEC (@sql)
上記の手順は次のように呼び出されます。
EXEC uspFilterMyTable("A,C,P,X")
...またはおそらく次のようになります(アルファベットの分割が簡単になる場合):
EXEC uspFilterMyTable("ACPX")
何か案は?ポインタ?
更新: OK、これは私が思いついたものです ([Split] 関数は Chhatrapati Sharma から借用):
-- [MyTable] contains these rows: 'A7', 'A87', 'B16', 'C51', 'H99', 'X12'
-- the "input" parameter
DECLARE @prefixArray NVARCHAR(100)= 'H,A,C'
-- split the string into SQL wild-card patterns
DECLARE charCursor CURSOR FOR
select items + N'%' from dbo.Split(@prefixArray, ',')
OPEN charCursor;
DECLARE @pattern CHAR(2)
-- create temp table if necessary
IF NOT EXISTS(SELECT * FROM TEMPDB.SYS.TABLES WHERE NAME LIKE '#tmpTable%')
CREATE TABLE #tmpTable ([Id] VARCHAR(3) NOT NULL)
-- purge old data
DELETE FROM #tmpTable
FETCH NEXT FROM charCursor into @pattern
WHILE @@FETCH_STATUS = 0
BEGIN
--SELECT * INTO #tmpTable FROM [MyTable] WHERE [MyId] LIKE @pattern
Insert Into #tmpTable Select * FROM [MyTable] WHERE [MyId] LIKE @pattern
FETCH NEXT FROM charCursor into @pattern
END
CLOSE charCursor;
DEALLOCATE charCursor;
-- return the values
SELECT * FROM #tmpTable
醜いことはわかっていますが、機能します...コードを即興で作成するためのヒントはありますか?