注意:出于性能原因,参数值的连接和拆分是一个糟糕的设计,最重要的是,它很容易受到SQL injection 攻击。请研究一些替代方案。如果你必须沿着这条路走下去……
那里有很多拆分函数,但我用这个here 来说明一个可能的解决方案。
CREATE FUNCTION [dbo].[fnSplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
GO
根据您的问题,不清楚您是否需要根据 int、varchar 或各种其他可用数据类型过滤结果,但这里有两个选项(可能是最常见的)。
DECLARE @TableOfData TABLE
(
ID_INT INT,
ID_VAR VARCHAR(100),
START_DATE DATETIME,
END_DATE DATETIME
)
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
DECLARE @Ids VARCHAR(1000)
DECLARE @Delimiter VARCHAR(1)
SET @Delimiter = ','
SET @StartDate = GETDATE()
SET @EndDate = DATEADD(HH, 1, GETDATE())
SET @Ids = '1,2,4'
--Create some test data
INSERT INTO @TableOfData
SELECT 1, '1', GETDATE(), DATEADD(MI, 1, GETDATE()) --In our window of expected results (date + id)
UNION SELECT 2, '2', GETDATE(), DATEADD(D, 1, GETDATE()) --NOT in our window of expected results b/c of date
UNION SELECT 3, '3', GETDATE(), DATEADD(MI,2, GETDATE()) --NOT in our expected results (id)
UNION SELECT 4, '4', GETDATE(), DATEADD(MI,4, GETDATE()) --In our window of expected results (date + id)
--If querying by string, expect 2 results
SELECT TD.*
FROM @TableOfData TD
INNER JOIN dbo.fnSplitString(@Ids, @Delimiter) SS
ON TD.ID_VAR = SS.splitdata
WHERE START_DATE >= @StartDate
AND END_DATE <= @EndDate
--If querying by int, expect 2 results
SELECT TD.*
FROM @TableOfData TD
INNER JOIN dbo.fnSplitString(@Ids, @Delimiter) SS
ON TD.ID_INT = CONVERT(int, SS.splitdata)
WHERE START_DATE >= @StartDate
AND END_DATE <= @EndDate