Как объявить параметр enum для хранимой процедуры - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть хранимая процедура, которая имеет несколько видов параметров, INT, VARCHAR, DateTime и т. Д. c ... Этот sp вставляет запись в таблицу журнала с параметрами, переданными в. Существуют разные таблицы журнала, три именно то, что называется, например, LogTbl1, LogTbl2 и LogTbl3. Этот sp пишет в LogTbl1, LogTbl2 или LogTbl3 в зависимости от параметра sp, который указывает, куда записывать. Я установил этот параметр как tinyint, и он принимает значения 0, 1 или 2. Затем в зависимости от переданного значения я создаю динамический запрос c для записи в соответствующую таблицу журнала, как показано ниже:

CREATE PROCEDURE [dbo].[spTraceLog] 
    @LogId int, 
    @param2 int,
    @param3 int,
    @param4 varchar(100),
    @DateSent datetime,
    @TargetTable tinyint = 0
AS
BEGIN

    DECLARE @sqlCommand nvarchar(max)
    DECLARE @tblName nvarchar(100)

    SET @tblName = CASE @TargetTable 
                     WHEN 0 THEN '[dbo].[LogTbl1]'
                     WHEN 1 THEN '[dbo].[LogTbl2]'
                     WHEN 2 THEN '[dbo].[LogTbl3]'
                     ELSE ''
                  END

    IF @tblName <> ''
    BEGIN
      SET @sqlCommand =
        'INSERT INTO ' + @tblName +
                   '([LogId]' +
                   ',[param2]' +
                   ',[param3]' +
                   ',[param4]' +
                   ',[Date]) ' +
             'VALUES' +
                   '(@LogId' +
                   ',@param2' +
                   ',@param3' +
                   ',@param4' +               
                   ',@DateSent)'

        EXECUTE sp_executesql @sqlCommand
    END
END

Так есть ли другой, более элегантный способ сделать это? Невозможно использовать перечисление в параметре sp @TargetTable?

1 Ответ

1 голос
/ 27 февраля 2020

Создание динамического c SQL и его выполнение означает, что Sql Сервер не может выполнить очень хорошую работу по созданию плана выполнения. Это может повлиять на эффективность и будет иметь наибольшее значение, если SP вызывается очень часто, что выглядит так, как если бы этот SP был.

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

Но это не отвечает на вопрос. Перечисления нет, и я не думаю, что есть проблема с типом, который вы использовали для идентификации журнала, в который вы хотите записать. Если вы хотите, чтобы код был более читабельным, вы можете разделить его на три SP и назвать их spTraceLog1, spTraceLog2 et c. и не передать в TargetTable. Я бы по возможности избежал динамику c SQL.

...