sql-server – 在SQL Server中从CSV列创建一个表,而不使用游标
发布时间:2020-05-23 05:55:47 所属栏目:MsSql 来源:互联网
导读:给一张桌子: |Name | Hobbies |-----------------------------------|Joe | Eating,Running,Golf ||Dafydd | Swimming,Coding,Gaming | 我想把这些行拆分出来: |Name | Hobby |--------------
|
给一张桌子: |Name | Hobbies | ----------------------------------- |Joe | Eating,Running,Golf | |Dafydd | Swimming,Coding,Gaming | 我想把这些行拆分出来: |Name | Hobby | ---------------------- |Joe | Eating | |Joe | Running | |Joe | Golf | |Dafydd | Swimming | |Dafydd | Coding | |Dafydd | Gaming | 我已经完成了下面的例子(例子已经准备好运行在SSMS),买我的解决方案使用我认为是丑陋的光标.有没有更好的方法呢?我在SQL Server 2008 R2上,如果有什么新的,将帮助我. 谢谢 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Split]') and xtype in (N'FN',N'IF',N'TF')) drop function [dbo].Split
go
CREATE FUNCTION dbo.Split (@sep char(1),@s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn,start,stop) AS (
SELECT 1,1,CHARINDEX(@sep,@s)
UNION ALL
SELECT pn + 1,stop + 1,@s,stop + 1)
FROM Pieces
WHERE stop > 0
)
SELECT pn,SUBSTRING(@s,CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
FROM Pieces
)
go
declare @inputtable table (
name varchar(200) not null,hobbies varchar(200) not null
)
declare @outputtable table (
name varchar(200) not null,hobby varchar(200) not null
)
insert into @inputtable values('Joe','Eating,Golf')
insert into @inputtable values('Dafydd','Swimming,Gaming')
select * from @inputtable
declare inputcursor cursor for
select name,hobbies
from @inputtable
open inputcursor
declare @name varchar(255),@hobbiescsv varchar(255)
fetch next from inputcursor into @name,@hobbiescsv
while(@@FETCH_STATUS <> -1) begin
insert into @outputtable
select @name,splithobbies.s
from dbo.split(',',@hobbiescsv) splithobbies
fetch next from inputcursor into @name,@hobbiescsv
end
close inputcursor
deallocate inputcursor
select * from @outputtable
解决方法使用一个字符串解析函数,就像找到的一个字符串 here.关键是使用 CROSS APPLY执行基表中每行的功能.CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1))
RETURNS @parsedString TABLE (string NVARCHAR(MAX))
AS
BEGIN
DECLARE @position int
SET @position = 1
SET @string = @string + @separator
WHILE charindex(@separator,@string,@position) <> 0
BEGIN
INSERT into @parsedString
SELECT substring(@string,@position,charindex(@separator,@position) - @position)
SET @position = charindex(@separator,@position) + 1
END
RETURN
END
go
declare @MyTable table (
Name char(10),Hobbies varchar(100)
)
insert into @MyTable
(Name,Hobbies)
select 'Joe',Golf'
union all
select 'Dafydd',Gaming'
select t.Name,p.String
from @mytable t
cross apply dbo.fnParseStringTSQL(t.Hobbies,') p
DROP FUNCTION [dbo].[fnParseStringTSQL] (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
