场景如下,传入的id,如1,3,4,88。可以在.net后台处理,但是我更习惯在数据库中操作。

插入数据时可以这样处理,直接贴代码。

 CREATE PROCEDURE pro_CategorySave
    (
      @ids VARCHAR(400) ,
      @type INT ,
      @TemplateID INT ,
      @CategoryID INT
        
    )
  AS 
    BEGIN
        DECLARE @str VARCHAR(8000) ;
        DELETE  FROM GaituApp.dbo.TemplateRelationship
        WHERE   TemplateID = @TemplateID
                AND Type = @type
                AND CategoryID = @CategoryID
        --判断ids是否为空,为空则不插入
        IF ( @ids <> '' ) 
            BEGIN
                SET @str = 'INSERT INTO GaituApp.dbo.TemplateRelationship
        ( TemplateID ,          
          Type ,
          CategoryID ,
          CreateTime,
          Pid
        )
        SELECT ' + CAST(@TemplateID AS VARCHAR(20)) + ','
                    + CAST(@type AS VARCHAR(20)) + ','
                    + CAST(@CategoryID AS VARCHAR(20)) + ',GETDATE(),'
                    + REPLACE(@ids, ',',
                              ' union select '
                              + CAST(@TemplateID AS VARCHAR(20)) + ','
                              + CAST(@type AS VARCHAR(20)) + ','
                              + CAST(@CategoryID AS VARCHAR(20))
                              + ',GETDATE(),')
        
                --PRINT @str
        
        EXEC (@str)
            END        
    END

 

  思路就是利用sqlserver自带的replace方法将分隔符替换成union select.具体情况具体分析。

技巧二:sqlserver“数组”使用。

在sqlserver中执行批量操作时,可同时处理多个数据,由于sql不支持数组,可以变向处理,如下:

1.利用replace,直接贴代码,

CREATE TABLE #temp
(
    STR VARCHAR(20) NOT NULL
)
DECLARE @str VARCHAR(200)
DECLARE @result VARCHAR(1000)
SET @str='a,b,c,d,e,f,g'
SET @result='INSERT INTO #temp
        ( STR ) select '''+REPLACE(@str,',',''' union select ''')+''''
        PRINT @result
   EXEC(@result)
   SELECT * FROM #temp     
DROP TABLE #temp

--print result
INSERT INTO #temp
        ( STR ) select 'a' union select 'b' union select 'c' union select 'd' union select 'e' union select 'f' union select 'g'

 2.利用charindex结合substring。

charindex用法,charindex('要查找的分隔符','字符串',int_length),

substring用法,substring('字符串',int_start,int_length).贴代码咯,详细代码注释放在程序段了

CREATE TABLE #temp
(
    strcolumn VARCHAR(20)
)
DECLARE @str VARCHAR(200);
--当前的字符串索引
DECLARE @currPostion INT;
--当前的分割符索引
DECLARE @currSplit INT;
SET @str='i,love,you,lover';
--初始化,索引都为1,数据库函数中,索引都是以1开始。
SET @currPostion=1;
SET @currSplit=1;
WHILE @currPostion<LEN(@str)
BEGIN
    SET @currSplit=CHARINDEX(',',@str,@currPostion);
    IF @currSplit>@currPostion
    BEGIN
        INSERT INTO #temp
                ( strcolumn )
        SELECT SUBSTRING(@str,@currPostion,@currSplit-@currPostion);
    END
    ELSE
    BEGIN
        INSERT INTO #temp
                ( strcolumn )
        SELECT SUBSTRING(@str,@currPostion,LEN(@str)-@currPostion+1);
        BREAK;
    END
    SET @currPostion=@currSplit+1;
END
SELECT * FROM #temp
DROP TABLE #temp 

 下面贴个利用charindex,substring获取数组长度的函数。注释在代码中。

CREATE FUNCTION [dbo].[returnArryLength]
    (
      @str VARCHAR(5000) ,
      @split VARCHAR(10)
    )
RETURNS INT
AS 
    BEGIN
    --当前字符起始位置
        DECLARE @curr_position INT ;
    --当前分隔符位置
        DECLARE @curr_split INT ;
        DECLARE @count INT ;
        SET @curr_position = 1 ;
        SET @curr_split = 1 ;
        SET @str = LTRIM(RTRIM(@str)) ;
        IF LEN(@str) = 0 
            BEGIN
                RETURN 0 ;
            END
        ELSE 
            BEGIN
                SET @count=1;
                SET @curr_split=CHARINDEX(@split,@str,@curr_position)
                WHILE @curr_split<>0
                BEGIN
                    SET @count=@count+1;
                    SET @curr_position=@curr_split+1;
                    SET @curr_split=CHARINDEX(@split,@str,@curr_position);
                END
            END
        RETURN @count ;
    END
View Code

相关文章:

  • 2021-12-12
  • 2021-11-18
  • 2022-01-23
  • 2022-12-23
  • 2022-02-02
  • 2021-11-01
猜你喜欢
  • 2021-07-27
  • 2022-12-23
  • 2022-12-23
  • 2021-06-15
  • 2021-11-01
  • 2022-12-23
  • 2022-01-05
相关资源
相似解决方案