首页 新闻 会员 周边 捐助

关于Sqlserver存储过程处理接受参数的问题

0
悬赏园豆:20 [待解决问题]
这个是SQLSERVER数据库存储过程的问题,我的需求是给存储过程传一个参数,这个参数是一个集合,比如list集合,我是把这个集合拼成 字符串的形式 比如:
beijing,1,2025|shanghai,2,1089|tianjin,3,4057
也就是将这个集合中的每个对象以'|'分隔,而对于每个对象中的属性,以','分隔。我的存储过程接受的参数就是这个字符串,我在存储过程中该如何去分隔,截取这个字符串了,我要把每一个对象插入到数据表中去。这个怎么解决了,如何这个不妥,还有没有别的好法子?
< >
分享
所有回答(3)
0

能不能再调用的时候循环调用存储过程了.这样存储过程执行的就是一组数据.

平常心队长 | 园豆:1113 (小虾三级) | 2013-11-04 09:57

那就得多次调用了,每一个对象的插入都得连接一次数据库了,现在想全部交给存储过程

支持(0) 反对(0) 夏威夷海风 | 园豆:140 (初学一级) | 2013-11-04 10:05
0
-- 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

//正好项目中有分割字符的代码,直接拿去用吧~~~~
Zery | 园豆:6151 (大侠五级) | 2013-11-04 10:09

那个我看了,很麻烦,SQL解析xml来处理行不行?

支持(0) 反对(0) 夏威夷海风 | 园豆:140 (初学一级) | 2013-11-04 10:11

@夏威夷海风: 

那你程序是不是还得把xml生成然后再用sql读xml再把xml属性存在临时表中?

如果用sql函数切割,只要定义两个表变量,切割两次就出来了,我选择这个~LZ自己决定吧~

支持(0) 反对(0) Zery | 园豆:6151 (大侠五级) | 2013-11-04 10:19

@Zery-zhang: 我两个都写,然后测试哪个快,哪个健壮用哪个,我正在写

支持(0) 反对(0) 夏威夷海风 | 园豆:140 (初学一级) | 2013-11-04 10:58

@夏威夷海风: 非得用这种方式么?可以建一个用户自定义表类型。

----在用户定义表类型节点下

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

支持(0) 反对(0) 日取其半 | 园豆:202 (菜鸟二级) | 2013-11-04 16:13
0

数据库字符串分割函数~

幻天芒 | 园豆:37207 (高人七级) | 2013-11-04 11:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册