SQL学习笔记[5] - 通过分隔符解析方式实现向SQL存储过程传递数组参数

通过分隔符解析方式实现向SQL存储过程传递数组参数,一维数组比较简单,这里实现二维数组,以下直接代码。

事务我注释掉了,调试的时候用不上,大家需要用的时候自行加上或者删去。

@AccountInfo参数就是数组的完整字符串,通过解析它得到我们要的数组元素,然后用把元素组装到处理具体业务功能的sql语句中,如本例中注释掉的update语句。

执行结果示例附后。

-- =============================================
-- Author:		<yuexiang>
-- Create date: <2015.10.11>
-- Description:	comfirm back info In OA
-- =============================================
CREATE PROCEDURE [MaterialControl].[公司级合格厂商银行账户信息确认] 
	-- Add the parameters for the stored procedure here
	@VendorComID int,
	@AccountInfo nvarchar(2000),
	@Comfirmer varchar(30),
	@ComfirmTime datetime,
	@SheetNumber varchar(100),
	@iRel int OUTPUT
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
--BEGIN TRAN --begin transacion

DECLARE @tran_error int;  -- error code
SET @tran_error = 0;

BEGIN TRY 
	declare @location1 int    --split index 1
	declare @location2 int    --split index 2
	declare @split1 char(1)   --split 1
	declare @split2 char(1)   --split 2
	set @split1 = '*'
	set @split2 = ','
	declare @str nvarchar(2000)
	declare @temp1 nvarchar(2000)
	declare @temp2 nvarchar(2000)
	
	declare @id int
	declare @bankname varchar(200)
	declare @province varchar(50)
	declare @city varchar(50)
	declare @accountold varchar(100)
	declare @accountnew varchar(100)
	
	DECLARE @oaStatusCode char(1)
	
	PRINT @AccountInfo;
	set @str=ltrim(rtrim(@AccountInfo))
	--PRINT @str;
	set @location1=charindex(@split1,@str)  -- 第一级分隔符第一个的位置
    --PRINT @location1;
    SET @temp1 = SUBSTRING(@str,0,CHARINDEX(@split1,@str))  --第一行银行信息
    --PRINT @temp1;
    
	WHILE @location1<>0
	BEGIN
		SET @location2=charindex(@split2,@temp1)  -- 第二级分隔符第一个的位置
	    --PRINT @location2;
		WHILE @location2<>0
		BEGIN
			SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
			SET @id = @temp2
			PRINT @id;
			SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
			SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
			SET @bankname = @temp2
			PRINT @bankname;
			SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
			SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
			SET @province = @temp2
			PRINT @province;
			SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
			SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
			SET @city = @temp2
			PRINT @city
			SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
			SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
			SET @accountold = @temp2
			PRINT @accountold
			SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
			SET @temp2 =  @temp1;  --SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
			SET @accountnew = @temp2
			PRINT @accountnew
			--SELECT @oaStatusCode = OA确认代码 FROM MaterialControl.供货商企业级关键信息修改记录表 WHERE ID =@id;
			--IF(@oaStatusCode = 'A')
			--BEGIN
			--	UPDATE MaterialControl.供货商企业级银行账户表 SET 开户银行名称 = @bankname,开户银行所在省=@province,开户银行所在市=@city,银行账号=@accountnew WHERE 厂商企标ID=@VendorComID AND 银行账号 =@accountold;
			--END
			SET @location2=0
		END
		--print @str
		SET @str = right(@str,len(@str) - charindex(@split1,@str));
		SET @location1=charindex(@split1,@str);
		SET @temp1 = SUBSTRING(@str,0,CHARINDEX(@split1,@str))  --下一个银行信息;
		--PRINT @temp1;
		--PRINT @location1;
	END
	--UPDATE MaterialControl.供货商企业级关键信息修改记录表 SET 记录状态代码 = 'C',确认人=@Comfirmer,确认时间=@ComfirmTime WHERE 表单编号 = @SheetNumber;
END TRY

BEGIN CATCH
	PRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()
	SET @tran_error = @tran_error + 1
END CATCH

--IF(@tran_error > 0)
--    BEGIN
--        --执行出错,回滚事务
--        ROLLBACK TRAN;
--        SET @iRel = -1;
--    END
--ELSE
--    BEGIN
--        --没有异常,提交事务
--        COMMIT TRAN;
--        SET @iRel = 1;
--    END
  
END


执行参数@AccountInfo='13,招商银行,湖北省,武汉市2,62141111,62142222*14,中国工商银行,广东省,广州市3,62128888,62129999*'

* 是数据元素分隔符

, 是数组元素内部元素的分隔符

执行结果如图所示(环境:sql server 2008)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangcns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值