我有一个excel,它有一些列(比如column1,column2,column3,......等等)和行,这里列和行的数量不固定。
现在,来自此excel的数据被复制并插入到某个表的一列( type - nvarchar(max))中...现在我必须从此列中获取数据并需要显示在SQL中的表格格式。
如果已修复列数,我可以轻松转换xml中的列值并以表格格式显示数据。由于列数不固定,请建议如何获得所需的输出。
答案 0 :(得分:0)
以下是我的假设,
1.你使用','作为分隔符。
2.因为您将所有内容都插入一列
下面会有帮助吗?
/*create table
CREATE TABLE Tbl ( col nvarchar(max))
insert into Tbl values ('1,2,3,4'),('1,2,3'),('1,2')
***/
DECLARE @maxcol as int,@i as int
SELECT @maxcol=max(LEN(col) - LEN(REPLACE(col, ',', '')))+1 FROM Tbl
select @i=1
declare @nvarsql as nvarchar(max)
select @nvarsql =''
while @i<=@maxcol
begin
set @nvarsql = @nvarsql + ' ISNULL(DBO.fnString_DelimeterIndex(col,'','',' + cast(@i as varchar) +' ),'''') as COL' + CAST(@i AS VARCHAR) + ','
set @i = @i +1
end
if @nvarsql <>''
begin
set @nvarsql = 'SELECT ' + left(@nvarsql,LEN(@nvarsql)-1) + ' FROM Tbl'
end
PRINT @nvarsql
EXEC (@nvarsql)
从某个地方下载Scalar函数
ALTER FUNCTION [dbo].[fnString_DelimeterIndex]
(
@Text NVARCHAR(4000),
@Delimiter CHAR,
@Section SMALLINT
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @NextPos SMALLINT,
@LastPos SMALLINT,
@Found SMALLINT,
@REVERSE BIT
IF @Section < 0
SELECT @Text = REVERSE(@Text)--, @Section=1,@REVERSE=1
SELECT @NextPos = CHARINDEX(@Delimiter, @Text, 1),
@LastPos = 0,
@Found = 1
WHILE @NextPos > 0 AND ABS(@Section) <> @Found
SELECT @LastPos = @NextPos,
@NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
@Found = @Found + 1
RETURN CASE
WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL
--WHEN @REVERSE =1 THEN
WHEN @Section > 0 THEN SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
ELSE REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))
END
END
上述样本的结果
COL1 COL2 COL3 COL4
1 2 3 4
1 2 3
1 2