Log functie Parameters in Sql Server

Ik heb een controlebeperking voor een tabel die een functie oproept om een ​​voorwaarde te evalueren. Wanneer ik direct een functie aanroep, retourneert het me waar voor de dummy-waarden.

Wanneer ik een insert-instructie voer, controleer voorwaarde constraint retourneert me false voor dezelfde waarden die ik heb gebruikt bij het rechtstreeks aanroepen van een functie.

Om het verder te controleren, wil ik de gegevens loggen die door controlebeperking zijn verzonden (op insert statement) naar de SQL-functie.

Zal SQL Profiler me in dit geval helpen?

Hier is de functiecode (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  

Tafelstructuur

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
Laat me de code zien!
toegevoegd de auteur Clint Good, de bron
@ClintGood: Ik heb de functie en de broncode toegevoegd
toegevoegd de auteur Kunal Uppal, de bron

1 antwoord

Het probleem is dat de controlebeperking wordt geëvalueerd nadat de record is ingevoegd, waardoor de retourwaarde van de functie wordt gewijzigd omdat deze zelfreferent is. Zoals het is ingesteld, is het onmogelijk om records in de tabel in te voegen als u een lege tabel hebt.

Dit komt omdat een record eenmaal is ingevoegd

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

zal nooit waar zijn. En bij het eerste invoegen voor een bepaalde werknemer

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

kan nooit waar zijn, want er is geen ander record voor die medewerker. Tenslotte

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

kan alleen waar zijn als er al dagen afwezig zijn in de tabel. Als u niet meer dan één record voor een werknemer kunt invoegen omdat de eerste twee voorwaarden niet waar kunnen zijn, kan de derde voorwaarde nooit worden ingevoerd.

Misschien wilt u de (zojuist ingevoegde) afwezige dag uitsluiten van de eerste voorwaarde

NOT EXISTS (
  SELECT * 
  FROM absenteeism 
  WHERE  EMP_ID = @emp_ID 
    AND Absent_Date <> @leaveDate)
1
toegevoegd
Is het zo ... Controleer Constraint voegt eerst een rij in, evalueert de voorwaarde en vervolgens terugdraaien als voorwaarde vals was?
toegevoegd de auteur Kunal Uppal, de bron
Bedankt Clint! dat werkt.
toegevoegd de auteur Kunal Uppal, de bron