能否通过Service Layer在B1数据库创建SQL函数及存储过程?
问题
在DI API中可通过Recordset对象直接执行SQL查询操作,但尝试通过Service Layer的SQLQueries接口提交CREATE FUNCTION语句时失败。
提交的请求体:
{"SqlCode":"sql05","SqlName":"UserQuerySQLSP","SqlText":"create function [dbo].[TO_POParse] \r\n(@POString varchar(50), @FieldNeeded varchar(10))\r\nReturns int\r\nas\r\n\r\nbegin\r\nDECLARE @Number int\r\nif @FieldNeeded = 'DocNum'\r\nbegin \r\nset @Number = LEFT(@POString, CHARINDEX ('-', @POString)-1)\r\nend\r\nif @FieldNeeded = 'LineNum'\r\nbegin \r\nset @Number = replace(substring(@POString, CHARINDEX ('(', @POString)+1,3),')','') \r\nend\r\nif @FieldNeeded = 'Segment'\r\nset @Number = substring(@POString, CHARINDEX ('-', @POString)+1,1) \r\nreturn @Number \r\nend \r\nGO\r\n"}
请求地址:
https://<myservername>:50000/b1s/v1/SQLQueries
收到的错误响应:
{ "error" : { "code" : 701, "message" : { "lang" : "en-us", "value" : "Invalid SQL syntax:, line 1, character position 0, mismatched input 'create' expecting {SELECT, '('}" } } }
请问是否有方法或变通方案可通过Service Layer执行CREATE、ALTER类SQL命令?
解决方案
Service Layer的SQLQueries接口仅支持SELECT类查询语句,无法直接执行DDL(如CREATE、ALTER)或DML(如INSERT、UPDATE)语句,这是SAP Business One的设计限制。以下是可行的变通方案:
继续使用DI API执行DDL操作
既然DI API的Recordset对象支持直接执行SQL,可保留这部分逻辑专门处理函数、存储过程的创建/修改,Service Layer专注于业务数据交互。通过自定义REST服务中转
在服务器上部署一个简单的自定义REST服务,该服务直接连接到B1数据库执行DDL语句,然后在业务逻辑中调用这个自定义服务来创建函数或存储过程。注意要做好权限控制和安全校验,避免SQL注入风险。使用数据库端定时任务或脚本
预先在数据库中通过SSMS等工具创建好所需的函数、存储过程,或者编写SQL脚本在数据库维护时段执行,避免通过应用层动态创建。
内容的提问来源于stack exchange,提问作者Deepesh G
相关产品推荐
相关产品推荐

