这个是SQLSERVER数据库存储过程的问题,我的需求是给存储过程传一个参数,这个参数是一个集合,比如list集合,我是把这个集合拼成 字符串的形式 比如: beijing,1,2025|shanghai,2,1089|tianjin,3,4057 也就是将这个集合中的每个对象以'|'分隔,而对于每个对象中的属性,以','分隔。我的存储过程接受的参数就是这个字符串,我在存储过程中该如何去分隔,截取这个字符串了,我要把每一个对象插入到数据表中去。这个怎么解决了,如何这个不妥,还有没有别的好法子?
能不能再调用的时候循环调用存储过程了.这样存储过程执行的就是一组数据.
那就得多次调用了,每一个对象的插入都得连接一次数据库了,现在想全部交给存储过程
-- Description: 分割字符串函数 -- SELECT * FROM dbo.Split('a,b,c,d,e,f,g',',') -- ============================================= ALTER FUNCTION [dbo].[Split] ( @Text VARCHAR(8000) , @Sign NVARCHAR(4000) ) RETURNS @tempTable TABLE ( id INT IDENTITY(1, 1) PRIMARY KEY , [VALUE] VARCHAR(4000) ) AS BEGIN DECLARE @StartIndex INT --开始查找的位置 DECLARE @FindIndex INT --找到的位置 DECLARE @Content VARCHAR(4000) --找到的值 SET @StartIndex = 1 --T-SQL中字符串的查找位置是从1开始的 SET @FindIndex = 0 --开始循环查找字符串逗号 WHILE ( @StartIndex <= LEN(@Text) ) BEGIN --返回值是找到字符串的位置 SELECT @FindIndex = CHARINDEX(@Sign, @Text, @StartIndex) --判断有没找到 没找到返回0 IF ( @FindIndex = 0 OR @FindIndex IS NULL ) BEGIN --如果没有找到者表示找完了 SET @FindIndex = LEN(@Text) + 1 END SET @Content = LTRIM(RTRIM(SUBSTRING(@Text, @StartIndex, @FindIndex - @StartIndex))) --初始化下次查找的位置 SET @StartIndex = @FindIndex + 1 --把找的的值插入到要返回的Table类型中 INSERT INTO @tempTable ( [VALUE] ) VALUES ( @Content ) END RETURN END
//正好项目中有分割字符的代码,直接拿去用吧~~~~
那个我看了,很麻烦,SQL解析xml来处理行不行?
@夏威夷海风:
那你程序是不是还得把xml生成然后再用sql读xml再把xml属性存在临时表中?
如果用sql函数切割,只要定义两个表变量,切割两次就出来了,我选择这个~LZ自己决定吧~
@Zery-zhang: 我两个都写,然后测试哪个快,哪个健壮用哪个,我正在写
@夏威夷海风: 非得用这种方式么?可以建一个用户自定义表类型。
----在用户定义表类型节点下
CREATE TYPE [dbo].[Test_TYPE] AS TABLE(
[City] [varchar](50) NOT NULL,
[Cityid1] [int] NOT NULL,
[Cityid2] [int] NOT NULL
)
GO
--存储过程中可以这么用。
CREATE PROCEDURE [dbo].[UP_Batchadd_test]
(
@SourceList Test_TYPE READONLY
)
AS
begin
--这里面遍历@SourceList结果集中的数据,循环插入表中即可。
end
数据库字符串分割函数~