Sql 如何使用vba将access表中的字符串值拆分为一列

Sql 如何使用vba将access表中的字符串值拆分为一列,sql,ms-access,vba,Sql,Ms Access,Vba,我有一个表包含如下列 Prefix CR g ;#WR_1;#WR_2;#WR_3;#WR_4;# v ;#WR_3;#WR_4;# j WR_2 m WR_1 d ;#WR_3;#WR_4;# f9 WR_3 我在列CR as中找到最大的字符串;WR_1;WR_2;WR_3;WR_4;使用 返回 Prefix CR g ;#WR_1;#WR_2;#

我有一个表包含如下列

Prefix    CR
g         ;#WR_1;#WR_2;#WR_3;#WR_4;# 
v         ;#WR_3;#WR_4;#
j         WR_2
m         WR_1
d         ;#WR_3;#WR_4;#   
f9        WR_3
我在列CR as中找到最大的字符串;WR_1;WR_2;WR_3;WR_4;使用

返回

Prefix        CR
g             ;#WR_1;#WR_2;#WR_3;#WR_4;# 
我想把这根绳子分开;WR_1;WR_2;WR_3;WR_4;像列名一样

Prefix  WR_1    WR_2   WR_3   WR_4
或者作为数组

WR_1
WR_2
WR_3
WR_4

所以这不是一个很好的解决方案,但它符合您的要求:

create table #Blah(Prefix nvarchar(5), CR nvarchar(60))

insert into #Blah
values('g', ';#WR_1;#WR_2;#WR_3;#WR_4;#')
insert into #Blah
values('v', ';#WR_3;#WR_4;#')
insert into #Blah
values('j', 'WR_2')
insert into #Blah
values('m', 'WR_1')
insert into #Blah
values('d', ';#WR_3;#WR_4;#')
insert into #Blah
values('f9', 'WR_3')

SELECT Prefix, [WR_1], [WR_2], [WR_3], [WR_4]
FROM(
    SELECT Prefix, SUBSTRING(CR+';#', num, CHARINDEX(';#', CR+';#', num) - num) Item, convert(int,NULL) Col
    FROM #Blah 
        inner join Numbers on num <= LEN(REPLACE(CR,' ','|')) AND SUBSTRING(';#' + CR, num, LEN(REPLACE(';#',' ','|'))) = ';#'
    WHERE SUBSTRING(CR+';#', num, CHARINDEX(';#', CR+';#', num) - num) > ''
    ) q
PIVOT (
    MAX(Col) FOR Item IN ([WR_1], [WR_2], [WR_3], [WR_4])
) p

drop table #Blah
这个查询使用一个名为Numbers的表,该表只使用一个列Num,该列的每个数字都有一行,从1到10000


我不确定为什么将数据作为列标题在填充下拉列表时会有用,要将数据作为行获取,只需删除轴并使用内部查询,别名为q

哪些数据将填充列?数据可以为空,因为我想在下拉列表中使用这些列名。我使用Access VBA,我如何定义函数[dbo].[fn_SplitString].hmm肯定错过了那个标记,我不确定这是否可能。我将重写答案,使其不使用表值函数。@swa1234答案已被编辑以删除表值函数。仍然不能100%确定它是否能在Access VBA中工作
create table #Blah(Prefix nvarchar(5), CR nvarchar(60))

insert into #Blah
values('g', ';#WR_1;#WR_2;#WR_3;#WR_4;#')
insert into #Blah
values('v', ';#WR_3;#WR_4;#')
insert into #Blah
values('j', 'WR_2')
insert into #Blah
values('m', 'WR_1')
insert into #Blah
values('d', ';#WR_3;#WR_4;#')
insert into #Blah
values('f9', 'WR_3')

SELECT Prefix, [WR_1], [WR_2], [WR_3], [WR_4]
FROM(
    SELECT Prefix, SUBSTRING(CR+';#', num, CHARINDEX(';#', CR+';#', num) - num) Item, convert(int,NULL) Col
    FROM #Blah 
        inner join Numbers on num <= LEN(REPLACE(CR,' ','|')) AND SUBSTRING(';#' + CR, num, LEN(REPLACE(';#',' ','|'))) = ';#'
    WHERE SUBSTRING(CR+';#', num, CHARINDEX(';#', CR+';#', num) - num) > ''
    ) q
PIVOT (
    MAX(Col) FOR Item IN ([WR_1], [WR_2], [WR_3], [WR_4])
) p

drop table #Blah