2017-03-14 5 views
0

Ich bekomme eine seltsame Art von Fehler. Ich sage komisch, weil ich nicht verstehe, warum ich diesen Fehler bekomme. Ich nehme an, es gibt Syntaxfehler, aber ich verstehe nicht genau, was der Fehler ist, da es richtig aussieht.Ungültiger Spaltenname 'Filter' Fehler in SQL Server

Fehler, den ich bekomme, ist in einer SQL Server-Prozedur, die ich erstellt habe. In der folgenden Prozedur bekomme ich einen Fehler speziell im unteren Teil.

INSERT INTO agentids (filter, agentid) 
    SELECT 
     filter 
     ,agentid 
    FROM selected_agents sa 
    WHERE sa.agentname = @p_agentname 
    AND sa.agentloginid = @p_agentloginid; 

Wenn ich das oben Insert Statement entfernen, ich bin in der Lage, das Verfahren zu kompilieren. Ich verstehe, dass Filter variabel SQL Server in-Build aber ich habe es an anderen Stellen in dem Verfahren verwendet und führt sie richtig, wenn ich den Insert Statement Teil

Update-Hinweis entfernen: ich dies früher vermissten erwähnen, aber wenn ich diese Prozedur ausführen, wie es "Master" Datenbank ist, wird es erfolgreich kompiliert.

CREATE PROCEDURE [dbo].[getAgentLogActivity] @p_agentname NVARCHAR(50), 
       @p_agentloginid NVARCHAR(50), 
       @p_startTime DATETIME, 
       @p_endTime DATETIME    
AS 
BEGIN 

    DECLARE @l_event_login  SMALLINT 
    DECLARE @l_event_logout  SMALLINT 
    DECLARE @l_eventtype   SMALLINT 
    DECLARE @l_reasoncode  SMALLINT 
    DECLARE @l_agentid   INT 
    DECLARE @l_eventdatetime DATETIME 
    DECLARE @l_filter   BIT 
    DECLARE @l_mineventdatetime  DATETIME 
    DECLARE @l_maxeventdatetime  DATETIME 
    DECLARE @SWV_cursor_var1 CURSOR 

    SET @l_event_login = 1 
    SET @l_event_logout = 7 

    DELETE FROM agentids 

    INSERT INTO agentids (filter, agentid) 
     SELECT 
      filter 
      ,agentid 
     FROM selected_agents sa 
     WHERE sa.agentname = @p_agentname 
     AND sa.agentloginid = @p_agentloginid; 

    DELETE FROM temp_asdr1 

    INSERT INTO temp_asdr1(agentid, eventtype, eventdatetime, reasoncode) 
     SELECT 
      asdr.agentid 
      ,asdr.eventtype 
      ,asdr.eventdatetime 
      ,asdr.reasoncode 
     FROM 
      agentstatedetail asdr 
      ,agentids ai 
     WHERE asdr.agentid = ai.agentid 
     AND asdr.eventdatetime BETWEEN @p_startTime AND @p_endTime 
     AND asdr.eventtype IN(@l_event_login,@l_event_logout) 

    UPDATE temp_asdr1 
     SET filter = (SELECT 
         filter 
         FROM agentids ai 
     WHERE ai.agentid = temp_asdr1.agentid) 

    DELETE FROM temp_asdr 

    --alter sequence temp_asdr_seq 
    SELECT 
     @l_mineventdatetime = min(eventdatetime) 
     ,@l_maxeventdatetime = max(eventdatetime) 
    FROM temp_asdr1 
    WHERE filter = 1 

    EXECUTE dbo.sp_executesql 'l_mineventdatetime' 
           ,@l_mineventdatetime 

    EXECUTE dbo.sp_executesql 'l_maxeventdatetime' 
           ,@l_maxeventdatetime 

    IF @@rowcount = 0 
    BEGIN 
     SELECT 
      @l_mineventdatetime = NULL 
      ,@l_maxeventdatetime = NULL 
     EXECUTE dbo.sp_executesql 'l_mineventdatetime' 
            ,@l_mineventdatetime 
     EXECUTE dbo.sp_executesql 'l_maxeventdatetime' 
            ,@l_maxeventdatetime 
    END 

    DELETE FROM temp_asdr1 
    WHERE ((eventdatetime <= l_mineventdatetime) 
     OR (eventdatetime >= @l_maxeventdatetime)) 
     AND filter = 0 

    SET @SWV_cursor_var1 = CURSOR FOR 
    SELECT 
     agentid, 
     eventtype, 
     eventdatetime, 
     reasoncode, 
     filter 
    FROM temp_asdr1 
    ORDER BY eventdatetime 
    OPEN @SWV_cursor_var1 
    FETCH NEXT FROM @SWV_cursor_var1 INTO @l_agentid, @l_eventtype, @l_eventdatetime, @l_reasoncode, @l_filter 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     -- WARNING: The INSERT statement was commented, because column name or number of supplied values does not match table definition. 
     -- insert into temp_asdr(agentid, eventtype, eventdatetime, reasoncode, filter) values(temp_asdr_seq.nextval,l_agentid, l_eventtype, l_eventdatetime, l_reasoncode, l_filter); 
     FETCH NEXT FROM @SWV_cursor_var1 INTO @l_agentid, @l_eventtype, @l_eventdatetime, @l_reasoncode, @l_filter 
    END 
    CLOSE @SWV_cursor_var1 

    DELETE FROM temp_asdr1 

    SELECT TOP 1 
     @l_eventtype = eventtype, 
     @l_eventdatetime = eventdatetime, 
     @l_reasoncode = reasoncode, 
     @l_filter = filter 
    FROM temp_asdr 
    WHERE eventdatetime = (SELECT 
     MIN(eventdatetime) 
    FROM temp_asdr) 

    IF @@rowcount = 0 
     SELECT 
      @l_eventtype = NULL, 
      @l_eventdatetime = NULL, 
      @l_reasoncode = NULL, 
      @l_filter = NULL 

    DELETE FROM temp_login_logout 

    IF (@l_eventtype = @l_event_logout) 
     INSERT INTO temp_login_logout (seq, logintime, op1, logouttime, reasoncode, loginfilter, logoutfilter) 
      VALUES (0, NULL, '<', @l_eventdatetime, NULL, @l_filter, @l_filter) 

    INSERT INTO temp_login_logout (seq, logintime, loginfilter) 
     SELECT 
      seq, 
      eventdatetime, 
      filter 
     FROM temp_asdr tasdr 
     WHERE eventtype = @l_event_login 

    UPDATE temp_login_logout 
    SET logouttime = (SELECT 
       eventdatetime 
      FROM temp_asdr tasdr 
      WHERE tasdr.eventtype = @l_event_logout 
      AND tasdr.seq = (temp_login_logout.seq + 1)), 
      logoutfilter = (SELECT 
       filter 
      FROM temp_asdr tasdr 
      WHERE tasdr.eventtype = @l_event_logout 
      AND tasdr.seq = (temp_login_logout.seq + 1)), 
      reasoncode = (SELECT 
       reasoncode 
      FROM temp_asdr tasdr 
      WHERE tasdr.eventtype = @l_event_logout 
      AND tasdr.seq = (temp_login_logout.seq + 1)) 

    UPDATE temp_login_logout 
    SET logouttime = @p_endTime, 
      op2 = '>', 
      logoutfilter = 0 
    WHERE logouttime IS NULL 
    UPDATE temp_login_logout 
    SET logintime = NULL, 
      op1 = '<', 
      reasoncode = NULL 
    WHERE loginfilter = 0 
    AND logoutfilter = 1 
    UPDATE temp_login_logout 
    SET logouttime = NULL, 
      op2 = '>', 
      reasoncode = NULL 
    WHERE loginfilter = 1 
    AND logoutfilter = 0 
    DELETE FROM temp_login_logout 
    WHERE loginfilter = 0 
     AND logoutfilter = 0 
    UPDATE temp_login_logout 
    SET duration = dbo.datediff('ss', logintime, logouttime) 
END 

kann mit diesem Fehler helfen jemand bitte.

+0

Was ist die genaue Fehlermeldung ?. Hat die 'agentids' Tabelle tatsächlich eine' filter' Spalte? – Lamak

+0

Ja, tut es. Und alle hier genannten Tabellen sind Tabellenvariablen, die in einer separaten Funktion erstellt wurden. Aber ich bekomme Fehler zu dem Schnipsel, den ich eingeschlossen habe. Spruch ** Ungültiger Spaltenname 'Filter' **. Wenn ich diese Teil- und Kompilierprozedur entferne, kann ich dies erfolgreich tun. –

+0

Warum benutzen Sie hier einen Cursor? Und Sie müssen vorsichtig sein, da Sie eine Race-Bedingung für Ihre persistenten "Temp" -Tabellen erstellt haben. Wenn Sie mehrere Benutzer haben, werden sie sich gegenseitig übertreten. Sie sollten dies als satzbasierten Ansatz anstelle von Zeile durch quälende Zeile neu schreiben. –

Antwort

0

Ich denke, ich habe ein Problem damit verstanden.

Kann es ein Fehler oder etwas sein. Aber hier, was ich getan habe, wurde die Funktion gelöscht, die erstellt wurde, wo ich diese Tabellenvariable erstellt hatte. Und dann erstellt die Stored Procedure zuerst und dann Funktion erstellt.

konnte ich erfolgreich kompiliert werden.

Verwandte Themen