嗨我的箱子有一个Split函数,它返回像bellow:
这样的行declare @a nvarchar(50)= '1,2,3,4,5,6'
select Item from dbo.Split(@a,',')
结果:
Item
--------
1
2
3
4
5
6
现在我想创建一个表并从我的split函数插入两个字段,如下所示:
declare @a nvarchar(50)= '1,2,3,4,5,6'
declare @b nvarchar(50)= '10,20,30,40,50,60'
declare @tblCare table
(
id int ,
count int
)
insert into @tblCare (id,count)
values
(
(select Item from dbo.Split(@a,',')),
(select Item from dbo.Split(@b,','))
)
select * from @tblCare
我得到了这个
错误:消息512,级别16,状态1,行10子查询返回更多 比1值。当子查询跟随=,!=时,不允许这样做, &lt ;,< =,>,> =或者当子查询用作表达式时。该 声明已被终止。
id count
----------- -----------
(0 row(s) affected)
以及我期望的结果:
id count
---------------
1 10
2 20
3 30
4 40
5 50
6 60
答案 0 :(得分:4)
你可以这样做:
declare @t1 table (ID bigint identity(1, 1), Item nvarchar(max))
declare @t2 table (ID bigint identity(1, 1), Item nvarchar(max))
insert into @t1
select item from dbo.Split(@a,',')
insert into @t2
select item from dbo.Split(@b,',')
insert into @tblCare (id,count)
select T1.Item, T2.Item
from @t1 as T1
inner join @t2 as T2 on T1.ID = T2.ID
首先,我创建带有标识列的表来枚举拆分数据的行。
然后使用这些rownumbers加入两个结果并插入它。
答案 1 :(得分:4)
您的dbo.Split
函数应返回serial no
,我们可以在其中加入两个分割。我使用的是Jeff Moden的DelimitedSplit8K,它是最快的分割器之一,但您可以使用ROW_NUMBER()
更新分割功能以包含序列号。
declare @a nvarchar(50)= '1,2,3,4,5,6'
declare @b nvarchar(50)= '10,20,30,40,50,60'
insert into @tblCare (id,count)
SELECT a.item,b.item
FROM [DelimitedSplit8K](@a,',') a
INNER JOIN [DelimitedSplit8K](@b,',') b
ON a.itemnumber = b.itemnumber
<强>输出强>
1 10
2 20
3 30
4 40
5 50
6 60
答案 2 :(得分:0)
不要使用子查询,即插入语法形式:
insert into table ...
select ...
选择列的数量和类型与插入的列匹配。
我原以为你想要从所有回复项目的拆分调用计数:
insert into @tblCare (id, count)
select item, count(*) from
(select item from dbo.Split(@a,',')
union all
select item from dbo.Split(@b,',')) x
group by item