You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:33:28