【问题标题】:SQL Server : Only functions and certain extended stored procedures can be executed from a functionSQL Server:只能从函数执行函数和某些扩展存储过程
【发布时间】:2020-08-02 01:27:23
【问题描述】:

我是 Oracle 专家,但不是 SQL Server,我尝试翻译我的代码以在 SQL Server 中使用。

我的 Oracle 代码:

create or replace
FUNCTION CheckAndCreateTable
(
  TBL_NAME IN VARCHAR2 ,
  STMNT in varchar2
) RETURN number AS

 Cnt Pls_Integer;

begin
 select COUNT (TABLE_NAME) into CNT from USER_TABLES where UPPER(TABLE_NAME)= UPPER(TBL_NAME);
      if (CNT = 0 )      then
          execute immediate STMNT;
          DBMS_OUTPUT.PUT_LINE ('Création de la table ' || TBL_NAME );
          return 1;
        else
           DBMS_OUTPUT.PUT_LINE ('La Table ' || TBL_NAME || ' existe déjà');
            return 0;
      End If ;
  RETURN NULL;
END CheckAndCreateTable;

我已经翻译成:

if object_id('CheckAndCreateTable', 'fn') is not null
    drop function CheckAndCreateTable;
go

CREATE FUNCTION CheckAndCreateTable
    (@TBL_NAME VARCHAR(4000),
     @STMNT varchar(4000)) 
RETURNS float 
AS
BEGIN
    DECLARE @Cnt integer;

    SELECT @CNT = COUNT(TABLE_NAME) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = @TBL_NAME ;

    IF (@Cnt = 0)      
    BEGIN
        EXECUTE sp_executesql @STMNT;

        RETURN 1;
    END
    ELSE BEGIN
        RETURN 0;
    END

    RETURN NULL;
END ;

我尝试在 SQL Server 中执行此操作:

SELECT CheckAndCreateTable('MyTable', 'select * from DUAL') 
FROM DUAL;

它可以在 SQL Developer for ORACLE 中运行,但不能在 SQL Server 中运行。

只有函数和某些扩展存储过程可以从函数中执行

我也尝试在 ORACLE 中创建程序,正常工作

create or replace
PROCEDURE STAT_CREERTABLESSTRUCT
as
    STMNT varchar2(32767 );
    RET   number;
begin
    DBMS_OUTPUT.PUT_LINE('=====================================================');
    DBMS_OUTPUT.PUT_LINE(' STAT_CREERTABLESSTRUCT ');
    STMNT := 'CREATE TABLE PcaBat
    (
        CodBat      VARCHAR2(12) NOT NULL,
        LibBat      VARCHAR2(42),
        CodEtb      VARCHAR2(12),
        Dispo       CHAR(1)
    )';

对于 SQL Server

PROCEDURE STAT_CREERTABLESSTRUCT
AS
BEGIN
    DECLARE @STMNT varchar(max);
    DECLARE @RET   float;

    SET NOCOUNT ON;

    PRINT '=====================================================';
    PRINT ' STAT_CREERTABLESSTRUCT ';

    SET @STMNT = 'CREATE TABLE PcaBat
    (
        CodBat      VARCHAR2(12) NOT NULL,
        LibBat      VARCHAR2(42),
        CodEtb      VARCHAR2(12),
        Dispo       CHAR(1)
    )';

    SET @RET =  DBO.CHECKANDCREATETABLE('PcaBat', @STMNT);

END;

但代码在 SQL Server 中不起作用:

exec STAT_CREERTABLESSTRUCT

我总是收到同样的消息错误

只有函数和某些扩展存储过程可以从函数中执行。

在 SQL Server 中,您似乎无法从函数或调用过程执行 SQL 代码...

这是真的吗?你怎么能这样做?

【问题讨论】:

  • 错误告诉你真相。您可以在函数内部使用的存储过程很少,sp_executesql 不是其中之一。您想在函数中运行动态语句的事实感觉就像是XY Problem

标签: sql-server


【解决方案1】:

在这个简单的情况下,返回值为 0 或 1(或任何整数),您也可以使用 CREATE PROCEDURE 代替 CREATE FUNCTION

过程的RETURN 语句的返回值可以使用EXEC @result = mySP 语法读取。

来自MS docs 部分“使用返回代码返回数据”:

DECLARE @result int;  
EXECUTE @result = my_proc;  

【讨论】:

    【解决方案2】:

    你好, 在 SQL Sever 中,您可以在存储过程中调用函数,但不能在函数中调用存储过程。

    Execute Stored Procedure from a Function

    谢谢, 卡利安

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2011-09-14
      • 2016-09-24
      • 2011-11-07
      • 2011-02-23
      • 2011-05-14
      • 2010-11-13
      • 2019-02-05
      相关资源
      最近更新 更多