【问题标题】:Convert excel data into SQL table将excel数据转换成SQL表
【发布时间】:2014-06-09 06:15:49
【问题描述】:

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

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

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

【问题讨论】:

  • 不确定我是否理解您的问题是否正确......但 geany (geany.org) 提供 tableconvert 作为插件,该插件能够将制表符分隔的内容转换为可用于插入的 vlaue 列表。跨度>

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


【解决方案1】:

以下是我的假设,
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)

标量函数从某处下载

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       

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2017-06-16
    • 1970-01-01
    • 2017-04-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多