我正在使用单独的专用转换工具将导出的SQL视图作为文件转换为不同的语法。该工具无法处理某些命令和格式,因此我正在使用带有RegEx的Notepad ++来提前更改文件。
到目前为止,我已经获得了想要的结果,但是需要执行三个单独的“查找/替换”操作。 如果可能的话,我想将这三个RegEx操作减少到一个。
Find: (.*)(CREATE VIEW.*\nGO)(.*)
Replace: \2
Find: (CREATE VIEW )(.*)(\r\nAS)
Replace: \1"\2"\3
Find: (oldschema1\.|\[oldschema1\]\.|\[|\]|TOP \(100\) PERCENT|oldschema2\.)|(^GO$)|(\A^(.*?))
Replace: (?1)(?2\;)(?3SET SCHEMA schemaname\; \n\n\1)```
我使用的是Notepad ++ 7.7.1 64位,使用正则表达式搜索模式查找/替换-选中“。匹配换行符”。
您会在我的代码中看到我已经在交替使用捕获组。我以为我可以将RegEx的前两个步骤作为步骤3的附加捕获组进行组合,但是它没有用,可能是因为它们是嵌套的。
我尝试通过相应增加引用编号来引用嵌套组,但是它不起作用(将结果空白)。
这是示例SQL视图文件。这不是可行的视图,因为我添加了“ oldschema2”,因此RegEx可以为其中的一种替代品找到一些东西,但这在这里仅作为示例。
garbage
text
beforehand
CREATE VIEW [oldschema1].[viewname]
AS
SELECT DISTINCT
TOP (100) PERCENT oldschema1.TABLENAME.FIELD1, oldschema1.TABLENAME.FIELD2
FROM oldschema1.TABLENAME
WHERE (oldschema1.TABLENAME.FIELD3 = N'Z003') AND oldschema2.TABLENAME.FIELD2 = 1
ORDER BY oldschema1.TABLENAME.FIELD1
GO
garbage
text
after
以下是我每次尝试要实现的目标的其他一些细节。
Notepad ++ RegEx步骤1-将视图块从CREATE VIEW转到GO
查找:
(.*)(CREATE VIEW.*\nGO)(.*)
替换:
\2
第2步-在视图名称周围加上引号
查找:
(CREATE VIEW )(.*)(\r\nAS)
替换:
\1"\2"\3
第3步-删除/替换各种文本,并在文件开头插入一行
查找:
(oldschema1\.|\[oldschema1\]\.|\[|\]|TOP \(100\) PERCENT|oldschema2\.)|(^GO$)|(\A^(.*?))
替换:
(?1)(?2\;)(?3SET SCHEMA schemaname\; \n\n\1)
以上示例的预期输出为:
SET SCHEMA schemaname;
CREATE VIEW "viewname"
AS
SELECT DISTINCT
TABLENAME.FIELD1, TABLENAME.FIELD2
FROM TABLENAME
WHERE (TABLENAME.FIELD3 = N'Z003') AND TABLENAME.FIELD2 = 1
ORDER BY TABLENAME.FIELD1
;
我可以通过上述三个步骤来实现,但是如果可能的话,我想一次查找/替换。
对于RegEx和StackOverflow,我还是一个新手。非常感谢您的帮助。
答案 0 :(得分:-1)
我不太确定,但是我猜测也许我们想要一个类似于以下内容的表达式:
[\s\S]*?(CREATE VIEW[\s\S]*GO\s*)[\s\S]*
要用$1
替换,其中我们所需的数据在此捕获组中:
(CREATE VIEW[\s\S]*GO\s*)
我们甚至可以删除\s*
:
(CREATE VIEW[\s\S]*GO)
然后尝试:
[\s\S]*?(CREATE VIEW[\s\S]*GO)[\s\S]*
,带有m
标志。
如果您有兴趣,可以在this demo的右侧面板中进一步解释该表达式。
我们可以尝试:
(CREATE VIEW)(.*)
并替换为:
SET SCHEMA schemaname;\n\n$1 "viewname"
此步骤可能使用类似于以下内容的表达式完成:
TOP \(100\) PERCENT |oldschema1\.
被替换为空字符串。
\s*GO
被\n;
或;
取代,我们可能有所需的输出,尽管不确定。