实用MSSQL表值函数fn_Split轻松解决存储过程中需Split参数的处理

本文介绍了一个在Microsoft SQL Server数据库中批量处理数据时遇到的常见问题,即使用存储过程批量更新数据时,参数传递中in()函数的使用导致的预期外结果。通过使用自定义的表函数fn_Split来分割参数字符串,可以有效解决这一问题,确保所有指定的用户数据都能被正确更新。

实用MSSQL表值函数fn_Split轻松解决存储过程中需Split参数的处理

2011-06-14 14:14:59  来源:SeaYee

操作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代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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, ',')),问题就解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值