如何在存储过程中添加循环和比较 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
我有以下一组数字作为 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