2014-04-24 160 views
0

我有一个excel,它有一些列(让我们说column1,column2,column3,....等等)和行,这里列数和行数不固定。将excel数据转换为SQL表

现在,从这个Excel数据被复制并插入一列(类型 - 为nvarchar(最大))有些表的......现在我已经从该列获取数据,需要在SQL表格的形式展现。

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

+0

不知道wheter我理解你的querstion正确的标量函数下载...但geany(HTTP:// geany。 org)将tableconvert作为插件提供,可以将制表符分隔的内容转换为可插入的vlaue列表。 – frlan

回答

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<[email protected] 
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