sql截取字符串并把字符串插入到表中的存储过程
2011-08-10 09:26 jiangys 阅读(4025) 评论(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)
则能够将得到的结果插入到相应的表中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端