Sql server SQL Server 2008:如何从TSQL中加载/解析SQL脚本?

Sql server SQL Server 2008:如何从TSQL中加载/解析SQL脚本?,sql-server,tsql,sql-server-2008,Sql Server,Tsql,Sql Server 2008,从Sybase(90年代早期的greenies)开始,我就一直在使用SQL Server,这一点让我有些困惑 在Oracle和DB2中,您可以将SQL批处理或脚本传递给存储过程,以测试它是否可以被解析,然后根据结果执行条件逻辑,如下面的伪代码示例: if (TrySQLParse(LoadSQLFile(filename)) == 1 { execute logic if parse succeeds } else { execute logic if parse fails }

从Sybase(90年代早期的greenies)开始,我就一直在使用SQL Server,这一点让我有些困惑

在Oracle和DB2中,您可以将SQL批处理或脚本传递给存储过程,以测试它是否可以被解析,然后根据结果执行条件逻辑,如下面的伪代码示例:

if (TrySQLParse(LoadSQLFile(filename)) == 1
   { execute logic if parse succeeds }
else
   { execute logic if parse fails }
我正在寻找SQL Server 2008中的system proc或类似函数,而不是SHOWPLAN之类的函数,用于解析TSQL过程中的大量脚本,然后根据结果有条件地控制异常处理和脚本执行。但是,我似乎在TSQL中找不到类似的简单gizmo


有什么想法吗?

您可以调用exec(),将脚本作为字符串传递,并将其包装在Try/Catch中SQL Server中没有执行此操作的机制。您可能可以使用CLR组件和SMO来实现这一点,但为了获得可疑的收益,似乎需要做很多工作


如何将脚本包装在try/catch块中,并在catch块中执行“if fails”代码?

可能非常危险。谷歌搜索“SQL注入”并查看您的SLEF。

在执行前进行完整解析/编译的任何技术中,通常的黑客方法是在有问题的代码前加上导致执行停止的东西。例如,要检查vbscript是否通过了语法检查而没有实际运行它,我预先编写了:

Wscript.exit(1)
这样,如果有语法错误,我就会看到语法错误,如果没有语法错误,那么第一个操作就是退出脚本并忽略其余的代码

我认为sql世界中的类似情况是引发一个严重性很高的错误。如果使用severity 20+,则会终止连接,因此如果脚本中有多个批处理,则会跳过所有批处理。我无法确认是否有100.00000%的sql注入无法通过这个预先设置好的错误,但我看不到有任何可能。例如,将其粘贴在相关代码块的前面:

raiserror ('syntax checking, disregard error', 20, 1) with log
因此,此错误来自语法错误:

raiserror ('syntax checking, disregard error', 20, 1) with log
create table t1()
go
create table t2()
go
而此错误是从运行时错误中排除的(并且未创建t1/t2)

为了完善您的选项,您可以在clr实用程序(数据库外部)中引用程序集C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.SqlParser.dll,并执行以下操作:

SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1");

我真的不能说我需要这么做。在什么情况下,条件逻辑取决于脚本是否可以被解析?可解析!=可能与“SET FMTONLY”一起运行?eeehhh,与更好的CLR选项类似,EXEC打开了它可能执行的可能性,我不希望嵌套的try/catch在脚本中失败或因此出现意外行为;naah,不喜欢带有SET FMTONLY的itEXEC不会执行它-查看BOLNot生产代码,完全由ops/admin脚本I和sysdba控制使用,并且可以访问。没问题。是的,我想我要写一个CLR函数来做这个。Thx海斯泰克
SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1");