【发布时间】:2023-03-08 00:20:01
【问题描述】:
抱歉,我不知道如何描述这个问题的措辞不佳。我想遍历表中的每一行,并在这样做的同时提取一列,解析其中的 varchar,并根据它找到的内容将行插入另一个表。类似这样的东西:
DECLARE @string varchar(max);
foreach row in (select * from Table) {
set @string = row[column];
while (len(@string) > 0) {
-- Do all the parsing in here
if (found what was looking for)
insert into Table2 values(row[column2], row[column3]);
}
}
如果这是一个存储过程,那么它可以在 SQL 中完成,这将是非常好的。我只是不太确定如何处理它。谢谢。
编辑:
这基本上是我希望的功能:
Table 1 |
id_number | text |
1 Hello, test 532. Yay oh and test 111
2 test 932.
3 This is a test 315 of stuff test 555.
4 haflksdhfal test 311 sadjhfalsd
5 Yay.
我想通过此表并解析所有文本列以查找“test #”的实例,其中 # 是一个数字。当它在该格式的文本中找到某些内容时,它将将该值插入到另一个表中,例如:
Table 2 |
id_number | number
1 532
1 111
2 932
3 315
3 555
4 311
【问题讨论】:
-
+1:感谢更新 - 我可以看到正则表达式非常有用,但 SQL Server 没有原生正则表达式支持(PATINDEX 支持有限)。要获得正则表达式支持,SQL Server 2005+ 要求您使用 CLR 函数/过程。从单行中提取多个值并不好,但使用游标会很痛苦——你必须知道你所在的行,如果是第 1 行和第 3 行——你离开的地方。
-
数字是3位数吗?
-
@OMG Ponies - 不,它们可以是任意数字,甚至不必采用那种格式,它们可以是 test - 5162 test 350 test as392 我想通过并尝试如果我找到测试,然后尝试在附近提取一个数字,所以如果有错误输入,它足够聪明地找到它。我可以在 C# 中很好地做到这一点,这正是我现在正在使用的,但最好让一个存储过程来完成所有这些工作。
-
您使用的是什么版本的 SQL Server?
-
这样的问题通常表明您需要更好的数据结构设计。如果您有一个名为 test 的相关表,并将其中的值与原始表的 FK 一起存储,那么查询起来会容易得多。现在,如果您收到这样的数据,我可以看到使用所描述的技术将其解析为正确的规范化设计。否则,请修复您的设计。此外,在数据库中,通过交互来解决问题通常不是一个好主意。数据库在数据集上工作得最好,迭代一次只工作一行,因此通常是最慢的解决方案。
标签: sql sql-server tsql stored-procedures parsing