【问题标题】:Stored procedure not returning all records when passing multiple values to the parameters将多个值传递给参数时,存储过程不返回所有记录
【发布时间】:2018-04-22 04:28:25
【问题描述】:

我知道这个话题已经在这里讨论过很多次了。但是我已经花了 2 天时间,仍然无法弄清楚我的代码的问题。任何帮助将不胜感激。

我有一个需要 6 个参数的存储过程,并且我正在为它们传递多个值。选择单个值时,存储过程会返回正确的记录。

请找到存储过程代码,我使用的是一个udf [ufnsplit],用于拆分表中传递的值

CREATE PROCEDURE [dbo].[Test1]
    @BUClass AS NVARCHAR(MAX),
    @Office AS NVARCHAR(MAX),
    @writer AS NVARCHAR(MAX),        
    @From AS DATETIME,
    @To AS DATETIME,
AS 
BEGIN
    SET NOCOUNT ON
    SET ANSI_WARNINGS ON

   ;WITH UWS AS 
   (
       SELECT
           [Prefix],
           BusinessUnit,
           Office,
           Writer,
           FormName,
           Company
       FROM 
           A
       WHERE    
           BUClass IN (SELECT item FROM dbo.ufnSplit(@BUClass, ','))
           AND Office IN (SELECT item FROM [dbo].[ufnSplit](@Office, ','))
           AND Writer IN (SELECT item FROM [dbo].[ufnSplit](@writer, ','))
           AND Expiry_DT >= @From
           AND Expiry_DT <= @To
    ) 
    SELECT * 
    FROM UWS
END

我使用的功能是

CREATE FUNCTION [dbo].[ufnSplit]
    (@RepParam NVARCHAR(MAX), @Delim CHAR(1)= ',')
RETURNS @Values TABLE (Item NVARCHAR(100))
AS
BEGIN
    DECLARE @chrind INT
    DECLARE @Piece NVARCHAR(100)

    SELECT @chrind = 1 

    WHILE @chrind > 0
    BEGIN
        SELECT @chrind = CHARINDEX(@Delim, @RepParam)

        IF @chrind  > 0
            SELECT @Piece = LEFT(@RepParam, @chrind - 1)
        ELSE
            SELECT @Piece = @RepParam

        INSERT INTO @Values(Item) VALUES(@Piece)

        SELECT @RepParam = RIGHT(@RepParam, LEN(@RepParam) - @chrind)

        IF LEN(@RepParam) = 0 
            BREAK
    END

    RETURN
END

当我传递多个值时,返回0条记录,或者第一个值传入参数。我正在传递像

这样的值
DECLARE @return_value int

EXEC    @return_value = [dbo].[Test1]
                @Office = N'ATLANTA, 
                            BERKELEY HEIGHTS, 
                            BOSTON, 
                            CHICAGO, 
                            CLEVELAND',
                @BusinessClass = N'Commercial Management Solutions,
                                   HEALTHCARE, 
                                   PROGRAMS - PROFESSIONAL, 
                                   CANADA',
                @writer = N'Grant Duggar, 
                            Alyssa Gulich, 
                            Amanda Kelly,   
                            Daniel Chavenson, 
                            Deborah Wilieko, 
                            Derek Barbe'
                @From = N'1/1/2018',
                @To = N'4/1/2018',

我对数据库运行了一个简单的查询,只是为了检查这些条件是否有数据。我取回数据

SELECT DISTINCT * 
FROM A
WHERE BUclass IN (SELECT DISTINCT BUClass FROM A)
  AND Office IN (SELECT DISTINCT Producing_Office FROM A)
  AND UWName IN (SELECT DISTINCT UWName FROM A)
  AND Expiry_DT = '1/1/2018' 
  AND Expiry_DT <= '4/1/2018' 

谁能告诉我我做错了什么?我已经花了很多时间,但仍然没有运气。

谢谢!

抱歉,帖子太长了。

【问题讨论】:

  • 首先,你为什么不尝试在你传递的参数中删除新行(而不是ATLANTA,_NEWLINE_ BERKELEY HEIGHTS 写成ATLANTA,BERKELEY HEIGHTS,... 并让我们知道结果?
  • 非常感谢!!!!有效。你能告诉我通过新线和没有新线有什么区别吗?它是如何工作的?
  • 当然,我会发布一个带有解释的答案。

标签: sql-server stored-procedures parameters multiple-value


【解决方案1】:

你必须做的是去掉参数中的新行,因为:

@BusinessClass = N'Commercial Management Solutions,
                                   HEALTHCARE, 
                                   PROGRAMS - PROFESSIONAL, 
                                   CANADA'

不一样

@BusinessClass = N'Commercial Management Solutions,HEALTHCARE,PROGRAMS - PROFESSIONAL,CANADA'

并且你告诉你的函数唯一的分隔符是逗号 (,) 不是,它是逗号代码的第一个 sn-p 的新行本质上是, + CHAR(13) + CHAR(10)。这个CHAR(13) + CHAR(10) 实际上意味着换行。为了阅读更多关于这个主题的信息,我会引导你阅读这个little article。直接解释问题,这两种方式都有效(当您“搜索”类似的东西或当您想向 (n)varchar 添加新行时)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2011-07-12
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多