【发布时间】:2023-04-10 14:06:02
【问题描述】:
我需要找到一种 T-SQL 方法来从我从 .sql 文件中读取的脚本中删除 GO 命令。我正在使用类似于这种方法Execute SQL scripts from file,它非常适合我的需求,但是一些文件包含 GO 命令并中断执行,因为sp_executesql 不处理非 T-SQL 命令。
如何创建一个 REPLACE 来删除 GO,它主要是单独坐在一排?或者我可以在这里应用的任何其他方法?请记住,脚本中可能还有其他 GO,它们实际上不是命令。
DECLARE @sql NVARCHAR(1000) =
'DECLARE @table AS TABLE(
[Id] INT,
[Info] NVARCHAR(100)
);
INSERT INTO @table
([Id],[Info])
VALUES
(1,''Info''),
(2,''Show must go on''),
(3,''GO'');
SELECT * FROM @table;
GO';
PRINT @sql;
EXEC sp_executesql @sql;
由于服务器安全限制,不能使用xp_cmdshell 执行脚本。 SQLCMD 这次也不是一个选项。
【问题讨论】:
-
我认为真正的问题是您试图使用
sys.sp_executesql来替代sqlcmd之类的东西。删除GOs 很容易成为一项重大更改。 -
试图区分字符串文字和保留关键字是一个棘手的问题,它将依赖于大量的文本解析。在 SQL Server 之外编辑脚本文件的可行性是什么?
-
作为棺材上的另一个钉子,T-SQL 是一种用于字符串操作的糟糕语言。您需要解析批次,然后在适当的地方删除
GOs。老实说,这对语言来说是一项不可能完成的任务。 -
如果您需要以编程方式执行带有 GO 批处理终止符的脚本,请考虑使用符合 this answer 的 SMO API。 T-SQL 不是解析脚本的正确工具。
-
如何将命令从文件中获取到 T-SQL 变量中?
标签: sql-server tsql