我知道这个话题已在这里多次讨论过了。但我花了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'
谁能说出我做错了什么?我花了很多时间,但仍然没有运气。
谢谢!
很抱歉这篇长篇文章。
答案 0 :(得分:1)
你必须做的是摆脱参数中的新行,因为:
@BusinessClass = N'Commercial Management Solutions,
HEALTHCARE,
PROGRAMS - PROFESSIONAL,
CANADA'
与
不同@BusinessClass = N'Commercial Management Solutions,HEALTHCARE,PROGRAMS - PROFESSIONAL,CANADA'
并且您告诉您的功能唯一的分隔符是逗号(,
),它不是,它是逗号和一个新行对于第一段代码,基本上是, + CHAR(13) + CHAR(10)
。这个CHAR(13) + CHAR(10)
实际上意味着新行。为了更多地了解这个主题,我将引导您走向little article。直接解释这个问题,这可以两种方式工作(当你&#34;搜索&#34;像你这样的东西或你想要为(n)varchar添加新行时)。