传递到 SUBSTRING 函数的长度参数无效(搞不清思路)

HIpity 2011-11-09 12:11:44

ALTER FUNCTION [dbo].[Fn_ProdAttr_IsUse]
(
@AttrRelIDList VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
declare @returnValue int
SET @returnValue=0

while(charindex(',',@AttrRelIDList)>0)
begin
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))
SET @returnValue=1
set @AttrRelIDList=stuff(@AttrRelIDList,1,charindex(',',@AttrRelIDList),'')
IF(EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))
SET @returnValue=1
set @AttrRelIDList=stuff(@AttrRelIDList,1,charindex(',',@AttrRelIDList),'')
end
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=@AttrRelIDList))
SET @returnValue=1
IF(EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=@AttrRelIDList))
SET @returnValue=1

return @returnValue
END

测试
select dbo.Fn_ProdAttr_IsUse('333,333')报错
消息 536,级别 16,状态 5,第 1 行
传递到 SUBSTRING 函数的长度参数无效。
按理说是substring里传入 负值索引,我感觉这个函数是对的
...全文
692 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
--小F-- 2011-11-09
  • 打赏
  • 举报
回复
而且在你的存储过程中判断,用的是 ','+@col+','格式的

而你传参直接是'333,333'

估计这个也有问题
--小F-- 2011-11-09
  • 打赏
  • 举报
回复
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))
SET @returnValue=1
set @AttrRelIDList=stuff(@AttrRelIDList,1,charindex(',',@AttrRelIDList),'')
IF(EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))
SET @returnValue=1
set @AttrRelIDList=stuff(@AttrRelIDList,1,charindex(',',@AttrRelIDList),'')


这两段完全可以合并。
中国风 2011-11-09
  • 打赏
  • 举报
回复
樓主測測看優化后的腳本
ALTER FUNCTION [dbo].[Fn_ProdAttr_IsUse]
(
@AttrRelIDList VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
declare @returnValue int
SET @returnValue=0

if EXISTS(SELECT * FROM tb_base_prod WHERE ','+@AttrRelIDList+',' LIKE '%,'+RTRIM(Group_ID)+',%')
OR EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE ','+@AttrRelIDList+',' LIKE '%,'+RTRIM(Father_ID)+',%')
SET @returnValue=1
return @returnValue
END
GO
select dbo.Fn_ProdAttr_IsUse('333,333')

-晴天 2011-11-09
  • 打赏
  • 举报
回复
try:
select dbo.Fn_ProdAttr_IsUse('333,333,')
中国风 2011-11-09
  • 打赏
  • 举报
回复
改改,少改了一個位置
ALTER FUNCTION [dbo].[Fn_ProdAttr_IsUse]
(
@AttrRelIDList VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
declare @returnValue int
SET @returnValue=0

while(charindex(',',@AttrRelIDList)>0)
begin
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))

SET @returnValue=1

else IF (EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))

SET @returnValue=1
set @AttrRelIDList=stuff(@AttrRelIDList,1,charindex(',',@AttrRelIDList),'')
end
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=@AttrRelIDList))
SET @returnValue=1
ELSE IF(EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=@AttrRelIDList))
SET @returnValue=1

return @returnValue
END
GO
select dbo.Fn_ProdAttr_IsUse('333,333')
中国风 2011-11-09
  • 打赏
  • 举报
回复
按以上方法測測
中国风 2011-11-09
  • 打赏
  • 举报
回复
ALTER FUNCTION [dbo].[Fn_ProdAttr_IsUse]
(
@AttrRelIDList VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
declare @returnValue int
SET @returnValue=0

while(charindex(',',@AttrRelIDList)>0)
begin
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))

SET @returnValue=1

else IF (EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=substring(@AttrRelIDList,1,charindex(',',@AttrRelIDList)-1)))

SET @returnValue=1
set @AttrRelIDList=stuff(@AttrRelIDList,1,charindex(',',@AttrRelIDList),'')
end
IF(EXISTS(SELECT * FROM tb_base_prod WHERE Group_ID=@AttrRelIDList))
SET @returnValue=1
IF(EXISTS(SELECT * FROM tb_Base_Prod_Attr_Rel WHERE Father_ID=@AttrRelIDList))
SET @returnValue=1

return @returnValue
END
GO
select dbo.Fn_ProdAttr_IsUse('333,333')
AcHerat 2011-11-09
  • 打赏
  • 举报
回复
那个循环体里的判断是不是有问题。

意思是如果两个表有其中一个存在满足判断的条件就去对你那个变量做处理么?

while ...
begin
if exists () or exists ()
begin
set ...
set ...
end
end

这样子。
AcHerat 2011-11-09
  • 打赏
  • 举报
回复
charindex(',',@AttrRelIDList)-1

如果,号在开始位置,这个截取怎么说。
快溜 2011-11-09
  • 打赏
  • 举报
回复
传值需要加个逗号吧,你判断的逻辑问题

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧