[英]Split string to columns and rows
我有一个字符串要分割; 它具有这样的格式:
---------------------------------------------------------
HEADING DETAILS HERE:
~
INVOICE1^VALUE1^VALUE2^
INVOICE2^VALUE1^VALUE2^
INVOICE3^VALUE1^VALUE2^
TOTAL^OFVALUE1^OFVALUE2^
~
FOOTER DETAILS HERE
---------------------------------------------------------
我的输出应该是一个包含3列的表格:
| INVOICE | VALUE1 | VALUE2 |
INVOICE 1---------- VALUE1 ---------- VALUE2
INVOICE 2---------- VALUE1 ---------- VALUE2
INVOICE 3---------- VALUE1 ---------- VALUE2
我的想法是使用第一个定界符〜进行拆分,并使用定界符^ 2进行拆分。
我做了一个split函数,这是我第一次用定界符分割的结果〜
ROW 1 HEADER DETAILS HERE:
ROW 2 INVOICE1^VALUE1^VALUE2^ INVOICE2^VALUE1^VALUE2^ INVOICE3^VALUE1^VALUE2^
ROW 3 FOOTER DETAILS HERE
但是,我需要做的是将结果放入列而不是行中。 另外,我需要获取ROW 2的结果并将其再次拆分,然后将其放入这样的列中:
INVOICE column - VALUE1 column - VALUE2 column
INVOICE 1---------- VALUE1 ---------- VALUE2
INVOICE 2---------- VALUE1 ---------- VALUE2
INVOICE 3---------- VALUE1 ---------- VALUE2
我希望有人能够阅读这个问题,并帮助我编写TSQL。
后续问题:2013年8月13日
我试图将Rs的代码更改为这样的内容...
USE [test]
GO
/****** Object: StoredProcedure [dbo].[SplitSP4] Script Date: 8/13/2013 7:33:31 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[SplitSP4]
-- Add the parameters for the stored procedure here
--<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
--<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
@TABLE_id varchar(50)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--SET NOCOUNT ON;
declare @string varchar(8000)
declare @stringXML xml
declare @NewLine char(2)
set @NewLine=char(13)+char(10)
set @string = (SELECT [dbo].[TABLE_NAME].[iam_string] FROM [dbo].[TABLE_NAME] WHERE [dbo].[TABLE_NAME].[id] = @TABLE_id)
--'HEADING DETAILS HERE:
--~
--INVOICE1^VALUE1^VALUE2^
--INVOICE2^VALUE1^VALUE2^
--INVOICE3^VALUE1^VALUE2^
--TOTAL^OFVALUE1^OFVALUE2^
--~
--FOOTER DETAILS HERE'
declare @table1 table(cols varchar(max))
--convert string to xml
SELECT @stringXML = CONVERT(xml,'<root><i>' +
Replace(@string, @NewLine, '</i><i>') + '</i></root>')
--split xml string into different rows
insert into @table1
select Cols = I.c.value('.', 'varchar(MAX)')
from @stringXML.nodes('/root/i') I(c)
--split invoice rows into columns
select
Inv.value('/Invoice[1]/Attribute[1]','varchar(50)') AS [Invoice],
Inv.value('/Invoice[1]/Attribute[2]','varchar(50)') AS [Value1],
Inv.value('/Invoice[1]/Attribute[3]','varchar(50)') AS [Value2]
from
(
select CONVERT(XML,'<Invoice><Attribute>'
+ REPLACE([cols],'~', '</Attribute><Attribute>')
+ '</Attribute></Invoice>') Inv
from @table1 where cols like '%^%'
) x
end
...对于我来说,我可以为水晶报告制作一个存储程序。 但似乎当我执行此存储过程时,它返回了此错误。
消息9421,第16级,状态1,过程SplitSP4,第34行
XML解析:第1行,字符31,非法名称字符
我想知道如何修复代码以适合示例XML代码吗?
假设您的文本在每行末尾都有换行符,请尝试执行此操作
declare @string varchar(4000)
declare @stringXML xml
declare @NewLine char(2)
set @NewLine=char(13)+char(10)
set @string = 'HEADING DETAILS HERE:
~
INVOICE1^VALUE1^VALUE2^
INVOICE2^VALUE1^VALUE2^
INVOICE3^VALUE1^VALUE2^
TOTAL^OFVALUE1^OFVALUE2^
~
FOOTER DETAILS HERE'
declare @table1 table(cols varchar(max))
--convert string to xml
SELECT @stringXML = CONVERT(xml,'<root><i>' +
Replace(@string, @NewLine, '</i><i>') + '</i></root>')
--split xml string into different rows
insert into @table1
select Cols = I.c.value('.', 'varchar(MAX)')
from @stringXML.nodes('/root/i') I(c)
--split invoice rows into columns
select
Inv.value('/Invoice[1]/Attribute[1]','varchar(50)') AS [Invoice],
Inv.value('/Invoice[1]/Attribute[2]','varchar(50)') AS [Value1],
Inv.value('/Invoice[1]/Attribute[3]','varchar(50)') AS [Value2]
from
(
select CONVERT(XML,'<Invoice><Attribute>'
+ REPLACE([cols],'^', '</Attribute><Attribute>')
+ '</Attribute></Invoice>') Inv
from @table1 where cols like '%^%'
) x
您已经编写了拆分函数,可以将上述的最后一个select语句(将发票行拆分为列)与现有的拆分函数一起使用,将row2转换为xml并将row 2拆分为列
首先,将第一次拆分的结果存储到临时表中。 然后,您可以在该临时表上使用光标,并在行值中包含^的情况下拆分行。
我已经使用上述查询为您创建了存储过程-
IF OBJECT_ID(N'[dbo].[SplitSP4]', N'P') IS NOT NULL
DROP PROCEDURE [dbo].[SplitSP4]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SplitSP4]
@table_id INT
AS
declare @stringXML xml
declare @NewLine char(2)
DECLARE @string VARCHAR(MAX)
set @NewLine=char(13)+char(10)
declare @table1 table(cols varchar(max))
SELECT @string = string_value FROM table_name WHERE id = @table_id
--convert string to xml
SELECT @stringXML = CONVERT(xml,'<root><i>' +
Replace(@string, @NewLine, '</i><i>') + '</i></root>')
--split xml string into different rows
insert into @table1
select Cols = I.c.value('.', 'varchar(MAX)')
from @stringXML.nodes('/root/i') I(c)
--split invoice rows into columns
select
Inv.value('/Invoice[1]/Attribute[1]','varchar(50)') AS [Invoice],
Inv.value('/Invoice[1]/Attribute[2]','varchar(50)') AS [Value1],
Inv.value('/Invoice[1]/Attribute[3]','varchar(50)') AS [Value2]
from
(
select CONVERT(XML,'<Invoice><Attribute>'
+ REPLACE([cols],'^', '</Attribute><Attribute>')
+ '</Attribute></Invoice>') Inv
from @table1 where cols like '%^%'
) x
并称它为
EXEC SplitSP4 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.