场景如下,传入的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

然后是利用charindex,substring根据索引返回元素的函数。注释在代码中。

CREATE FUNCTION [dbo].[getArryElementByIndex]
(
@str varchar(5000),
@split varchar(20),
@index INT--根据索引查询元素
)
RETURNS VARCHAR(500)
AS
BEGIN
--a,b,c,d,e
SET @str=LTRIM(RTRIM(@str));
DECLARE @loopcount INT;
DECLARE @i INT;
DECLARE @returnElement VARCHAR(50);
--分割符索引
DECLARE @curr_split INT;
--当前字符索引
DECLARE @curr_positon INT;
--设置循环次数
SET @loopcount=@index;
SET @i=1;
SET @curr_split=1;
SET @curr_positon=1;
WHILE @i<=@loopcount
BEGIN
SET @curr_split=CHARINDEX(@split,@str,@curr_positon);
IF @curr_split<>0
BEGIN
SET @returnElement=SUBSTRING(@str,@curr_positon,@curr_split-@curr_positon)
END
ELSE
BEGIN
SET @returnElement=SUBSTRING(@str,@curr_positon,LEN(@str)-@curr_positon+1)
END
SET @curr_positon=@curr_split+1;
SET @i=@i+1;
END
RETURN @returnElement;
END

返回数组元素的函数

sqlserver根据id集合,批量插入。(巧用sqlserver内置函数)的更多相关文章

  1. 【转载】C#批量插入数据到Sqlserver中的三种方式

    引用:https://m.jb51.net/show/99543 这篇文章主要为大家详细介绍了C#批量插入数据到Sqlserver中的三种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本篇, ...

  2. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理

    python_way,day3 一.集合 二.函数 三.三元运算 四.lambda 五.python的内置函数 六.字符转换 七.文件处理 一.集合: 1.集合的特性: 特性:无序,不重复的序列 如果 ...

  3. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  4. pathon 基础学习-集合(set),单双队列,深浅copy,内置函数

    一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在pyt ...

  5. 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数

    声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...

  6. 拷贝,集合,函数,enumerate,内置函数

    1.拷贝 字符串和数字.赋值 id一样 import copy #提供拷贝功能 copy.copy() #原来的和现在的一起修改,不用修改时用浅copy,节省内存,复制最外层 copy.deepcop ...

  7. Python数据类型的内置函数之tuple(元组),dict(字典),set(集合)

    Python数据类型内置函数 - str(字符串) - list(列表) - tuple(元组) - dict(字典) - set(收集) tuple(元组)的操作 - (count)统计元组中元素出 ...

  8. sqlserver学习笔记(六)—— sqlserver内置函数(字符串、日期)

    sqlserver中有很多内置函数,这里总结了一些常用的 一.关于字符串的函数: 1.CHARINDEX 寻找一个指定字符串在另一个字符串中的起始位置 SELECT CHARINDEX('world‘ ...

  9. [SQL]SUTFF内置函数的用法 (删除指定长度的字符并在指定的起始点插入另一组字符)

    STUFF 删除指定长度的字符并在指定的起始点插入另一组字符. 语法 STUFF ( character_expression , start , length , character_express ...

  10. 文成小盆友python-num3 集合,函数,-- 部分内置函数

    本接主要内容: set -- 集合数据类型 函数 自定义函数 部分内置函数 一.set 集合数据类型 set集合,是一个无序且不重复的元素集合 集合基本特性 无序 不重复 创建集合 #!/bin/en ...

随机推荐

  1. [GUI]界面开发类库

    如果我们不十分清楚需要什么样的界面风格及如何实现,请按以下两个步骤操作: (1)       搞清楚这种风格叫什么名字 (2)       查现有的比较著名的GUI库是否已有相应的实现方案. (3)  ...

  2. Rstudio设置永久工作路径

    Rstudio中 getwd() 获取工作路径 setwd() 设置工作路径 但这种方式设置后每次打开都要重新设置,现在介绍一种设置永久路径的方法

  3. MATLAB新手教程

    MATLAB新手教程   .MATLAB的基本知识 1-1.基本运算与函数    在MATLAB下进行基本数学运算,仅仅需将运算式直接打入提示号(>>)之後,并按入Enter键就可以.比如 ...

  4. 【转】Dancing Links精确覆盖问题

    原文链接:http://sqybi.com/works/dlxcn/ (只转载过来一部分,全文请看原文,感觉讲得很好~)正文    精确覆盖问题    解决精确覆盖问题    舞蹈步骤    效率分析 ...

  5. 理解WebKit和Chromium: 调试Android系统上的Chromium

    转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...

  6. 开发者必备,超实用的PHP代码片段(转)

    此前,研发频道曾发布<直接拿来用,10个PHP代码片段>,得到了网友们的一致好评.本文,笔者将继续分享九个超级有用的PHP代码片段.当你在开发网站.应用或者博客时,利用这些代码能为你节省大 ...

  7. 硬盘安装centos

    1.用pqmagic划分出来二个分区,第一个是ext3格式的,用于放centos镜像文件,第二个不用管是什么格式的,用于安装centos,我一般在磁盘最后面划分出来二个分区. 2.安装Ext2Fsd  ...

  8. 《RESTful Web Services》第三章 设计表述

    3.1 如何使用实体头来注解表述     表述不仅仅是以某种格式序列化后的数据,它是一连串字节加上用于描述那些字节的元数据.     Content-Type,用于描述表述类型.这个标头告诉接收方如何 ...

  9. win7 下 qwt安装教程

    一.安装:qwt的安装很简单,可以参看它的install文档.1.解开下载下来的zip文件,比如解开到d:\qt\qwt-5.0.2目录下,修改目录下的qwtconfig.pri文件里面的安装路径,比 ...

  10. 最简单的Java调用C/C++代码的步骤

    1)首先在Java类中声明一个native的方法 (2)使用javah命令生成包含native方法声明的C/C++头文件 (3)按照生成的C/C++头文件来写C/C++源文件 (4)将C/C++源文件 ...