2012-03-29 114 views
5

我需要将电子表格中的数据转换为SQL中的插入语句。我已经制定了大部分使用SSMS中的查找和替换工具的正则表达式,但是当我试图引用最终替换中的第9个加括号的项时遇到了一个问题。SQL查找和替换正则表达式捕获组限制?

这里是原始记录:

Blue Doe 12/21/1967 1126 Queens Highway Torrance CA 90802 N 1/1/2012 

这就是我需要的东西(现在):

select 'Blue','Doe','19671221','1126 Queens Highway','Torrance','CA','90802','N','20120101' 

由于限制在允许的括号内的项目数量我必须贯穿更换三次。如果我可以首先将其作为POC进行操作,那么这可能会用到存储过程中。

这是第一个匹配的表达式:

^{:w:b:w:b}{:z}/{:z}/{:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}{:z}/{:z}/{:z} 

而更换:\10\2/0\3/\40\5/0\6/\7

这增加了零的月份和日期,使他们至少有两个字符。

下一个匹配将日期重新格式化为查询所需的格式(没有关于不使用日期字段的注释,这是数据库的客户端要求)。

匹配的表达式:

^{:w:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z}{:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b}[0-9]*{[0-9]^2}/[0-9]*{[0-9]^2}/{:z} 

而更换:\1\4\(2,2)\(2,3)\5\8\(2,6)\(2,7)

最后,最后一场比赛将插入到结果将在INSERT语句习惯的SQL语句。

匹配的表达式:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b{:z} 

而更换:select '\1','\2','\3','\4','\5','\6','\7','\8','\9'

它除了最后更换所有的作品。出于某种原因,\ 9没有从比赛中获取数据。如果我只用\ 9替换整个替换表达式,我会得到一个空格。如果我使用\ 8,我得到N.如果我消除第8个括号内的项目,从而使我的第9项第8,它返回我想要的,20120101.

所以我的问题是,SSMS/SQL是否允许9标记使用查找/替换和正则表达式时的表达式?或者我在这里错过了什么?我知道还有其他方法可以做到这一点。我只是试图在将其转换为存档或应用程序之前尽快将其作为POC完成。

感谢您的任何帮助。 -Peter

+0

您可以直接从电子表格导入。数据是否已经在单独的列中? – RedFilter 2012-03-29 17:37:11

+0

为什么你需要使用替换?如果数据来自电子表格并且您正在使用SSMS,为什么不使用导入/导出管理器?另外,为什么重新格式化数据,电子表格不支持mm/dd/yyyy日期格式?难道你不能写一些单元格公式来连接一个插入数据的字符串吗? – Trisped 2012-03-29 17:40:52

+0

请编辑您的问题以添加适当格式的代码表达式。你可以这样做:围绕反引号(“'”),全选并单击工具栏按钮'{}',或者标记一段代码并按下Ctrl + K。您可以在输入时立即在“提交问题”按钮下方预览帖子(发布之前);预览实时更新,所以这是一个所见即所得的视图。正确格式化使您的问题更易于阅读和理解,因此使您更有可能得到答案。谢谢。 :) – 2012-03-29 17:44:12

回答

2

您的匹配表达式都不符合您在MS SQL Server Management Studio 2008r2中提供的记录。

从您的描述中,听起来好像标记表达式9存在问题,因为使用标记表达式8而不是9时会返回所需结果。您可能需要ask Microsoft or report it as a bug

更快的解决方案是将您在SSMS中执行查找/替换的文本移动到电子表格并使用单元格公式将数据解析为插入命令。如果你有MS Excel,CONCATENATE,FIND和MID功能可能会有用。此外,它有助于将值分成自己的列,以便可以格式化日期,然后使用一个连接来构建插入。

请让我知道,如果你需要一个例子。

更新:我在MS SQL Server Management Studio 2008r2,Visual Studio 2005和Visual Studio 2010中尝试了您的示例,得到的结果相同,\ 9返回空字符串。检查一下我发现others are also having this issue(查看来自Henrique Evaristo的社区内容),并且整个系统一直是replaced in the new editors

因此,在回答您的问题时,由于错误,SSMS不支持9个标记的表达式。

如果您无法使用电子表格的想法,您可以尝试将操作分成两部分,设置前8个值,然后再次摆动回去做最后一个。例如:

^{:w}:b{:w}:b{:z}:b{[0-9A-Za-z:b]+}:b{:w}:b{[A-Z]+}:b{:z}:b{:w}:b:z 
select '\1','\2','\3','\4','\5','\6','\7','\8','\0' 

:w:b:w:b:z:b[0-9A-Za-z:b]+:b:w:b[A-Z]+:b:z:b:w:b{:z} 
\1 
+0

感谢您的回复。我认为他们不适合你的原因是他们被粘贴到SO中的方式存在问题。我已经更新了原始文本,以反映从SQL粘贴到SO时出现的每个项目之间的“单数空间”。 – 2012-03-29 20:45:25

+0

@Peter Anderson更新了结果。我会切换到Excel或编写自己的解决方案,但我提供了一个以防万一您需要。您可能希望在'\ 0'前添加一个特殊字符,因为您将不再能够按行搜索。或者,您可以更改第二个查询以在select中找到'\ 0'并从那里开始工作。 – Trisped 2012-03-29 22:45:05

+0

感谢您对此的回答。这就是我需要的。并感谢最后的额外选项。我已经把这个事情分成了三次来处理各种替换,我没有想到只是使用\ 0并在第四次替换时留下最后一位。再次感谢。 – 2012-03-30 15:59:53