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。
下面为修改的存储过程
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)
则能够将得到的结果插入到相应的表中