假设我有一个包含 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")
有任何想法吗?指针?
更新:好的,这就是我想出的(从 Chhatrapati Sharma 借来的 [Split] 函数):
-- [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
我知道这很难看,但它确实有效……有什么技巧可以即兴编写代码吗?