如何在存储过程中添加循环和比较 SQL

How to add loops and compare in stored procedures SQL

我有以下一组数字作为 varchar,并将输入作为整数 var。

@ProductId int
 
DECLARE @AllowedProductIds varchar(max) 
SET @AllowedProductIds ='7002,7058,67,7000,7059,7038'
 
IF (@ProductId = (SELECT CAST(@AllowedProductIds AS INTEGER) 
                  FROM dbo.SplitString(@AllowedProductIds, ','))) 
BEGIN
    SET @boolVariable = 1 
END

我想用定界符分隔 varchar,在我的例子中是 (,),然后将每个与输入和 return 布尔变量的结果进行比较。

这是我尝试过但出现错误的以下代码:

Conversion failed when converting varchar to int

有人可以帮我解决这个问题吗?

您的 cast 调用没有从 dbo.SplitString 调用中读取返回的列,而是试图将整个输入字符串计算为整数,但事实并非如此。

我不知道你的 SplitString 函数的输出模式,但让我们想象一下它 returns 是这样的:

Input string: '12345,123,234,345'

Output table:

 SplitStringItem
 12345
 123
 234
 345

那么你的电话应该是:

if @ProductId IN 
(
    select cast(SplitStringItem AS INTEGER) from dbo.SplitString(@AllowedProductIds, ',')
)

请注意使用 IN 运算符而不是 = 运算符的更改,因为您正在尝试评估单个整数值是否在可能值列表中。

当您使用 SQL 服务器时,您可以这样做

declare @AllowedProductIds varchar(max), @ProductId int=67
set @AllowedProductIds ='7002,7058,67,7000,7059,7038'
 
if exists (select * from String_Split(@AllowedProductIds, ',') where Cast(value as int)=@ProductId )
print 'yay'

或者

declare @AllowedProductIds varchar(max), @ProductId int=67
set @AllowedProductIds ='7002,7058,67,7000,7059,7038'
 
if exists (select * from String_Split(@AllowedProductIds, ',') where value=Cast(@ProductId as varchar) )
print 'yay'

select @boolVariable=
case when exists (select * from String_Split(@AllowedProductIds, ',') where value=Cast(@ProductId as varchar) )
then 1 else 0 end

在 SQL Server 2016 中,您可以使用 string_split() 函数来实现您想要实现的目标。

查询:

DECLARE @ProductId int,@isHavingBoldAccess int
set @ProductId=7058

DECLARE @AllowedProductIds varchar(max) 
SET @AllowedProductIds ='7002,7058,67,7000,7059,7038'
 
IF @ProductId in
(
select * from STRING_SPLIT(@AllowedProductIds, ',')
)

SET @isHavingBoldAccess = 1 

print @isHavingBoldAccess

输出:

1

db<>fiddle here

您可以像这样简化您的代码

上面提到的错误也在这里解决了。

如果 @ProductId@AllowedProductIds 字符串匹配,我们可以将值指定为 1,否则它将采用默认值变量 @boolVariable 的值。这里它的默认值为NULL.

DECLARE @AllowedProductIds VARCHAR(MAX),
@boolVariable INT,
@ProductId INT=67

SET @AllowedProductIds ='7002,7058,67,7000,7059,7038'

SELECT @boolVariable = 1
FROM String_Split(@AllowedProductIds, ',')
WHERE  CAST(Value AS INTEGER) =@ProductId

SELECT @boolVariable