代码改变世界

sql截取字符串并把字符串插入到表中的存储过程

2011-08-10 09:26  jiangys  阅读(4024)  评论(1编辑  收藏  举报

问题描述:
    我需要向一个存储过程传递数组类型的参数,可是Transact-SQL里面没有数组类型,请问应该怎样实现数组的功能?

问题分析:
    SQL Server并没有数组类型,ANSI SQL-92标准中并没有任何有关数组方面的定义。要实现其他高级语言中的数组的功能,我们必须使用一些特殊的处理方法,其中包括特殊设计的字符参数、临时表、XML等。
    示例代码如下:
CREATE PROCEDURE sum_of_array @list varchar(1000)
AS
DECLARE @ix int, @pos int, @str varchar(1000), @sum int
SET @pos = 1
SET @ix = 1
SET @sum = 0
WHILE @ix > 0
BEGIN
SET @ix = charindex(',', @list, @pos)
IF @ix > 0
SET @str = substring(@list, @pos, @ix - @pos)
ELSE
SET @str = substring(@list, @pos, len(@list))
SET @str = ltrim(rtrim(@str))
SET @sum = @sum + cast(@str AS int)
SET @pos = @ix + 1
END
SELECT @sum
GO
    该示例代码可以求出一个整型数据数组的和,调用方式为:
EXEC sum_of_array @list = '1,2,3,4,5'
    结果为:16。


下面为修改的存储过程

View Code
create PROCEDURE [dbo].[Proc_Split_SizeClass]
@list varchar(
1000),--尺码
@SizeID
int --尺码临时表ID
AS
DECLARE @ix
int, @pos int, @str varchar(1000), @sum int,@i int
declare @Size varchar(
2000)
declare @SizeClass varchar(
20)
set @Size=''
set @i=1
SET @pos
= 1
SET @ix
= 1
WHILE @ix
> 0
BEGIN
SET @ix
= charindex(',', @list, @pos) -- charindex里面分别指(寻找的字符,搜索指定序列的列,搜索时的起始字符位置)
IF @ix
> 0
SET @str
= substring(@list, @pos, @ix - @pos)
ELSE
SET @str
= substring(@list, @pos, len(@list))
SET @str
= ltrim(rtrim(@str))--LTRIM 是删除起始空格后返回字符表达式,RTRIM 是截断所有尾随空格后返回一个字符串
set @SizeClass='Size'+cast(@i as varchar(10))--给Size编号成Size1,Size2,Size3等
set @Size=@Size+@SizeClass+'='+''''+@str+''''+','--给编号完Size赋值
print @Size
--打印出@Size
SET @pos
= @ix + 1
set @i=@i+1
END
set @Size=left(@Size,len(@Size)-1)--去掉字符串最后的一个字符
print @Size
--打印出最终的字符串

执行:exec Proc_Split_SizeClass
'160,165,170,175,180,185,190','2'
结果为:
Size1
='160',
Size1
='160',Size2='165',
Size1
='160',Size2='165',Size3='170',
Size1
='160',Size2='165',Size3='170',Size4='175',
Size1
='160',Size2='165',Size3='170',Size4='175',Size5='180',
Size1
='160',Size2='165',Size3='170',Size4='175',Size5='180',Size6='185',
Size1
='160',Size2='165',Size3='170',Size4='175',Size5='180',Size6='185',Size7='190',
Size1
='160',Size2='165',Size3='170',Size4='175',Size5='180',Size6='185',Size7='190'

另外,在存储过程最后加上代码:
declare @sql varchar (
2000)
set @sql=''
set @sql='update Pre_BaseProductSize set '+@Size+' where SizeID='+cast(@SizeID as varchar(10))
exec(@sql)

则能够将得到的结果插入到相应的表中