Параметры функции журнала в Sql Server - PullRequest
1 голос
/ 07 декабря 2011

У меня есть ограничение Check для таблицы, которая вызывает функцию для оценки условия.Когда я напрямую вызываю функцию, она возвращает мне true для фиктивных значений.

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

Чтобы проверить это дальше, я хочу регистрировать данные, отправленные проверкойограничение (на оператор вставки) для функции SQL.

Поможет ли мне в этом случае SQL Profiler?

Вот код функции (T-SQL)

CREATE FUNCTION [dbo].[fn_CheckLeaveContinuation] (@emp_Id        INT,
                                                   @leaveDate     DATETIME,
                                                   @severityPoint INT)
RETURNS BIT
AS
  BEGIN
      --For the given  emp_id and the leave date, check if the given employee 
      -- has already taken a leave on the previous day. Leaves in continuation 
      -- should have severity point as Zero else return false
      DECLARE @isLeaveContinued BIT;

      --if it's a first leave of the employee then return true 
      SELECT @isLeaveContinued= 
            CASE
               WHEN NOT EXISTS (SELECT *
                                FROM   absenteeism
                                WHERE  EMP_ID = @emp_ID)
                    OR EXISTS (SELECT *
                               FROM   absenteeism
                               WHERE  DateDiff(DAY, @leaveDate, Absent_Date) = -1
                                       AND EMP_ID = @emp_ID)
                        AND @severityPoint = 0
                    OR EXISTS (SELECT *
                               FROM   Absenteeism
                               WHERE  DateDiff(DAY, @leaveDate, Absent_Date) < -1
                               )
             THEN
               'true'
               ELSE 'false'
             END

      RETURN @isLeaveContinued
  END  

Структура таблицы

CREATE TABLE [dbo].[Absenteeism](
    [EMP_ID] [int] NOT NULL,
    [Absent_date] [datetime] NOT NULL,
    [Reason_code] [char](40) NOT NULL,
    [Severity_Points] [int] NOT NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Absenteeism]  WITH CHECK ADD  CONSTRAINT [chk_Leave_Continuation] CHECK  (([dbo].[fn_CheckLeaveContinuation]([Emp_ID],[Absent_date],[Severity_Points])='true'))
GO
ALTER TABLE [dbo].[Absenteeism] CHECK CONSTRAINT [chk_Leave_Continuation]
GO
ALTER TABLE [dbo].[Absenteeism]  WITH CHECK ADD CHECK  (([severity_points]>=(0) AND [severity_points]<=(4)))

1 Ответ

1 голос
/ 07 декабря 2011

Проблема заключается в том, что проверочное ограничение оценивается после вставки записи, что изменяет возвращаемое значение функции, поскольку оно является самоссылочным. Как это настроено, если у вас пустая таблица, невозможно вставить в нее какие-либо записи.

Это потому, что после вставки записи

NOT EXISTS (SELECT * FROM absenteeism WHERE  EMP_ID = @emp_ID)

никогда не будет правдой. И при первой вставке для конкретного сотрудника

EXISTS (
  SELECT * 
  FROM absenteeism2
  WHERE  DateDiff(DAY, @leaveDate, Absent_Date) = -1
    AND EMP_ID = @emp_ID)

никогда не может быть правдой, поскольку для этого сотрудника нет других записей. Наконец

EXISTS (
  SELECT *
  FROM Absenteeism2
  WHERE DateDiff(DAY, @leaveDate, Absent_Date) < -1
)

может быть истинным, только если в таблице уже отсутствуют дни, предшествующие. Если вы не можете вставить более одной записи для сотрудника, потому что первые два условия не могут быть истинными, третье условие никогда не может вступить в действие.

Возможно, вы хотите исключить (только что вставленный) отсутствующий день из первого условия

NOT EXISTS (
  SELECT * 
  FROM absenteeism 
  WHERE  EMP_ID = @emp_ID 
    AND Absent_Date <> @leaveDate)
...