【问题标题】:SQL Server 2008: How to load/parse a SQL script from within TSQL?SQL Server 2008:如何从 TSQL 中加载/解析 SQL 脚本?
【发布时间】:2009-06-05 15:25:52
【问题描述】:

自从它是 Sybase 以来就一直在使用 SQL Server(90 年代初期的新手),我对这个有点难过。

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

if (TrySQLParse(LoadSQLFile(filename)) == 1
   { execute logic if parse succeeds }
else
   { execute logic if parse fails }

我正在寻找 SQL Server 2008 中的系统 proc 或类似函数(而不是 SHOWPLAN 等)来解析 TSQL 过程中的大量脚本,然后有条件地控制异常处理和脚本执行结果。但是,我似乎在 TSQL 中找不到类似的简单小工具。

有什么想法吗?

【问题讨论】:

  • 我真的不能说我曾经需要这样做。在什么情况下,条件逻辑取决于是否可以解析脚本?可解析!= 可运行

标签: sql-server tsql sql-server-2008


【解决方案1】:

在执行前进行完整解析/编译的任何技术中,执行此操作的通用方法是在有问题的代码前面加上导致执行停止的内容。例如,要检查一个 vbscript 是否通过语法检查而不实际运行它,我在前面加上:

Wscript.exit(1)

这样我会看到语法错误,如果有的话,或者如果没有,那么第一个操作是退出脚本并忽略其余代码。

我认为 sql 世界中的类比是引发高严重性错误。如果您使用严重性 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)

raiserror ('syntax checking, disregard error', 20, 1) with log
create table t1(i int)
go
create table t2( i int)
go

为了完善您的选择,您可以在 clr 实用程序中引用程序集 C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.SqlParser.dll db) 并且喜欢:

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

【讨论】:

  • 是的,我想我要编写一个 CLR 函数来执行此操作。谢谢海恩斯科技
【解决方案2】:

您可以调用 exec(),将脚本作为字符串传入并将其包装在 Try/Catch 中

【讨论】:

  • 可能和'SET FMTONLY'一起?
  • eeehhh,像 CLR 选项更好,EXEC 开启了它可能执行我不想要的可能性
  • 或脚本中的嵌套 try/catch 失败或结果异常;不,不喜欢它
  • EXEC with SET FMTONLY 不会执行它 - 看看 BOL
【解决方案3】:

SQL Server 中没有执行此操作的机制。您可能可以使用 CLR 组件和 SMO 来完成此操作,但似乎需要做很多工作才能获得可疑的收益。

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

【讨论】:

    【解决方案4】:

    可能非常危险。谷歌上“SQL 注入”你自己看看。

    【讨论】:

    • 不在生产代码中,完全由我和 sysdba 控制并有权访问的 ops/admin 脚本使用。非问题。
    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多