Как создать / удалить функцию внутри хранимой процедуры в SQL Server - PullRequest
0 голосов
/ 25 января 2019

Я создал хранимую процедуру, в которой я перебираю данные и вставляю записи на основе данных. Вставки имеют тот же формат, но данные немного изменяются.

Принятие решений осуществляется с помощью операторов 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')

Прямо сейчас это не позволит мне сохранить хранимую процедуру, и если я попытаюсь создать функцию вне хранимой процедуры, я получу следующую ошибку:

Сообщение 443, Уровень 16, Состояние 15, Обработчик данных процедуры, Строка 12 [Строка 23 запуска партии]
Неправильное использование побочного эффекта оператора INSERT внутри функции.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Ниже приведена хранимая процедура, которая может вам помочь.

Создать таблицу #Temp (Number varchar (40), Line_No INT, Topic VARCHAR (30), Note VARCHAR (4099), Bool VARCHAR (1),Activation_Date datetime, Обязательный 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
0 голосов
/ 25 января 2019

Краткий ответ: в SQL Server нельзя выполнять действия INSERT / UPDATE / DELETE внутри функции.

Хотя я не рекомендую подход, при котором вы динамически создаете и удаляете хранимые процедуры, если выпопробуйте создать хранимую процедуру вместо функции, которая должна работать.

...