SQL While And Sql Array

SQL While循环:

DECLARE @whileStr varchar(200),@itemArray VARCHAR(200),@mark CHAR(1)
SET @whileStr='1,12,1003,100|2,13,1004,101|3,14,1005,102'
--SET @whileStr='4,11,1000,100|'
SET @mark=','
WHILE(1=1)
BEGIN
    --获取当前需要项
    exec proc_getArrayItem '|',@whileStr OUTPUT,@itemArray OUTPUT

    --业务逻辑 proc_getArrayItem接收的参数是字符串类型,但是我们可以把变量定义成需要的类型,它会自动转换
    declare @ItemID INT,@D3_BuyCount INT,@D3_TotalStock INT,@D3_DailyStock INT
    exec proc_getArrayItem @mark,@itemArray OUTPUT,@ItemID OUTPUT/*获取第1项*/           
    exec proc_getArrayItem @mark,@itemArray OUTPUT,@D3_BuyCount OUTPUT/*获取第2项*/          
    exec proc_getArrayItem @mark,@itemArray OUTPUT,@D3_TotalStock OUTPUT/*获取第3项*/           
    exec proc_getArrayItem @mark,@itemArray OUTPUT,@D3_DailyStock OUTPUT/*获取第4项*/          
    SELECT @ItemID,@D3_BuyCount,@D3_TotalStock,@D3_DailyStock
    
    --如果已完则退出循环
    IF(LEN(@whileStr)=0)BREAK    
END

获取数组元素:

if exists(select * from sysobjects where [name]='proc_getArrayItem')
    drop proc proc_getArrayItem
GO
/* 
*获取数组项,通过输出参数返回。同时将字符串数组的已获取项删除,并以输出参数将新数组返回。 
@arrayStr是个以@mark符号分隔的字符串数组。 
*@arrayItem接收的参数是字符串类型,但是我们可以把客户端变量定义成需要的类型,它会自动转换。 
*
*/
CREATE PROC proc_getArrayItem
(
    @mark    VARCHAR(10)=',',
    @arrayStr VARCHAR(1000)='' OUTPUT,
    @arrayItem VARCHAR(100)='' OUTPUT
)
AS
    DECLARE @tokenIndex INT
    SET @tokenIndex=CHARINDEX(@mark,@arrayStr)  
    
    IF(@tokenIndex=0)
    BEGIN
        SET @arrayItem=SUBSTRING(@arrayStr,1,LEN(@arrayStr))        
        SET @arrayStr=''
    END
    ELSE
    BEGIN
        SET @arrayItem=SUBSTRING(@arrayStr,1,@tokenIndex-1)
        SET @arrayStr=SUBSTRING(@arrayStr,@tokenIndex+1,LEN(@arrayStr))
    END
GO
原文地址:https://www.cnblogs.com/ToughGuy/p/3727008.html