我有一个表,其中一列包含数百万行星号分隔值。
我一直在尝试一个简单易懂的插入语句。下面是我尝试的伪代码
[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列。
答案 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