比方說,我有一個包含一個varchar字段的表:構建動態T-SQL查詢在一個存儲過程
CREATE TABLE [MyTable] (
[MyId] varchar(3) NOT NULL,
.....
)
的[身份識別碼]列包含像A1,A2連續alphanum值... 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)
以上proecedure會被稱爲是這樣的:
EXEC uspFilterMyTable("A,C,P,X")
...或者可能是這樣的(如果它使分裂阿爾法賭注更容易):
EXEC uspFilterMyTable("ACPX")
任何想法?指針?
更新: OK,這是我想出(從賈特拉帕蒂·夏爾馬借來[分割]功能):
-- [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
這是醜陋的,我知道,但它的工作原理..任何提示即興代碼?
你如何使用它?你從哪裏來的? –
您使用的是什麼RDBMS,MS SQL Server,MySQL,Oracle,Postgre? – Yaroslav
我實際上使用EF - 但我想保持業務邏輯在服務器端...此過程將返回只讀行,將被稱爲很多 – invarbrass