【发布时间】:2020-06-18 06:31:11
【问题描述】:
非常新的 SQL。 我有一个查询,可以将我的列值拆分为多行。现在我需要将它提交给实际的表,而不仅仅是通过选择查询的视图。
我已经阅读了很多解决方案,但似乎没有一个有效。整个“创建拆分函数”编写所有这些复杂的变量,然后创建一个“临时表”然后“将其与值列合并回原始表”等等让我非常困惑。 谁能帮我把它放在计划和简单的格式中。对于像我这样的开发新手来说,必须有一个更简单的方法。请不要只是告诉我我做错了什么并假设我知道你在说什么(因为我知道它不起作用,我已经确定我不是这方面的专业人士),谁能告诉我我需要做些什么来完成这项工作。
我的输出视图正是我想要的,但它只是一个视图,它不会更新表...我只希望我的 Split_String 查询的 VALUE 输出将其自身插入到我的实际表中或即使我可以将表更新为看起来像我的视图查询表,或者甚至我如何从我的查询中创建一个新表,以便一个 ACTUAL 表看起来像我的查询并且不仅仅是一个视图,那也太棒了!
1 行示例表
请注意,这只是一个示例,实际表中有超过 120 列,拆分 [DOS 文件] 字符串不是我的问题(我已经通过查询拆分每个分隔符并插入多行并复制它周围的所有其他列),我的问题是尝试将 split_string 查询创建的值列提交到实际表,以便我可以对其进行其他数据转换,这需要每个分隔符拆分字符串
列 1 名称 = DOS 文件
Column1 值 = example1.doc |示例2.doc |示例3.doc |示例4.doc |示例5.doc |示例6.doc |例子7.doc
列 2 名称 = 名称
Column2 值 = Sally Andrews
列 3 名称 = 地址
Column3 值 = 42 Wallaby Way, Syndey
第 4 列名称 = 电话号码
第 4 列值 = 123-123
我的 Split_String 查询具有我的 Split_String 查询的 [输出列],附加到引用表中的所有其他列:
select value as [New DOS file], [Document Export Edit].* from [Document Export Edit] cross apply string_split([DOS file], '|')
[DOS file] 列是一个 MASSIVE .csv style string,因此分隔符将是 '|'。
我尝试过的方法:
Update [Document Export Edit] set [New DOS File] = (select value from [Document Export Edit] cross apply string_split([DOS file], '|')) GO
带有以下错误消息:
列名“新建 DOS 文件”无效。
还有这个:
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], '|'))
出现以下错误消息:
列名“新建 DOS 文件”无效。
还有这个:
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]
带有以下错误消息:
窗口函数、聚合和 NEXT VALUE FOR 函数不 支持整数索引作为 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]
带有以下错误消息:
子查询返回超过 1 个值。这是不允许的,当 子查询遵循 =、!=、、>= 或当子查询用作 一个表达式。
因此,这个特定查询似乎一次只能执行 1 个变量,而不能一次执行多行。
以下是我尝试关注的一些链接,这些链接要么在我的任务中失败,要么对我来说太复杂而无法关注:
Turning a Comma Separated string into individual rows
Splitting delimited values in a SQL column into multiple rows
Split column data into multiple rows
Split values over multiple rows
Update multiple rows in SQL Server with IN clause
Split string into multiple rows with multiple columns in paired
我希望这些信息足以让某人帮助我。谢谢。
【问题讨论】:
-
如果是 CSV,为什么不使用
bcp或BULK INSERT将其作为 CSV 导入到适当的表中?至于错误,它们非常清楚 - 该表中没有名为New DOS File的列。更改查询不会使不存在的列工作。也不需要复杂的查询。实际的表架构是什么? -
不,它是一个 Excel 导入文件,并且导入文件中的一列是一个 CSV 文件字符串,其他每一列都是普通的 Excel 数据格式。
-
在问题中添加相关信息。您不需要复杂的查询,您需要添加缺少的列并使用简单的 UPDATE。不需要前两次尝试之后的任何内容。如果您确实添加了该列,您可能只需要
update thatTable set someCol=value from thatTable cross apply string_split(otherCol,'|')。但是,如果没有表架构和一些示例数据,人们将无法通过测试替代方案来提供帮助 -
@PanagiotisKanavos 是的,我在我的帖子中也尝试过......
Update [Document Export Edit] set [New DOS File] = (select value from [Document Export Edit] cross apply string_split([DOS file], '|')) GO我收到以下错误消息:[Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.] -
或者不 - UPDATE 只更新现有列,它不会生成新列。您需要一个 INSERT 来创建新列,这意味着 a) 视图可能是一个非常 好主意,或者 b) 清理后的数据应该存储在单独的表中。您可以使用
MERGE,但这会导致每次运行该查询时出现重复的列。
标签: sql sql-server split insert-update