SQL存储过程

1、拆分字符串

IF EXISTS(SELECT NAME FROM sysobjects
 WHERE NAME = N'procInsertOrderInfoOrderList' AND Type = N'P')
DROP PROCEDURE procInsertOrderInfoOrderList
GO

CREATE PROCEDURE procInsertOrderInfoOrderList
   (
 @Did NVARCHAR(1000),   --餐桌号(团体时为字符串)
 @Mid NVARCHAR(4000),   --非套餐时为:菜单号或拼音(字符串),套餐时为:套餐号
 @Onum NVARCHAR(4000),  --非套餐时为:各个菜的数量(字符串),套餐时为:套餐的数量1
 @Onume INT,    --餐桌实做人数
 @Uid INT,    --终端下单服务员员工编号
 @OremarkList NVARCHAR(4000), --菜的备注(字符串)
 @Oflag BIT,    --是否套餐标志{(0,非套餐),(1,套餐)}
 @Nstatus BIT    --用于判断是团体还是个人{(0,个人),(1,团体)}
   )
AS
BEGIN
 DECLARE @dt NVARCHAR(1000)  --用于存放拆分后的餐桌号
 DECLARE @rt NVARCHAR(4000)  --用于存放拆分后的菜单号
 DECLARE @rt1 NVARCHAR(4000)  --存放拆分后的菜的备注
 DECLARE @rt2 NVARCHAR(4000)  --用于存放拆分后的数量
 DECLARE @Orid NVARCHAR(20) --要插入数据库中的订单号
 DECLARE @Did1 INT   --要插入数据库中的餐桌号
 DECLARE @OIid INT   --要插入数据库中的订单号对应的记录号 
 DECLARE @Mid1 INT   --要插入数据库中的菜单号
 DECLARE @BLid INT   --要插入数据库中的套餐号
 DECLARE @MPrice1 MONEY  --要插入数据库中的价格
 DECLARE @Mname1 NVARCHAR(20) --存储菜单对应的拼音
 DECLARE @Oremark NVARCHAR(200) --要插入数据库中的菜的备注
 DECLARE @count INT   --用于统计餐桌的个数
 DECLARE @count1 INT   --统计菜单的个数
 DECLARE @count2 INT   --统计一个餐桌上相同菜的个数
 DECLARE @mm INT   --用于循环餐桌的个数
 DECLARE @nn INT   --用于循环插入菜单的个数
 DECLARE @i INT   --用于处理拆分调用SUBSTRING的个数
 DECLARE @ii INT   --用于处理拆分调用SUBSTRING的个数
 DECLARE @timeID NVARCHAR(17) --获取时间唯一标示
 DECLARE @OrderInfoDid INT  --用于团体开单时取同一个订单号
 DECLARE @FirstYN INT   --判断是开单还是加菜{(0,开单),(大于0,加菜)}
 DECLARE @DidYN INT   --存储接收处理后的餐桌号,用于判断是第一次开单还是加菜
 DECLARE @Mflag INT   --根据Mid取Mflag
 DECLARE @update_D_rowcount INT
 DECLARE @update_D_error INT
 DECLARE @insert_OI_error INT
 DECLARE @insert0_OL_error INT
 IF( @Oflag = 0 )    --非套餐
 BEGIN     --(非套餐BEGIN)
 IF( @Nstatus = 0 )   --个人开单  
 BEGIN     --(个人开单BEGIN)
 SELECT @DidYN = CAST(@Did AS INT)
 SELECT
  @FirstYN = COUNT(Did)
 FROM
  OrderInfo
 WHERE
  ( Did = @DidYN )
  AND( Ostatus = 0 )
 IF(@FirstYN = 0)   --个人第一次开单
 BEGIN    --(个人第一次开单BEGIN)
  EXECUTE procGetTimeID @timeID OUTPUT
  SELECT @Orid =N'P'+@timeID
  SELECT @Did1 = CAST(@Did AS INT)
  --修改餐桌状态为"使用中"
  BEGIN TRANSACTION
  UPDATE
    DingingTable
  SET
   Dstatus = 3
  WHERE
    ( Did = @Did1 )
   AND( Dstatus IN(1,2) )
  SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
  INSERT INTO OrderInfo( Orid,Did,Onum,Uid ) 
   VALUES( @Orid,@Did1,@Onume,@Uid )
  SELECT @insert_OI_error = @@ERROR
  SELECT @OIid = IDENT_CURRENT('OrderInfo')
  SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
  SET @nn = 1
  SET @i = 1
  WHILE(@nn <= @count1)
  BEGIN
  SET @Mid = @Mid + ','
  SET @OremarkList = @OremarkList + ','
  SET @Onum = @Onum + ','
  IF(@nn = 1)
   BEGIN
    SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
    IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜的编号
    BEGIN
     SELECT @Mid1 = CAST( @rt AS INT )
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    ELSE    --如果@rt为菜单对应的拼音
    BEGIN
     SELECT @Mname1 = LOWER( @rt )
     SELECT @Mid1 = Mid FROM Menu
     WHERE Mname1 = @Mname1
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
    SELECT @Oremark = @rt1
    SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
    SELECT @count2 =CAST(@count2 AS INT)
    IF( @Mflag != 2)
    BEGIN
     WHILE( @count2 >=1 )
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
      SELECT @insert0_OL_error = @@ERROR
      SET @count2 = @count2 - 1
     END
    END
    ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
     SELECT @insert0_OL_error = @@ERROR
    END
   END
  ELSE IF(@nn <=@count1)
   BEGIN
                  SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
    SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
    SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
    WHILE(@i < (@nn - 1))
    BEGIN
      SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
     SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
     SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
     SET @i = @i + 1
    END
           SET @i = 1
    SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
    SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
    SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
    IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
    BEGIN
     SELECT @Mid1 = CAST( @rt AS INT )
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    ELSE    --如果@rt为菜单对应的拼音
    BEGIN
     SELECT @Mname1 = LOWER( @rt )
     SELECT @Mid1 = Mid FROM Menu
     WHERE Mname1 = @Mname1
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    SELECT @Oremark = @rt1
    SELECT @count2 = CAST(@count2 AS INT)
    IF( @Mflag != 2 )
    BEGIN
     WHILE( @count2 >=1 )
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
      SELECT @insert0_OL_error = @@ERROR
      SET @count2 = @count2 - 1
     END
    END
    ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
     SELECT @insert0_OL_error = @@ERROR
    END
   END
     SET @nn = @nn + 1
  END
 --返回个人第一次开单结果
 IF( @update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error = 0 )
 BEGIN
  COMMIT TRANSACTION   --开单成功
  SELECT 1 AS Result
 END
 ELSE
 BEGIN
  ROLLBACK TRANSACTION  --开单失败
  SELECT 0 AS Result
 END
 END    --(个人第一次开单END)
 ELSE IF( @FirstYN > 0)  --个人加菜
 BEGIN    --(个人加菜BEGIN)
 SELECT @Did1 = CAST(@Did AS INT)
 DECLARE @OrderInfo_flag INT     --判断是否套餐
 SELECT
  @OrderInfo_flag = Oflag
 FROM
  OrderInfo
 WHERE
  ( Did = @Did1 )
  AND( Ostatus = 0 )
 IF( @OrderInfo_flag = 0 ) --非套餐加菜
 BEGIN    --(个人非套餐加菜BEGIN)
  SELECT @OIid = OIid FROM OrderInfo
  WHERE
   ( Did = @Did1 )
   AND( Ostatus = 0 )
  SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
  SET @nn = 1
  SET @i = 1
  BEGIN TRANSACTION
  WHILE (@nn <= @count1)
  BEGIN
  SET @Mid = @Mid + ','
  SET @OremarkList = @OremarkList + ','
  SET @Onum = @Onum + ','
  IF(@nn = 1)
   BEGIN
    SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
    IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
    BEGIN
     SELECT @Mid1 = CAST( @rt AS INT )
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    ELSE    --如果@rt为菜单对应的拼音
    BEGIN
     SELECT @Mname1 = LOWER( @rt )
     SELECT @Mid1 = Mid FROM Menu
     WHERE Mname1 = @Mname1
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
    SELECT @Oremark = @rt1
    SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
    SELECT @count2 =CAST(@count2 AS INT)
    IF( @Mflag != 2 )
    BEGIN
     WHILE( @count2 >=1 )
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
       VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
      SELECT @insert0_OL_error = @@ERROR
      SET @count2 = @count2 - 1
     END
    END
    ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
     SELECT @insert0_OL_error = @@ERROR
    END
   END
  ELSE IF(@nn <=@count1)
   BEGIN
 
                  SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
    SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
    SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
    WHILE(@i < (@nn - 1))
    BEGIN
      SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
     SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
     SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
     SET @i = @i + 1
    END
           SET @i = 1
    SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
    SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
    SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
    IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
    BEGIN
     SELECT @Mid1 = CAST( @rt AS INT )
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    ELSE    --如果@rt为菜单对应的拼音
    BEGIN
     SELECT @Mname1 = LOWER( @rt )
     SELECT @Mid1 = Mid FROM Menu
     WHERE Mname1 = @Mname1
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    SELECT @Oremark = @rt1
    SELECT @count2 = CAST(@count2 AS INT)
    IF( @Mflag != 2 )
    BEGIN
     WHILE( @count2 >=1 )
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
       VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
      SELECT @insert0_OL_error = @@ERROR
      SET @count2 = @count2 - 1
     END
    END
    ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
     SELECT @insert0_OL_error = @@ERROR
    END
   END
     SET @nn = @nn + 1
  END
 --返回加菜结果
 IF( @insert0_OL_error = 0 )
 BEGIN
  COMMIT TRANSACTION
  SELECT 1 AS Result
 END
 ELSE
 BEGIN
  ROLLBACK TRANSACTION
  SELECT 0 AS Result
 END
 END    --(个人非套餐加菜END)
 ELSE IF( @OrderInfo_flag = 1 ) --个人套餐加菜
 BEGIN    --(个人套餐加菜BEGIN)
  SELECT
   @OIid = OIid
  FROM
   OrderInfo
  WHERE
   ( Did = @Did1 )
   AND( Ostatus = 0 )
   AND( Oflag = 1 )
  SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
  SET @nn = 1
  SET @i = 1
  BEGIN TRANSACTION
  WHILE(@nn <= @count1)
  BEGIN --循环BEGIN
  SET @Mid = @Mid + ','
  SET @OremarkList = @OremarkList + ','
  SET @Onum = @Onum + ','
  IF(@nn = 1)
   BEGIN
    SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
    IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
    BEGIN
     SELECT @Mid1 = CAST( @rt AS INT )
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    ELSE    --如果@rt为菜单对应的拼音
    BEGIN
     SELECT @Mname1 = LOWER( @rt )
     SELECT @Mid1 = Mid FROM Menu
     WHERE Mname1 = @Mname1
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
    SELECT @Oremark = @rt1
    SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
    SELECT @count2 =CAST(@count2 AS INT)
    IF( @Mflag != 2 )
    BEGIN
     WHILE( @count2 >=1 )
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
       VALUES ( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
      SELECT @insert0_OL_error = @@ERROR
      SET @count2 = @count2 - 1
     END
    END
    ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
     SELECT @insert0_OL_error = @@ERROR
    END
   END
  ELSE IF(@nn <=@count1)
   BEGIN
 
                  SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
    SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
    SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
    WHILE(@i < (@nn - 1))
    BEGIN
      SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
     SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
     SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
     SET @i = @i + 1
    END
    SET @i = 1
    SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
    SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
    SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
    IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
    BEGIN
     SELECT @Mid1 = CAST( @rt AS INT )
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    ELSE    --如果@rt为菜单对应的拼音
    BEGIN
     SELECT @Mname1 = LOWER( @rt )
     SELECT @Mid1 = Mid FROM Menu
     WHERE Mname1 = @Mname1
     SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
     WHERE Mid = @Mid1
    END
    SELECT @Oremark = @rt1
    SELECT @count2 = CAST(@count2 AS INT)
    IF( @Mflag != 2 )
    BEGIN
     WHILE( @count2 >=1 )
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark,Oflag)
       VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark,1)
      SELECT @insert0_OL_error = @@ERROR
      SET @count2 = @count2 - 1
     END
    END
    ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
       VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
     SELECT @insert0_OL_error = @@ERROR
    END
   END
     SET @nn = @nn + 1
  END--循环END
 IF( @insert0_OL_error = 0 )
 BEGIN
  COMMIT TRANSACTION
  SELECT 1 AS Result
 END
 ELSE
 BEGIN
  ROLLBACK TRANSACTION
  SELECT 0 AS Result
 END
 END   --(个人套餐加菜END)
 END   --(个人加菜END)
 END   --(个人开单END)
 ELSE IF ( @Nstatus = 1 )--团体开单  非套餐
 BEGIN   --(团体开单BEGIN)
  SET @ii = 1
  SELECT @count = LEN(@Did)-LEN(REPLACE(@Did,',',''))+1    --这里餐桌的个数,即 @count >= 2
  SET @mm = 1
  WHILE( @mm <= @count )
  BEGIN
  SET @Did = @Did + ','
  BEGIN TRANSACTION
  IF( @mm = 1 )
   BEGIN
    SET @dt=LEFT(@Did,CHARINDEX(',',@Did)-1)
    SELECT @Did1 = CAST( @dt AS INT )
    UPDATE
      DingingTable      --更新餐桌状态为"使用中"
    SET
     Dstatus = 3
    WHERE
     ( Did = @Did1 )
     AND( Dstatus IN(1,2) )
    SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
    SELECT @OrderInfoDid = @Did1
    EXECUTE procGetTimeID @timeID OUTPUT
    SELECT @Orid =N'P'+@timeID
    BEGIN     
     INSERT INTO OrderInfo( Orid,Did,Onum,Uid ) 
      VALUES( @Orid,@Did1,@Onume,@Uid )
     SELECT @insert_OI_error = @@ERROR
     SELECT @OIid = IDENT_CURRENT('OrderInfo')
     SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
     SET @nn = 1
     SET @i = 1
     WHILE(@nn <= @count1)
     BEGIN
      SET @Mid = @Mid + ','
      SET @OremarkList = @OremarkList + ','
      SET @Onum = @Onum + ','
     IF(@nn = 1)
      BEGIN
      SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
      IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
      BEGIN
       SELECT @Mid1 = CAST( @rt AS INT )
       SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
       WHERE Mid = @Mid1
      END
      ELSE    --如果@rt为菜单对应的拼音
      BEGIN
       SELECT @Mname1 = LOWER( @rt )
       SELECT @Mid1 = Mid FROM Menu
       WHERE Mname1 = @Mname1
       SELECT @Mflag= Mflag,@Mprice1 = Mprice FROM Menu
       WHERE Mid = @Mid1
      END
      SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
      SELECT @Oremark = @rt1
      SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
      SELECT @count2 = CAST(@count2 AS INT)
      IF( @Mflag != 2 )
      BEGIN
       WHILE( @count2 >=1 )
        BEGIN
         INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
          VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
         SELECT @insert0_OL_error = @@ERROR
         SET @count2 = @count2 - 1
        END
      END
      ELSE
      BEGIN
       INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
         VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
       SELECT @insert0_OL_error = @@ERROR
      END
      END
     ELSE IF(@nn <=@count1)
      BEGIN
                    SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
      SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
      SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
      WHILE(@i < (@nn - 1))
       BEGIN
        SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
       SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
       SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
       SET @i = @i + 1
       END
              SET @i = 1
       SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
       SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
       SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
       IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
       BEGIN
        SELECT @Mid1 = CAST( @rt AS INT )
        SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
        WHERE Mid = @Mid1
       END
       ELSE    --如果@rt为菜单对应的拼音
       BEGIN
        SELECT @Mname1 = LOWER( @rt )
        SELECT @Mid1 = Mid FROM Menu
        WHERE Mname1 = @Mname1
        SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
        WHERE Mid = @Mid1
       END
       SELECT @Oremark = @rt1
       SELECT @count2 = CAST(@count2 AS INT)
       IF( @Mflag != 2 )
       BEGIN
        WHILE( @count2 >=1 )
         BEGIN
          INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
           VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
          SELECT @insert0_OL_error = @@ERROR
          SET @count2 = @count2 - 1
         END
       END
       ELSE
       BEGIN
        INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
          VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
        SELECT @insert0_OL_error = @@ERROR
       END
      END
        SET @nn = @nn + 1
     END
    END
    END
  ELSE IF( @mm <= @count )
   BEGIN 
                  SET @dt=SUBSTRING(@Did,CHARINDEX(',',@Did)+1,4000)
    WHILE(@ii < (@mm - 1))
     BEGIN
      SET @dt = SUBSTRING(@dt,CHARINDEX(',',@dt)+1,4000)
     SET @ii = @ii + 1
     END
            SET @ii = 1
     SET @dt = LEFT(@dt,CHARINDEX(',',@dt)-1)
     SELECT @Did1 = CAST( @dt AS INT )
     UPDATE DingingTable SET Dstatus = 3 --更新餐桌状态为"使用中"
     WHERE
      ( Did = @Did1 )
       AND( Dstatus IN(1,2) )
     SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
     SELECT @Orid = Orid FROM OrderInfo
     WHERE
      ( Did = @OrderInfoDid )
      AND( Ostatus = 0 )
     BEGIN     
     INSERT INTO OrderInfo( Orid,Did,Onum,Uid ) 
      VALUES( @Orid,@Did1,@Onume,@Uid )
     SELECT @insert_OI_error = @@ERROR
     SELECT @OIid = IDENT_CURRENT('OrderInfo')
     SELECT @count1 = LEN(@Mid)-LEN(REPLACE(@Mid,',',''))+1
     SET @nn = 1
     SET @i = 1
     WHILE (@nn <= @count1)
     BEGIN
     SET @Mid = @Mid + ','
     SET @OremarkList = @OremarkList + ','
     SET @Onum = @Onum + ','
     IF(@nn = 1)
      BEGIN
      SET @rt=LEFT(@Mid,CHARINDEX(',',@Mid)-1)
      IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
      BEGIN
       SELECT @Mid1 = CAST( @rt AS INT )
       SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
       WHERE Mid = @Mid1
      END
      ELSE    --如果@rt为菜单对应的拼音
      BEGIN
       SELECT @Mname1 = LOWER( @rt )
       SELECT @Mid1 = Mid FROM Menu
       WHERE Mname1 = @Mname1
       SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
       WHERE Mid = @Mid1
      END
      SET @rt1=LEFT(@OremarkList,CHARINDEX(',',@OremarkList)-1)
      SELECT @Oremark = @rt1
      SET @count2=LEFT(@Onum,CHARINDEX(',',@Onum)-1)
      SELECT @count2 = CAST(@count2 AS INT)
      IF( @Mflag != 2 )
      BEGIN
       WHILE( @count2 >=1 )
        BEGIN
         INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
          VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
         SELECT @insert0_OL_error = @@ERROR
         SET @count2 = @count2 - 1
        END
      END
      ELSE
       BEGIN
        INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
          VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
        SELECT @insert0_OL_error = @@ERROR
       END
      END
     ELSE IF(@nn <=@count1)
      BEGIN
                    SET @rt=SUBSTRING(@Mid,CHARINDEX(',',@Mid)+1,4000)
      SET @rt1=SUBSTRING(@OremarkList,CHARINDEX(',',@OremarkList)+1,4000)
      SET @rt2=SUBSTRING(@Onum,CHARINDEX(',',@Onum)+1,4000)
      WHILE(@i < (@nn - 1))
       BEGIN
        SET @rt = SUBSTRING(@rt,CHARINDEX(',',@rt)+1,4000)
       SET @rt1 = SUBSTRING(@rt1,CHARINDEX(',',@rt1)+1,4000)
       SET @rt2 = SUBSTRING(@rt2,CHARINDEX(',',@rt2)+1,4000)
       SET @i = @i + 1
       END
              SET @i = 1
       SET @rt = LEFT(@rt,CHARINDEX(',',@rt)-1)
       SET @rt1 = LEFT(@rt1,CHARINDEX(',',@rt1)-1)
       SET @count2 = LEFT(@rt2,CHARINDEX(',',@rt2)-1)
       IF( ISNUMERIC( @rt ) = 1 ) --如果@rt为菜单编号
       BEGIN
        SELECT @Mid1 = CAST( @rt AS INT )
        SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
        WHERE Mid = @Mid1
       END
       ELSE    --如果@rt为菜单对应的拼音
       BEGIN
        SELECT @Mname1 = LOWER( @rt )
        SELECT @Mid1 = Mid FROM Menu
        WHERE Mname1 = @Mname1
        SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
        WHERE Mid = @Mid1
       END
       SELECT @Oremark = @rt1
       SELECT @count2 = CAST(@count2 AS INT)
       IF( @Mflag != 2 )
       BEGIN
        WHILE( @count2 >=1 )
         BEGIN
          INSERT INTO OrderList( OIid,Mid,Mprice,Uid,Oremark)
           VALUES( @OIid,@Mid1,@Mprice1,@Uid,@Oremark)
          SELECT @insert0_OL_error = @@ERROR
          SET @count2 = @count2 - 1
         END
       END
       ELSE
        BEGIN
         INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid,Oremark)
           VALUES( @OIid,@Mid1,@Mprice1,@count2,@Uid,@Oremark)
         SELECT @insert0_OL_error = @@ERROR
        END
      END
        SET @nn = @nn + 1
     END
    END
   END
  SET @mm = @mm + 1
  IF(@update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error =0)
   BEGIN
    COMMIT TRANSACTION
    SELECT 1 AS Result
   END
   ELSE
   BEGIN
    ROLLBACK TRANSACTION
    SELECT 0 AS Result
   END
  END  --循环END
 END   --(团体开单END)
 END   --(非套餐END)
 ELSE IF(@Oflag = 1)  --套餐
 BEGIN   --(套餐BEGIN)
 IF(@Nstatus = 0) --个人开单
 BEGIN   --(个人开单BEGIN)
  EXECUTE procGetTimeID @timeID OUTPUT
  SELECT @Orid =N'T'+@timeID
  SELECT @Did1 = CAST(@Did AS INT)
  --修改餐桌状态为"使用中"
  BEGIN TRANSACTION
  UPDATE DingingTable SET Dstatus = 3
  WHERE
    ( Did = @Did1 )
   AND( Dstatus IN(1,2))
  SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
  SELECT @BLid = CAST(@Mid AS INT)
  INSERT INTO OrderInfo( Orid,Did,Onum,BLid,Uid,Oflag ) 
   VALUES( @Orid,@Did1,@Onume,@BLid,@Uid,1 )
  SELECT @insert_OI_error = @@ERROR
  SELECT @OIid = IDENT_CURRENT('OrderInfo')
  --以下向OrderList表中插入数据
  DECLARE @Bnum INT   --循环相同菜的个数
  DECLARE @BLid_Mid INT --保存取出的菜单号
  DECLARE Fetch_BLid_Mid CURSOR FOR
  SELECT Mid FROM BundlingMenu
  WHERE BLid = @BLid
 
  OPEN Fetch_BLid_Mid
  FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid
  WHILE(@@FETCH_STATUS = 0)
  BEGIN--取游标BEGIN
   SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
   WHERE Mid = @BLid_Mid
   SELECT
    @Bnum = Bnum
   FROM
    BundlingMenu
   WHERE
    ( Mid = @BLid_Mid )
    AND( BLid = @BLid )
   IF( @Mflag != 2 )
   BEGIN
    WHILE( @Bnum >= 1 )
    BEGIN
     INSERT INTO OrderList(OIid,Mid,Mprice,Uid)
      VALUES(@OIid,@BLid_Mid,@Mprice1,@Uid)
     SELECT @insert0_OL_error = @@ERROR
     SET @Bnum = @Bnum - 1
    END
   END
   ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid)
      VALUES( @OIid,@BLid_Mid,@Mprice1,@Bnum,@Uid)
     SELECT @insert0_OL_error = @@ERROR
    END
   FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid
  END--取游标END
  CLOSE Fetch_BLid_Mid 
  DEALLOCATE Fetch_BLid_Mid
 IF( @update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error = 0 )
  BEGIN
   COMMIT TRANSACTION
   SELECT 1 AS Result
  END
 ELSE
  BEGIN
   ROLLBACK TRANSACTION
   SELECT 0 AS Result
  END
 END   --(个人开单END)
 ELSE IF(@Nstatus = 1) --团体套餐开单
 BEGIN   --(团体套餐开单BEGIN)
  SET @ii = 1
  SELECT @count = LEN(@Did)-LEN(REPLACE(@Did,',',''))+1    --这里餐桌的个数,即 @count >= 2
  SET @mm = 1
  WHILE( @mm <= @count )
  BEGIN  --循环BEGIN
  SET @Did = @Did + ','
  BEGIN TRANSACTION
  IF( @mm = 1 )
  BEGIN   --(@mm=1BEGIN)
   SET @dt=LEFT(@Did,CHARINDEX(',',@Did)-1)
   EXECUTE procGetTimeID @timeID OUTPUT
   SELECT @Orid =N'T'+@timeID
   SELECT @Did1 = CAST(@dt AS INT)
   SELECT @OrderInfoDid = @Did1
   --修改餐桌状态为"使用中"
   UPDATE DingingTable SET Dstatus = 3
   WHERE
     ( Did = @Did1 )
    AND( Dstatus IN(1,2) )
   SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
   SELECT @BLid = CAST(@Mid AS INT)
   INSERT INTO OrderInfo( Orid,Did,Onum,BLid,Uid,Oflag ) 
    VALUES( @Orid,@Did1,@Onume,@BLid,@Uid,1 )
   SELECT @insert_OI_error = @@ERROR
   SELECT @OIid = IDENT_CURRENT('OrderInfo')
   --以下向OrderList表中插入数据
   DECLARE @Bnum1 INT   --循环相同菜的个数
   DECLARE @BLid_Mid1 INT --保存取出的菜单号
   DECLARE Fetch_BLid_Mid CURSOR FOR
   SELECT Mid FROM BundlingMenu
   WHERE BLid = @BLid
   OPEN Fetch_BLid_Mid
   FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid1
   WHILE(@@FETCH_STATUS = 0)
   BEGIN--取游标BEGIN
   SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
   WHERE Mid = @BLid_Mid1
   SELECT 
    @Bnum1 = Bnum
   FROM
    BundlingMenu
   WHERE
    ( Mid = @BLid_Mid1 )
    AND( BLid = @BLid )
   IF( @Mflag != 2 )
   BEGIN
    WHILE( @Bnum1 >= 1 )
    BEGIN
     INSERT INTO OrderList(OIid,Mid,Mprice,Uid)
      VALUES(@OIid,@BLid_Mid1,@Mprice1,@Uid)
     SELECT @insert0_OL_error = @@ERROR
     SET @Bnum1 = @Bnum1 - 1
    END
   END
   ELSE
    BEGIN
     INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid)
      VALUES( @OIid,@BLid_Mid1,@Mprice1,@Bnum1,@Uid)
     SELECT @insert0_OL_error = @@ERROR
    END
   FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid1
   END--取游标END
   CLOSE Fetch_BLid_Mid 
   DEALLOCATE Fetch_BLid_Mid
  END --(@mm=1END)
  ELSE IF( @mm <= @count )
  BEGIN--(@mm <= @count BEGIN)
   SET @dt=SUBSTRING(@Did,CHARINDEX(',',@Did)+1,4000)
   WHILE(@ii < (@mm - 1))
   BEGIN
     SET @dt = SUBSTRING(@dt,CHARINDEX(',',@dt)+1,4000)
    SET @ii = @ii + 1
   END
          SET @ii = 1
   SET @dt = LEFT(@dt,CHARINDEX(',',@dt)-1)
   SELECT @Did1 = CAST( @dt AS INT )
   UPDATE
     DingingTable  --更新餐桌状态为"使用中"
   SET
    Dstatus = 3
   WHERE
    ( Did = @Did1 )
     AND( Dstatus IN(1,2) )
   SELECT @update_D_error = @@ERROR,@update_D_rowcount = @@ROWCOUNT
   SELECT
    @Orid = Orid
   FROM
     OrderInfo
   WHERE
    ( Did = @OrderInfoDid )
    AND( Ostatus = 0 )
   SELECT @BLid = CAST(@Mid AS INT)
   INSERT INTO OrderInfo( Orid,Did,Onum,BLid,Uid,Oflag ) 
    VALUES( @Orid,@Did1,@Onume,@BLid,@Uid,1 )
   SELECT @insert_OI_error = @@ERROR
   SELECT @OIid = IDENT_CURRENT('OrderInfo')
   --以下向OrderList表中插入数据
   DECLARE @Bnum2 INT   --循环相同菜的个数
   DECLARE @BLid_Mid2 INT --保存取出的菜单号
   DECLARE Fetch_BLid_Mid CURSOR FOR
   SELECT Mid FROM BundlingMenu
   WHERE BLid = @BLid
   OPEN Fetch_BLid_Mid
   FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid2
   WHILE(@@FETCH_STATUS = 0)
   BEGIN--取游标BEGIN
    SELECT @Mflag = Mflag,@Mprice1 = Mprice FROM Menu
    WHERE Mid = @BLid_Mid2
    SELECT
     @Bnum2 = Bnum
    FROM
     BundlingMenu
    WHERE
     ( Mid = @BLid_Mid2 )
     AND( BLid = @BLid )
    IF( @Mflag != 2 )
    BEGIN
     WHILE( @Bnum2 >= 1 )
     BEGIN
      INSERT INTO OrderList(OIid,Mid,Mprice,Uid)
       VALUES(@OIid,@BLid_Mid2,@Mprice1,@Uid)
      SELECT @insert0_OL_error = @@ERROR
      SET @Bnum2 = @Bnum2 - 1
     END
    END
    ELSE
     BEGIN
      INSERT INTO OrderList( OIid,Mid,Mprice,Oratio,Uid)
       VALUES( @OIid,@BLid_Mid2,@Mprice1,@Bnum2,@Uid)
      SELECT @insert0_OL_error = @@ERROR
     END
    FETCH NEXT FROM Fetch_BLid_Mid INTO @BLid_Mid2
   END--取游标END
   CLOSE Fetch_BLid_Mid 
   DEALLOCATE Fetch_BLid_Mid
  END--(@mm <= @count END)
 SET @mm = @mm + 1
 IF( @update_D_error = 0 AND @update_D_rowcount > 0 AND @insert_OI_error = 0 AND @insert0_OL_error = 0 )
  BEGIN
   COMMIT TRANSACTION
   SELECT 1 AS Result
  END
 ELSE
  BEGIN
   ROLLBACK TRANSACTION
   SELECT 0 AS Result
  END
 END--(循环END)
 END--(团体套餐开单END)
 END--(套餐END)
END
GO

--EXECUTE procInsertOrderInfoOrderList '56,57','1004,1005','1,1','7','1003','不,'0','1' 

2、动态SQL

F EXISTS(SELECT NAME FROM sysobjects
        WHERE NAME = N'procSelectAccountedInfoByDate' AND Type = N'P')
DROP PROCEDURE procSelectAccountedInfoByDate
GO

CREATE PROCEDURE procSelectAccountedInfoByDate
   (
 @Date NVARCHAR(10)
   )
AS
BEGIN
 CREATE TABLE #Temp_001
 (
  Pid INT,
  Pname NVARCHAR(20),
  Uname NVARCHAR(20),
  Atotal2 MONEY
 )
 INSERT INTO #Temp_001(Pid,Pname,Uname,Atotal2)
 (
  SELECT 
   P.Pid AS Pid,
   P.Pname AS Pname,
   ISNULL(DBO.funGetUnameByUid(A.Uid),'') AS Uname,
   A.Atotal2 AS Atotal2
  FROM
   Paymode AS P LEFT JOIN Account AS A ON ( P.Pid = A.Pid ) AND ( DBO.funGetNewDate(A.Atime) = @Date )
 )
 DECLARE @SQL VARCHAR(8000)
 SET @SQL = 'SELECT
    Pid AS 代码,
    Pname AS 科目名称'
 SELECT
  @SQL = @SQL + ','+Users.Uname+'=CONVERT(NVARCHAR,ISNULL(SUM(CASE Uname WHEN '''+Users.Uname+''' THEN Atotal2 END ),NULL),102)'
 FROM
  Users
 WHERE
  Tid = 7  --属于收银
 ORDER BY Uid
 SET
  @SQL = @SQL + ',CONVERT(NVARCHAR,ISNULL(SUM(Atotal2),NULL),102) AS 合计金额
 FROM #Temp_001
 GROUP BY Pid,Pname
 ORDER BY Pid'
 PRINT @SQL
 EXECUTE (@SQL)
 DROP TABLE #Temp_001
END
GO

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值