我在使用正则表达式方面遇到了问题我是专门为处理从SQL Server 2012到2008年的迁移而开发的。如果您之前已完成此过程,则表示您可以&#39 ; t使用SSIS复制Timestamp列,否则您将收到错误消息。为了解决这个问题,我开发了一个正则表达式来注释掉目标数据库的所有时间戳列,然后SSIS工作正常。
现在我正在尝试开发一个正则表达式,将所有时间戳列收集到一个脚本中,以便我可以添加之前遗漏的所有缺失列(超过200个)。以下是文件中的示例代码:
/****** Object: Table [dbo].[PNotice] Script Date: 7/27/2015 10:30:32 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[PNotice](
[NoticeID] [int] NOT NULL,
[NoticeText] [varchar](max) NOT NULL,
-- [TimeStamp] [timestamp] NOT NULL,
CONSTRAINT [PK_PNotice_NoticeID] PRIMARY KEY CLUSTERED
(
[NoticeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[UpdateType] Script Date: 7/27/2015 10:30:32 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UpdateType](
[ItemType] [int] NOT NULL,
[ItemDescripton] [varchar](50) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
此示例文件显示两个表,一个表带有时间戳列,另一个表没有。所以我编写了一个正则表达式来匹配整个CREATE TABLE子句,仅适用于带有注释时间戳列的表。正则表达式似乎工作了一段时间,然后在主脚本中的某个点它突然匹配整个文件,好像它超时或达到一些内部限制:
展开:
^CREATE TABLE ([^(]+)\(
(?:
[^-()]|\n|
(?:
\(
(?:
[^()]|\n
)+
\)
)
)+
--\s+\[([^\]]+)\] \[timestamp\]
(?:
[^-()]|\n|
(?:
\(
(?:
[^()]|\n
)+
\)
)
)+
\) ON \[PRIMARY\](?: TEXTIMAGE_ON \[PRIMARY\])?$
单一表达:
^CREATE TABLE ([^(]+)\((?:[^-()]|\n|(?:\((?:[^()]|\n)+\)))+--\s+\[([^\]]+)\] \[timestamp\](?:[^-()]|\n|(?:\((?:[^()]|\n)+\)))+\) ON \[PRIMARY\](?: TEXTIMAGE_ON \[PRIMARY\])?$
我们的想法是找到CREATE TABLE,然后找到表名,然后找到所有内容,直到找到最后的右括号。由于CREATE TABLE子句中经常存在带括号的子表达式,因此我加入了处理。最后,我想确保时间戳列存在,因此我复制了我的整个匹配表达式,以便在timestamp列之前和之后匹配内容。
以下是一个在线示例,演示了它的工作原理:http://regexr.com/3bfns。这个最终版本效果很好......直到在文件中的某个时刻它才会爆炸而没有任何解释。以下是另一个演示问题的SQL示例:http://pastebin.com/JtGh6tfM。 (警告:如果您尝试将其粘贴到regexr测试器中,它可能会锁定您的浏览器。在Notepad ++中尝试查看我正在讨论的问题,它运行大约10秒,然后只是突出显示整个文件)。 / p>
我不确定我的正则表达式是否太复杂,或者NotePad ++正则表达式匹配器是否内置了一些超时,或者我的正则表达式中是否存在某些错误?如何才能使它更高效,以便它可以处理一个非常大的文件,而不会出现这样的问题?
答案 0 :(得分:0)
如果我理解你,你只需要表名和时间戳。我削减了你自己的正则表达式,并对其进行了一些修改。尝试这个,让我知道如果这个也冻结或运行良好。
^CREATE TABLE ([^(]+)\([^\-]+--\s+\[([^\]]+)(?=\] \[timestamp\])