非常新的sql。我有一个将列值拆分为多行的查询。现在我需要将它提交到实际的表中,而不仅仅是通过select查询提交一个视图。
我读过这么多的解决方案,但似乎都不管用。整个“create split function”编写所有这些复杂的变量,然后创建一个“temp table”,然后“用value列将其合并回原始表”等等,这让我非常困惑。有人能帮我把它放在计划和简单的格式里吗。对于像我这样的开发者来说,必须有一个更简单的方法。请不要只是告诉我我做错了什么,并假设我知道你在说什么(因为我知道这不起作用,我已经确定我不是这方面的专业人士),有人能告诉我需要做什么,使这项工作。
我有输出视图,这正是我想要的,但它只是一个视图,它不更新表…我只想从我的拆分字符串查询输出的值插入到我的实际表中,或者即使我可以更新表,使其看起来像我的视图查询表,或者甚至我如何从我的查询创建一个新表,使实际表看起来像我的查询,而不仅仅是一个视图,那就太棒了!
一行示例表
请注意,这只是一个示例,实际表中有120多列,拆分[dos file]字符串不是我的问题(我的查询是按分隔符拆分,插入多行,并复制其周围的所有其他列),我的问题是尝试将split\u string查询创建的value列提交到实际的表中,这样我就可以对它进行其他数据转换,这需要按分隔符拆分字符串
column1 name=dos文件
column1 value=example1.doc | example2.doc | example3.doc | example4.doc | example5.doc | example6.doc | example7.doc
column2 name=名称
column2 value=萨莉·安德鲁斯
column3 name=地址
column3值=42 wallaby way,syndey
column4 name=电话号码
第4列值=123-123
我的拆分字符串查询,其中包含拆分字符串查询的[output column],附加到引用表中的所有其他列:
select value as [New DOS file], [Document Export Edit].*
from [Document Export Edit]
cross apply string_split([DOS file], '|')
这个 [DOS file]
圆柱是一个巨大的 .csv style string
因此,分隔符将由 '|'
.
我尝试使用的方法:
Update [Document Export Edit]
set [New DOS File] = (select value
from [Document Export Edit]
cross apply string_split([DOS file], '|'))
GO
出现以下错误消息:
列名“new dos file”无效。
还有这个:
Update [Document Export Edit]
set [New DOS File] = replace([New DOS File],[New DOS File],
select value from [Document Export Edit]
cross apply string_split([DOS file], '|'))
出现以下错误消息:
列名“new dos file”无效。
还有这个:
Alter Table [Document Export Edit]
Add [New DOS File] NVARCHAR(max) null
Add [Test] NVARCHAR(max) null
GO
Update [Document Export Edit]
set [New DOS File] = id1,
[Test] = id2
from (
select [DOS File],
(select top 1 value as val
from string_split([DOS File], '|')
order by (row_number() over(order by 1 asc)) asc
) as id1,
(select top 1 value as val
from string_split([DOS File], '|')
order by (row_number() over(order by 1 asc)) desc
) as id2
from [Document Export Edit]
) A inner join [Document Export Edit] B
on A.[DOS File] = B.[DOS File]
出现以下错误消息:
窗口函数、聚合和函数的下一个值不支持整数索引作为order by子句表达式。
所以我试了这个:
Update [Document Export Edit]
set [New DOS File] = id1
from (
select [DOS File],
(select top 1 value as val
from string_split([DOS File], '|')
) as id1
from [Document Export Edit]
) A inner join [Document Export Edit] B
on A.[DOS File] = B.[DOS File]
结果:
它工作了,但它只是分割了分隔符的第一个示例,在另一列中复制了完全相同的内容,并忽略了字符串的其余部分。如此接近!!!我只想让它做它在第一位做的事情,并为字符串的其余部分做它,但把它放在每个分隔符示例的不同行!!
所以我去试试这个:
Update [Document Export Edit]
set [New DOS File] = id1
from (
select [DOS File],
(select top 1 value as val
from [Document Export Edit]
cross apply string_split([DOS File], '|')
) as id1
from [Document Export Edit]
) A inner join [Document Export Edit] B
on A.[DOS File] = B.[DOS File]
结果:
然后发布了整个 [New DOS file]
列刚刚复制了第一个结果。返回并查看了我的语法,然后发现我只在第一个示例上设置了变量限制。。。我的错。所以我去换了。
然后我尝试了这个:
Update [Document Export Edit]
set [New DOS File] = id1
from (
select [DOS File],
(select value as val
from [Document Export Edit]
cross apply string_split([DOS File], '|')
) as id1
from [Document Export Edit]
) A inner join [Document Export Edit] B
on A.[DOS File] = B.[DOS File]
出现以下错误消息:
子查询返回了多个值。当子查询后跟=,!=,<,<=,>,>=或者当子查询用作表达式时。
因此,这个特定的查询一次只能执行一个变量,而不能同时执行多行。
以下是我尝试过的一些链接,它们要么在我的任务中失败了,要么太复杂了,我无法理解:
将逗号分隔的字符串转换为单独的行
将sql列中的分隔值拆分为多行
将列数据拆分为多行
在多行上拆分值
用in子句更新sql server中的多行
将字符串拆分为多行,多个列成对排列
https://www.emoreau.com/entries/articles/2019/04/splitting-a-value-into-multiple-rows-in-microsoft-sql-server.aspx
我希望这是足够的信息,有人请帮助我。谢谢您。
1条答案
按热度按时间omhiaaxx1#
经过这么多小时的努力和失去希望。我漂亮的精通技术的朋友最后指出我只是语法顺序不对。
我的问题的答案是: