新足迹

 找回密码
 注册

精华好帖回顾

· Channel 7 Sydney Weekender电视节目拍摄 - Joe 要上电视了 (2007-2-21) rdcwayx · 我的垃圾证书经历 (2008-10-1) Monica
· Tony 建房贴 Mel Point Cook(最新情报:房子已经完成,3月29日 Inspection 见368楼) (2010-3-19) tony2006 · 一路看房。。。。。。 (2009-12-10) 微风细雨
Advertisement
Advertisement
查看: 1369|回复: 10

SQL 问题求教 [复制链接]

发表于 2012-8-15 22:18 |显示全部楼层
此文章由 bluesknight 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bluesknight 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请教一下论坛里的DBA和SQL高手们,在SQL Server中如何根据给定的delimiter来split string column?

比如我在TABLE_ITEM中有以下数据

ITEM_ID     ITEM_DESCRIPTION
1                 HANDY_PAPER_TOWER
2                 HANDY_ULTRA_STRONG

我想将ITEM_DESCRIPTION中的数据split之后(假设delimiter是 '_' )导入表TABLE_WORD

WORD_ID   ITEM_ID  WORD
1                   1             HANDY
2                   1             PAPER
3                   1             TOWER
4                   2             HANDY
5                   2             ULTRA
6                   2             STRONG
Advertisement
Advertisement

发表于 2012-8-15 22:30 |显示全部楼层
此文章由 biling 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 biling 所有!转贴必须注明作者、出处和本声明,并保持内容完整
查查手册喽(俺只知道mysql)

发表于 2012-8-15 23:27 |显示全部楼层
此文章由 再来一碗 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 再来一碗 所有!转贴必须注明作者、出处和本声明,并保持内容完整
-- 1) Assume ITEM is the first table's name
-- 2) Assume ITEM_WORD is the second table's name
-- 3) Assume the second table's key is auto generated by system

--4)  the following script shall work and generate a set of sql insert scripts
-- 5) you just need to run the whole set of sql insert scripts

SET NOCOUNT ON

DECLARE @idx int
DECLARE @ITEM_ID int
DECLARE @ITEM_DESCRIPTION varchar(255)
DECLARE @my_cursor CURSOR


SET @my_cursor = CURSOR FOR
                  SELECT ITEM_ID, ITEM_DESCRIPTION     
                  FROM   ITEM

OPEN @my_cursor

FETCH NEXT FROM @my_cursor INTO @ITEM_ID, @ITEM_DESCRIPTION

WHILE @@FETCH_STATUS = 0
BEGIN
        SET @idx = CHARINDEX('_', @ITEM_DESCRIPTION, 0)
  WHILE @idx > 0
  BEGIN
               
                PRINT 'INSERT INTO ITEM_WORD (ITEM_ID ,WORD) VALUES(' + CONVERT(varchar, @ITEM_ID) + ',' + + '''' + SUBSTRING(@ITEM_DESCRIPTION, 1, @idx - 1) + '''' + ')'
                SET @ITEM_DESCRIPTION = SUBSTRING(@ITEM_DESCRIPTION, @idx + 1, LEN(@ITEM_DESCRIPTION) - @idx)
                SET @idx = CHARINDEX('_', @ITEM_DESCRIPTION, 0)
  END
  PRINT 'INSERT INTO ITEM_WORD (ITEM_ID ,WORD) VALUES(' + CONVERT(varchar, @ITEM_ID) + ',' + + '''' + @ITEM_DESCRIPTION + '''' + ')'

  FETCH NEXT FROM @my_cursor INTO @ITEM_ID, @ITEM_DESCRIPTION
END

CLOSE @my_cursor
DEALLOCATE @my_cursor

评分

参与人数 1积分 +3 收起 理由
bluesknight + 3 感谢分享

查看全部评分

发表于 2012-8-16 13:16 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我觉得先做个function, 专门处理split工作,

然后写script倒入另一张表。
头像被屏蔽

禁止访问

发表于 2012-8-16 14:29 |显示全部楼层
此文章由 lingg 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 lingg 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 bluesknight 于 2012-8-15 21:18 发表
请教一下论坛里的DBA和SQL高手们,在SQL Server中如何根据给定的delimiter来split string column?

比如我在TABLE_ITEM中有以下数据

ITEM_ID     ITEM_DESCRIPTION
1                 HANDY_PAPER_TOWER
2            ...


楼主,我不是DBA,这活要是我做,如果只是一次性使用,
可以试试 用你最熟系的语言,写个小脚本,逐行处理数据,然后再逐行输出到另外一个文件

特殊贡献奖章

发表于 2012-8-16 14:36 |显示全部楼层
此文章由 kr2000 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kr2000 所有!转贴必须注明作者、出处和本声明,并保持内容完整
网上找的,用CHARINDEX和SUBSTRING写的一个function

把里面的","改成你要的符号就可以用了

CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

DECLARE @name NVARCHAR(255)
DECLARE @pos INT

WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
  SELECT @pos  = CHARINDEX(',', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END

RETURN
END

评分

参与人数 2积分 +6 收起 理由
bluesknight + 3 我今天也找到类似的function,谢谢分享
flyspirit + 3 感谢分享

查看全部评分

Advertisement
Advertisement

发表于 2012-8-16 18:45 |显示全部楼层

OK, I provide you final solution

此文章由 再来一碗 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 再来一碗 所有!转贴必须注明作者、出处和本声明,并保持内容完整
SET NOCOUNT ON
DECLARE @idx int
DECLARE @ITEM_ID int
DECLARE @ITEM_DESCRIPTION varchar(255)
DECLARE @my_cursor CURSOR
SET @my_cursor = CURSOR FOR
                  SELECT ITEM_ID, ITEM_DESCRIPTION     
                  FROM   TABLE_ITEM

OPEN @my_cursor

FETCH NEXT FROM @my_cursor INTO @ITEM_ID, @ITEM_DESCRIPTION

WHILE @@FETCH_STATUS = 0
BEGIN
        SET @idx = CHARINDEX('_', @ITEM_DESCRIPTION, 0)
  WHILE @idx > 0
  BEGIN
               
                INSERT INTO TABLE_WORD (ITEM_ID ,WORD) VALUES(@ITEM_ID, SUBSTRING(@ITEM_DESCRIPTION, 1, @idx - 1) )
                SET @ITEM_DESCRIPTION = SUBSTRING(@ITEM_DESCRIPTION, @idx + 1, LEN(@ITEM_DESCRIPTION) - @idx)
                SET @idx = CHARINDEX('_', @ITEM_DESCRIPTION, 0)
  END
  INSERT INTO TABLE_WORD (ITEM_ID ,WORD) VALUES(@ITEM_ID, @ITEM_DESCRIPTION)

  FETCH NEXT FROM @my_cursor INTO @ITEM_ID, @ITEM_DESCRIPTION
END

CLOSE @my_cursor
DEALLOCATE @my_cursor

发表于 2012-8-16 22:34 |显示全部楼层
此文章由 bluesknight 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bluesknight 所有!转贴必须注明作者、出处和本声明,并保持内容完整
谢谢兄弟,还想请教个问题,如果我想把这个指令做成SP,将column name, table name, delimiter做成input parameter形式,不知道是否能实现?

发表于 2012-8-16 23:33 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
可以实现, 不过SP里面还是要掉用function。

发表于 2012-8-17 00:15 |显示全部楼层

I think, as a more efficient alternative to cursor

此文章由 YugaYuga 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 YugaYuga 所有!转贴必须注明作者、出处和本声明,并保持内容完整
it can be done by updating TABLE_WORD.WORD with values (substring) from TABLE_ITEM.ITEM_DESCRIPTION

[ 本帖最后由 YugaYuga 于 2012-8-16 23:16 编辑 ]

发表于 2012-8-18 16:13 |显示全部楼层
此文章由 marklan001 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 marklan001 所有!转贴必须注明作者、出处和本声明,并保持内容完整
anyway, do not use cursor
Advertisement
Advertisement

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部