实用MSSQL表值函数fn_Split轻松解决存储过程中需Split参数的处理
2011-09-01 19:19
246 查看
【原文】
操作Microsoft SQL Server数据库批量处理大量数据时,为了提高效率都会想到使用存储过程。今天写了一段程序是实现批量更新用户信息的功能,便设计了一个存储过程,传入用户GUID和其它信息,存储过程批量更新所指定用户数据。
传入的用户GUID可能是1个也可能是几个,存储过程中的有几处where子句使用了in (@userguid),一般在程序代码中写SQL语句时各个字符串都需要一对单引号括起来,形如:in ('06e14218-e621-42b9-98aa-1cda94aa06f4','236c30bb-bc9f-4069-a1b3-ead399604ac1')。但传递给存储过程时则不能带单引号了,会报转换格式错误。
但今天要说的问题不在这里,存储过程的where子句如果写成in (@userguid),即使传给userguid参数的值是不带单引号的值:06e14218-e621-42b9-98aa-1cda94aa06f4,236c30bb-bc9f-4069-a1b3-ead399604ac1,存储过程能完全执行,但只有第一个用户GUID的数据更新了,其它的都没有。这就是问题所在了。
根据网上的介绍和个人经验,对网上介绍的表值函数fn_Split做了简单的优化,以使其更实用,解决存储过程中需要把参数字符串值分割的处理。fn_Split代码如下:
操作Microsoft SQL Server数据库批量处理大量数据时,为了提高效率都会想到使用存储过程。今天写了一段程序是实现批量更新用户信息的功能,便设计了一个存储过程,传入用户GUID和其它信息,存储过程批量更新所指定用户数据。
传入的用户GUID可能是1个也可能是几个,存储过程中的有几处where子句使用了in (@userguid),一般在程序代码中写SQL语句时各个字符串都需要一对单引号括起来,形如:in ('06e14218-e621-42b9-98aa-1cda94aa06f4','236c30bb-bc9f-4069-a1b3-ead399604ac1')。但传递给存储过程时则不能带单引号了,会报转换格式错误。
但今天要说的问题不在这里,存储过程的where子句如果写成in (@userguid),即使传给userguid参数的值是不带单引号的值:06e14218-e621-42b9-98aa-1cda94aa06f4,236c30bb-bc9f-4069-a1b3-ead399604ac1,存储过程能完全执行,但只有第一个用户GUID的数据更新了,其它的都没有。这就是问题所在了。
根据网上的介绍和个人经验,对网上介绍的表值函数fn_Split做了简单的优化,以使其更实用,解决存储过程中需要把参数字符串值分割的处理。fn_Split代码如下:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==================================================== -- Author: SeaYee -- Create date: 2011-06-14 -- Description: MS SQL实现类似C# split功能的表值函数 -- ==================================================== CREATE FUNCTION [dbo].[fn_Split] ( @str VARCHAR(MAX), -- 待处理的字符串 @sep VARCHAR(10) -- 分隔字符 ) RETURNS @arr TABLE ( [value] VARCHAR(100) ) AS BEGIN DECLARE @i INT, @tmpStr VARCHAR(100) SET @i = CHARINDEX(@sep, @str) WHILE @i > 0 BEGIN SET @tmpStr = SUBSTRING(@str, 1, @i-1) SET @str = STUFF(@str, 1, @i, '') SET @i = CHARINDEX(@sep, @str) INSERT INTO @arr([value]) VALUES(@tmpStr) END INSERT INTO @arr([value]) VALUES(@str) RETURN END GO就以上面的代码为例,只要把存储过程中where子句使用了in (@userguid)的改成in (select * from dbo.fn_Split(@UserGuid, ',')),问题就解决了。
相关文章推荐
- 实用MSSQL表值函数fn_Split轻松解决存储过程中需Split参数的处理
- Oracle 存储过程的默认值参数和过程中的事务处理
- 存储过程中输出参数为游标的时候怎么处理
- 存储过程参数的时间默认值解决方法
- 关于存储过程中一个参数表示多个查询条件使用方法的简单处理
- 存储过程使用逗号分隔作为IN参数疑难问题解决方法【真正解决】
- 存储过程使用 in 添加多个参数的情况处理方式【转】
- 终于解决了--调用存储过程提示传递参数多的问题!
- 如何解决Remoting无法传输存储过程参数的问题
- 存储过程接口参数增加的解决
- 存储过程中特殊符号的处理-sql语句当参数的存储过程-复杂查询
- 解决sybase存储过程中不能取得动态sql输出参数的问题
- 存储过程中输入参数为字段名的解决办法
- 存储过程调试过程中DATETIME参数的输入故障解决方法
- 本文给出了一种方便实用的解决大文件的读取、存储等处理的方法,并结合相关程序代码对具体的实现过程进行了介绍
- 使用mssql2008新特性(存储过程参数类型使用"用户自定义表"来实现批量DML更新多表)解决项目里遇到的性能问题
- 关于mysql存储过程创建动态表名及参数处理
- ASP 调用带返回参数和记录集的存储过程二次访问数据库服务器的解决办法
- MySql存储过程中limit不能动态参数问题的解决
- 存储过程调试过程中DATETIME参数的输入故障解决方法