添加参数导致问题 - 不显示数据

时间:2016-09-01 19:35:34

标签: tsql sql-server-2012

大家好我有一个带有两个参数@Startdate和@Enddate的存储过程。当我执行程序时,我得到数据。

现在我添加了一个参数,它有值列表。所以我添加了一个split函数并添加到WHERE子句中。现在我执行我的SP后进行更改后,我没有得到任何数据。我尝试从WHERE子句中注释掉第3个参数,现在我再次看到数据。不确定发生了什么。任何意见是极大的赞赏。

我尝试过不同的分割函数和Charindex(','+cast(tableid as varchar(8000))+',', @Ids) > 0,但没有任何效果。 感谢

2 个答案:

答案 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编写查询。