ALTER PROC [dbo].[spIVDiscre]
@Value varchar(10) = '1,2'
as
BEGIN
SELECT
'0' as Value ,
pn.No_,
[Address Code] = pn.[Address Code],
[Contact] = pn.[Phone No_],
[Partner Name] = pn.[Name],
[Partner Name 2] = pn.[Name 2],
[PledgeType] = pdl.[PledgeType],
[Address] = pn.[Address]
INTO #Temp110
FROM dbo.[Product Line] pdl WITH (NOLOCK)
INNER JOIN [Pledges] pl WITH (NOLOCK)
ON pdl.[Pledge ID]=pl.ID
LEFT JOIN [dbo].[Contact] pn with (NOLOCK)
on pdl.[No_] = pn.No_
LEFT join [dbo].[Country_Region] co WITH (NOLOCK)
on pn.[Country_Region Code] = co.Code
LEFT JOIN
(
SELECT
cast(Value as int) as Code,
Value2 as Description
FROM Config WITH (NOLOCK)
WHERE
Category='Children'
AND SubCategory='Status'
AND DATEDIFF(dd,GETDATE(),ISNULL(ObsoleteDate,DATEADD(dd,1,GETDATE())))>0
) childstatus
on c.StatusID = childstatus.Code
END
--------------------------------------- @ListA------------------------------------------
IF @Value='1' --ListA
BEGIN
INSERT INTO #Temp110
SELECT
--iList = CAST (@iList as int ) ,
@Value as Value ,
pn.No_,
[Address Code] = pn.[Address Code],
[Contact] = pn.[Phone No_],
[Partner Name] = pn.[Name],
[Partner Name 2] = pn.[Name 2],
[PledgeType] = pdl.[PledgeType],
[Address] = pn.[Address]
FROM dbo.[Product Line] pdl WITH (NOLOCK)
INNER JOIN [Pledges] pl WITH (NOLOCK)
ON pdl.[Pledge ID]=pl.ID
LEFT JOIN [dbo].[Contact] pn with (NOLOCK)
on pdl.[No_] = pn.No_
LEFT join [dbo].[Country_Region] co WITH (NOLOCK)
on pn.[Country_Region Code] = co.Code
LEFT JOIN
(
SELECT
cast(Value as int) as Code,
Value2 as Description
FROM Config WITH (NOLOCK)
WHERE
Category='Children'
AND SubCategory='Status'
AND DATEDIFF(dd,GETDATE(),ISNULL(ObsoleteDate,DATEADD(dd,1,GETDATE())))>0
) childstatus
on c.StatusID = childstatus.Code
WHERE
(pdl.[Pledge Status] = '2' and c.StatusID ='4')
or (pdl.[Pledge Status] = '2' and c.StatusID ='7')
END
-------------ListB---------------------
IF @Value='2' --ListB
BEGIN
INSERT INTO #Temp110
SELECT
--iList = CAST (@iList as int ) ,
@Value as Value ,
pn.No_,
[Address Code] = pn.[Address Code],
[Contact] = pn.[Phone No_],
[Partner Name] = pn.[Name],
[Partner Name 2] = pn.[Name 2],
[PledgeType] = pdl.[PledgeType],
[Address] = pn.[Address]
FROM dbo.[Product Line] pdl WITH (NOLOCK)
INNER JOIN [Pledges] pl WITH (NOLOCK)
ON pdl.[Pledge ID]=pl.ID
LEFT JOIN [dbo].[Contact] pn with (NOLOCK)
on pdl.[No_] = pn.No_
LEFT join [dbo].[Country_Region] co WITH (NOLOCK)
on pn.[Country_Region Code] = co.Code
LEFT JOIN
(
SELECT
cast(Value as int) as Code,
Value as Description
FROM Config WITH (NOLOCK)
WHERE
Category='Children'
AND SubCategory='Status'
AND DATEDIFF(dd,GETDATE(),ISNULL(ObsoleteDate,DATEADD(dd,1,GETDATE())))>0
) childstatus
on c.StatusID = childstatus.Code
WHERE
(pdl.[Pledge Status] = '2' and c.StatusID ='3')
or (pdl.[Pledge Status] = '2' and c.StatusID ='6')
END
select * from #Temp110
where Value in (select Value2 from [fnDiscre] ('1,2,3', ','))
这是SPLIT()函数
Alter FUNCTION [dbo].[fnIVDiscre]
( @string varchar(4000))
Returns
@Result Table (Value varchar(100))
As
Begin
declare @len int, @loc int = 1
While @loc <= len(@string)
Begin
Set @len = CHARINDEX(',', @string, @loc) - @loc
If @Len < 0 Set @Len = len(@string)
Insert Into @Result Values (SUBSTRING(@string,@loc,@len))
Set @loc = @loc + @len + 1
End
Return
End
我有一个参数@Value,并将其在数据集中的值设置为= Join(Parameters!Value.Value,“,”)。
它在用户选择一个Value时起作用,但是在选择多个Value时根本不起作用。它运行,但不显示任何数据。例如,如果我选择“值1”,则显示“值1”信息。但是,如果我选择“值1”和“值2”,则不会显示任何内容。
有什么想法为什么不起作用?非常感谢
答案 0 :(得分:0)
除非我缺少任何东西。...
您正在按照默认参数值的建议将逗号分隔的值列表传递给存储的proc
@Value varchar(10) = '1,2'
然后检查参数值是'1'还是'2',但是如果您传递'1,2',则永远不会只是'1'或'2'。
您需要分割传入的字符串,然后检查结果。偶然地,您可能可以使用内置的string_split()
函数。
是这样的。
DECLARE @Value varchar(10) = '1,2'
DECLARE @ParamValues TABLE (pValue varchar(10))
INSERT INTO @ParamValues
SELECT * FROM string_split(@value, ',')
然后您的测试将从IF @Value='1' --ListA
变为
IF EXISTS(SELECT * FROM @ParamValues WHERE pValue = 1) -- ListA
BEGIN
... your exsiting code block
END
并重复2