大家好我有一个带有两个参数@Startdate和@Enddate的存储过程。当我执行程序时,我得到数据。
现在我添加了一个参数,它有值列表。所以我添加了一个split函数并添加到WHERE
子句中。现在我执行我的SP后进行更改后,我没有得到任何数据。我尝试从WHERE子句中注释掉第3个参数,现在我再次看到数据。不确定发生了什么。任何意见是极大的赞赏。
我尝试过不同的分割函数和Charindex(','+cast(tableid as varchar(8000))+',', @Ids) > 0
,但没有任何效果。
感谢
答案 0 :(得分:0)
注意:由于性能原因,参数值的串联和拆分设计很差,最重要的是,它很容易受到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
答案 1 :(得分:0)
您不能在查询过滤器中直接使用带有列表的参数。尝试将分离的数据存储到表变量或临时表中,并在查询中调用该数据,或者如果您不想使用表变量或临时表,请使用动态SQL编写查询。