【问题标题】:Adding Parameter causing issues-No data displayed添加参数导致问题 - 无数据显示
【发布时间】:2016-09-01 19:35:33
【问题描述】:

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

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

我尝试了不同的拆分功能和Charindex(','+cast(tableid as varchar(8000))+',', @Ids) > 0,但没有任何效果。 谢谢

【问题讨论】:

  • 您需要发布您的代码。错误似乎在于您的功能正在做什么(首先检查它,它的结果)或您如何限制它。我会研究这些真正快速的拆分功能之一:sqlservercentral.com/articles/Tally+Table/72993
  • 分割函数的输出是字符串类型吗?如果是,请检查返回值是 a 还是 'a'。
  • 是的,操作是字符串类型。我根本不明白添加第三个参数是如何导致问题的。到 ffrom 日期做得很好,但是当我添加一个带有值列表的参数并在 where 子句中使用它时,它会弄乱输出。我只是无法理解发生了什么

标签: tsql sql-server-2012


【解决方案1】:

注意:出于性能原因,参数值的连接和拆分是一个糟糕的设计,最重要的是,它很容易受到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

【讨论】:

  • 感谢 sql 我得到“invalid columnnmae”splitdata”错误
  • 请分享您的参数和 spltidata 函数,我也许可以提供帮助。
【解决方案2】:

您不能直接在查询过滤器中使用带有列表的参数。尝试将分离的数据存储到表变量或临时表中并在查询中调用它,或者如果您不想使用表变量或临时表,请使用动态 SQL 编写查询。

【讨论】:

  • OP 表示他们正在拆分多值参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2020-10-14
  • 2020-11-15
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多