分割字符串 插入新表

FanKe000 2009-10-19 03:47:27
表Tmp数据
id value
1 0.9%氯化钠注射液,0.9%:500ml,山东华鲁制药有限公司,20,瓶,1.380,
2 0.9%氯化钠注射液,100ml*80,上海华源长富药业(集团)有限公司,80,塑瓶,0.600,
3 0.9%氯化钠注射液,500ml*30,上海华源长富药业(集团)有限公司,30,塑瓶,2.850,
4 0.9%氯化钠注射液,500ml,六安华源制药有限公司,20,瓶,1.430,
5 0.9氯化钠注射液,250ml*30,山东华鲁制药有限公司,30,瓶,0.980,
6 0.9氯化钠注射液,500ml,山东华鲁制药有限公司,20,瓶,0.800,

根据指定符号,分割字符后并插入到新表中,求一SQL语句
新表如下:
id(int) p1(varchar50) p2(varchar50) p3(varchar50) p4(varchar50) p5(varchar50) p6(varchar50)

想要的结果如:
id(int) p1(varchar50) p2(varchar50) p3(varchar50) p4(varchar50) p5(varchar50) p6(varchar50)
1 0.9%氯化钠注射液 0.9%:500ml 山东华鲁制药有限公司 20 瓶 1.380
...全文
133 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
FanKe000 2009-10-19
  • 打赏
  • 举报
回复
谢谢Happy_Stone和navy887
搞定,散分
sgtzzc 2009-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 happy_stone 的回复:]
SQL code-->Title:Generating test data
-->Author:happy_stone【不會飛的石頭】
-->Date :2009-10-19 15:48:36ifnotobject_id('tb')isnulldroptable tbGoCreatetable tb([id]int,[value]nvarchar(49))Insert tbselect1,N'0.¡­
[/Quote]
up
FanKe000 2009-10-19
  • 打赏
  • 举报
回复
谢谢,我去试下
-狙击手- 2009-10-19
  • 打赏
  • 举报
回复
写个分割函数
快乐_石头 2009-10-19
  • 打赏
  • 举报
回复
-->Title:Generating test data
-->Author:happy_stone【不會飛的石頭】
-->Date :2009-10-19 15:48:36

if not object_id('tb') is null
drop table tb
Go
Create table tb([id] int,[value] nvarchar(49))
Insert tb
select 1,N'0.9%氯化钠注射液,0.9%:500ml,山东华鲁制药有限公司,20,瓶,1.380,' union all
select 2,N'0.9%氯化钠注射液,100ml*80,上海华源长富药业(集团)有限公司,80,塑瓶,0.600,' union all
select 3,N'0.9%氯化钠注射液,500ml*30,上海华源长富药业(集团)有限公司,30,塑瓶,2.850,' union all
select 4,N'0.9%氯化钠注射液,500ml,六安华源制药有限公司,20,瓶,1.430,' union all
select 5,N'0.9氯化钠注射液,250ml*30,山东华鲁制药有限公司,30,瓶,0.980,' union all
select 6,N'0.9氯化钠注射液,500ml,山东华鲁制药有限公司,20,瓶,0.800,'
Go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_GetStr]
GO
--分段截取函数
CREATE FUNCTION dbo.f_GetStr(
@s nvarchar(4000), --包含多个数据项的字符串
@pos int, --要获取的数据项的位置
@split nvarchar(10) --数据分隔符
)RETURNS nvarchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO
select ID,
dbo.f_GetStr([value],1,',')[P1],
dbo.f_GetStr([value],2,',')[P2],
dbo.f_GetStr([value],3,',')[P3],
dbo.f_GetStr([value],4,',')[P4],
dbo.f_GetStr([value],5,',')[P5],
dbo.f_GetStr([value],6,',')[P6]
from tb
/*

(6 個資料列受到影響)
ID P1 P2 P3 P4 P5 P6
----------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
1 0.9%氯化钠注射液 0.9%:500ml 山东华鲁制药有限公司 20 瓶 1.380
2 0.9%氯化钠注射液 100ml*80 上海华源长富药业(集团)有限公司 80 塑瓶 0.600
3 0.9%氯化钠注射液 500ml*30 上海华源长富药业(集团)有限公司 30 塑瓶 2.850
4 0.9%氯化钠注射液 500ml 六安华源制药有限公司 20 瓶 1.430
5 0.9氯化钠注射液 250ml*30 山东华鲁制药有限公司 30 瓶 0.980
6 0.9氯化钠注射液 500ml 山东华鲁制药有限公司 20 瓶 0.800

(6 個資料列受到影響)


*/
--小F-- 2009-10-19
  • 打赏
  • 举报
回复
先用4楼的拆分 然后再行转列
--小F-- 2009-10-19
  • 打赏
  • 举报
回复
select 
a.id,b.[value]
from
(select id,[value]=convert(xml,'<root><v>'+replace([value],',','</v><v>')+'</v></root>') from Tb)a
outer apply
(select [value]=C.v.value('.','nvarchar(100)') from a.[value].nodes('/root/v')C(v))b
FanKe000 2009-10-19
  • 打赏
  • 举报
回复
用函数也行,可否给个提示?
navy887 2009-10-19
  • 打赏
  • 举报
回复
------------------------------------------------------------------------

-- Author : navy887(草根)

-- 用途:分隔字符串的存储过程

-- 使用方法:EXEC DivideString 'dd,aaa,bbb,ccc',',','表名'

-- 转载请注明出处

------------------------------------------------------------------------

CREATE PROCEDURE DivideString
(
@String NVARCHAR(1210), -- 要分隔的字符串
@SPLITCHAR NVARCHAR(10) = ',', -- 默认分隔字符
@TableName NVARCHAR(30) = 'table' --默认表名
)
AS
DECLARE @L INT -- 第一个分隔字符的位置
DECLARE @S INT -- 第二个分隔字符的位置
SET @L = 0
SET @S = CHARINDEX(@SPLITCHAR, @String, @L)

WHILE @L <= LEN(@String)
BEGIN
DECLARE @ColName NVARCHAR(50)
IF @S = 0 SET @S = LEN(@String) + 1 -- 如果到最后一个字符串那么第二个分隔字符的位置就是这个字符串的长度加一
SET @ColName = SUBSTRING(@String, @L, @S - @L) -- 取值
SET @L = @S + 1
SET @S = CHARINDEX(@SPLITCHAR, @String, @L)
IF LTRIM(RTRIM(@ColName)) = '' CONTINUE -- 如果是空字符串就跳过
DECLARE @SQL NVARCHAR(1000)
SET @SQL ='INSERT INTO ' + @TableName + '(tcname) select ''' +@ColName+'''' --插入表的语句,根据自己需求修改
--EXEC (@SQL)
Print @sql
END


sgtzzc 2009-10-19
  • 打赏
  • 举报
回复
这个得用函数或xml来搞

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧