如何 create/drop 在 SQL 服务器中的存储过程中运行

How to create/drop function within stored procedure in SQL Server

我创建了一个存储过程,我在其中循环遍历数据并根据数据插入记录。插入的格式相同,但数据略有变化。

决策是通过 IF/ELSE 语句处理的,我有十几个 INSERT 查询(每个决策一个)。

我想将 INSERT 放入一个函数中,我可以用变化的变量调用它。

我想在存储过程的开头创建函数,然后 DROP 在最后创建它。

USE [DB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[DataParser]
AS
    CREATE FUNCTION [dbo].[InsertFunc]
        (@Number VARCHAR(40),
         @Line_No INT,
         @Topic VARCHAR(30),
         @Note VARCHAR(4099),
         @Bool VARCHAR(1))
    RETURNS bit
    AS
    BEGIN
        INSERT INTO Processing (Number, Line_No, Topic, Note, Activation_Date, Mandatory)
        VALUES (@Number, @Line_No, @Topic, @Note,
                CONVERT(VARCHAR(8), GETDATE(), 1), @Mandatory)

        RETURN @@ROWCOUNT
    END
    ...
    ...
    Decision tree
    ...
    ...
    InsertFunc(@oid, @lidCounter, 'StrVal1', @strVar2, 'Y')

现在它不会让我保存存储过程,如果我尝试在存储过程之外创建函数,我会收到以下错误:

Msg 443, Level 16, State 15, Procedure DataParser, Line 12 [Batch Start Line 23]
Invalid use of a side-effecting operator 'INSERT' within a function.

感谢任何帮助。

简短的回答是,在 SQL 服务器中,您不能在函数内执行插入/更新/删除操作。

虽然我不推荐动态创建和删除存储过程的方法,但如果您尝试使用创建存储过程而不是函数的方法,它应该可以工作。

以下存储过程可能对您有所帮助。

创建Table #Temp ( 数字 varchar(40), Line_No 智力, 主题 VARCHAR(30), 注意 VARCHAR(4099), 布尔 VARCHAR(1), Activation_Date 日期时间, 强制 varchar(10) )

CREATE procedure [dbo].[InsertDataIntoTable]
    (@Number VARCHAR(40),
     @Line_No INT,
     @Topic VARCHAR(30),
     @Note VARCHAR(4099),
     @Bool VARCHAR(1),
     @Mandatory varchar(4))

AS
BEGIN
    INSERT INTO #Temp (Number, Line_No, Topic, Note, Activation_Date, Mandatory)
    VALUES (@Number, @Line_No, @Topic, @Note,
            CONVERT(VARCHAR(8), GETDATE(), 1), @Mandatory)


END