【问题标题】:Parse a SQL statement in SQL Server to check syntax validity - Similar to dbms_sql.parse in Oracle在 SQL Server 中解析 SQL 语句以检查语法有效性 - 类似于 Oracle 中的 dbms_sql.parse
【发布时间】:2020-12-19 08:20:11
【问题描述】:

我有一个项目的需求,其中一些用户在表中插入一些表达式,稍后将添加到选择语句中以运行查询。在最终工具中运行查询本身之前,我需要使用一个函数来检查语句的有效性。基本上,我需要解析语句来检查表达式的有效性。数据库是 SQL Server 2014。

我知道如何使用这段代码在 Oracle 中做到这一点:

甲骨文

create or replace function check_sql( p_sql in CLOB ) return boolean
authid current_user
is
v_cur int;
begin
v_cur:= dbms_sql.open_cursor();
dbms_sql.parse(v_cur,p_sql,dbms_sql.native);
dbms_sql.close_cursor(v_cur);
return true;
exception
when others then
return false;
end;
/

SQL> set serveroutput on size unlimited
SQL> declare
v_result varchar2(20);
is_ok boolean;
begin
  is_ok := check_sql ( 'select 1 from dual' ) ;
  if is_ok
  then 
    v_result := 'OK' ;
  else
    v_result := 'ERROR' ;
  end if;
  dbms_output.put_line(v_result);
end;
/

OK

SQL> set serveroutput on size unlimited
SQL> declare
v_result varchar2(20);
is_ok boolean;
begin
  is_ok := check_sql ( 'select 1 from duala' ) ;
  if is_ok
  then 
    v_result := 'OK' ;
  else
    v_result := 'ERROR' ;
  end if;
  dbms_output.put_line(v_result);
end;
/

ERROR

如果可能的话,谁能告诉我如何在 Transact SQL 中做类似的事情?

感谢您的帮助

【问题讨论】:

标签: sql-server oracle tsql plsql


【解决方案1】:

sp_prepare 和 sp_unprepare 的组合怎么样:

声明@P1 INT; DECLARE @Cmd NVARCHAR(200) = N'SELECT database_id, name FROM sys.databases' 开始尝试 执行 sp_prepare @P1 输出,NULL,@Cmd; 执行 sp_unprepare @P1 打印不正确 结束尝试 开始捕捉 选择 ERROR_NUMBER() 作为错误编号 ,ERROR_MESSAGE() 作为错误消息; 打印 N'INCORRECT' 结束捕获

不正确的语句会抛出异常

声明@P1 INT; DECLARE @Cmd NVARCHAR(200) = N'SELECT database_id, name FROM sys.databases2' 开始尝试 执行 sp_prepare @P1 输出,NULL,@Cmd; 执行 sp_unprepare @P1 打印不正确 结束尝试 开始捕捉 选择 ERROR_NUMBER() 作为错误编号 ,ERROR_MESSAGE() 作为错误消息; 打印 N'INCORRECT' 结束捕获

【讨论】:

  • 感谢您的回答。如何将此添加到接受表名作为输入参数的事务处理 sql 中的过程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 2018-09-23
  • 2013-02-28
  • 1970-01-01
  • 2019-04-21
  • 2015-10-30
相关资源
最近更新 更多