解決SQLSEVER 存儲過程入參不能帶入in的參數傳帶逗號值的辦法

ALTER PROCEDURE [dbo].[P_UpdateUserLeftRightV2]
    @UserId   varchar(50),
	@TotalBonus decimal(18,2),
    @LeftUsers  varchar(MAX),
    @RightUsers varchar(MAX)
AS
BEGIN
	SET NOCOUNT ON;
    begin tran
		begin
           if @LeftUsers <> ''
              begin
			    update [User] set LeftTotal=LeftTotal+@TotalBonus,LeftNew=LeftNew+1 where UserID in (<span style="font-family: Arial, Helvetica, sans-serif;">@LeftUser</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span>
              end
           if @LeftUsers <> ''
              begin
			     update [User] set RightTotal=RightTotal+@TotalBonus,RightNew=RightNew+1 where UserID in (@<span style="font-family: Arial, Helvetica, sans-serif;">RightUsers</span><span style="font-family: Arial, Helvetica, sans-serif;">);</span>
              end
           update [User] set isupdate = 1 where userid=@UserId;
		end
    
    if @@ERROR<>0
		rollback tran
	else
		commit tran

    SET NOCOUNT OFF;
END


如上代碼:入參 LeftUsers和@RightUsers 是一個字符串,類似 11,22,33,調用後不能實現效果,where不能成立

解決這個問題,可以使用函數來處理,把入參數據構成列在函數的表值函數下面,函數如下

create   function   [dbo].[f_split](@c   varchar(2000),@split   varchar(2))   

returns   @t   table(col   varchar(20))   

as   

    begin     

      while(charindex(@split,@c)<>0)   

        begin   

          insert   @t(col)   values   (substring(@c,1,charindex(@split,@c)-1))   

          set   @c   =   stuff(@c,1,charindex(@split,@c),'')   

        end   

      insert   @t(col)   values   (@c)   

      return   

    end

如何調用如下:select col from [dbo].[f_split](@LeftUsers,',')

ALTER PROCEDURE [dbo].[P_UpdateUserLeftRightV2]
    @UserId   varchar(50),
	@TotalBonus decimal(18,2),
    @LeftUsers  varchar(MAX),
    @RightUsers varchar(MAX)
AS
BEGIN
	SET NOCOUNT ON;
    begin tran
		begin
           if @LeftUsers <> ''
              begin
			    update [User] set LeftTotal=LeftTotal+@TotalBonus,LeftNew=LeftNew+1 where UserID in (select col from [dbo].[f_split](@LeftUsers,','));
              end
           if @LeftUsers <> ''
              begin
			     update [User] set RightTotal=RightTotal+@TotalBonus,RightNew=RightNew+1 where UserID in (select col from [dbo].[f_split](@RightUsers,','));
              end
           update [User] set isupdate = 1 where userid=@UserId;
		end
    
    if @@ERROR<>0
		rollback tran
	else
		commit tran

    SET NOCOUNT OFF;
END


即可解決。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章