将excel数据转换为SQL表

时间:2014-04-24 05:52:02

标签: sql sql-server sql-server-2008

我有一个excel,它有一些列(比如column1,column2,column3,......等等)和行,这里列和行的数量不固定。

现在,来自此excel的数据被复制并插入到某个表的一列( type - nvarchar(max))中...现在我必须从此列中获取数据并需要显示在SQL中的表格格式。

如果已修复列数,我可以轻松转换xml中的列值并以表格格式显示数据。由于列数不固定,请建议如何获得所需的输出。

1 个答案:

答案 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