TSQL从*分隔字段插入表中

时间:2014-07-17 15:40:55

标签: sql sql-server

我有一个表,其中一列包含数百万行星号分隔值。

我一直在尝试一个简单易懂的插入语句。下面是我尝试的伪代码

[cds]字段的测试表内容:

bobo11*bobo12*bobo13
bobo21*bobo22*bobo23
bobo31*bobo32*bobo33

SQL:

INSERT INTO TestTable2
(boboA,boboB,boboC)
SELECT '''' + REPLACE(cds,'*','''' + ',' + '''') + '''' FROM Test Table

麻烦的是即使我确实有正确的列数, 上述声明无法识别,并返回错误消息:

  

INSERT语句的选择列表包含的项目数少于   插入列表。 SELECT值的数量必须与数量匹配   INSERT列。

3 个答案:

答案 0 :(得分:0)

您需要实际解析值。使用您拥有的值,您可以执行以下操作:

INSERT INTO TestTable2(boboA, boboB, boboC)
    select left(cds, 6), substring(cds, 8, 6), right(cds, 6)
    from TestTable;

答案 1 :(得分:0)

您无法在静态查询中构建动态列列表。您必须拆分列值并插入它们。您可以尝试以下查询

INSERT INTO TestTable2
(boboA,boboB,boboC)
SELECT PARSENAME(REPLACE(cds,'*','.'),3)
      ,PARSENAME(REPLACE(cds,'*','.'),2)
      ,PARSENAME(REPLACE(cds,'*','.'),1)
FROM TestTable

答案 2 :(得分:0)

使用XML PATH创建动态sql的小例子

DECLARE 
    @sql nvarchar(max) ;

SET @sql = 'INSERT INTO TestTable2(boboA,boboB,boboC)VALUES' + (
select
'('''+REPLACE(A,'*',''',''')+'''),'
from Test
FOR XML PATH(''));

SET @sql = SUBSTRING(@sql,1,LEN(@sql)-1);

print @sql