2017-03-14 7 views
0

奇妙なエラーが発生しています。なぜ私はそのエラーを受けているのか理解できないので、私は奇妙なことを言う。私は、構文エラーがあると思うが、私は正確に正しいと思われるので、何を得ていない。SQL Serverの列名 'filter'が無効です。

エラーは、私が作成したSQL Serverプロシージャにあります。以下の手順では、特に以下の部分でエラーが発生しています。

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

私は上記INSERT文を削除する場合は、私が手続きをコンパイルすることができています。私は、フィルタがでビルドSQL Serverの変数であることを理解し、私は手順で、他の場所でそれを使用していると私は一部に

アップデート注意INSERT文を削除する場合はそれが適切に実行されます。私はこれ以前に言及逃したが、この プロシージャを「マスター」データベースとして実行すると、正常にコンパイルされます。

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 

誰かがこのエラーを助けてください。

+0

正確なエラーメッセージは何ですか? 'agentids'テーブルには実際に' filter'カラムがありますか? – Lamak

+0

はい。ここで言及しているすべてのテーブルは、別々の関数で作成されたテーブル変数です。しかし、私は含まれているスニペットにエラーを取得しています。言っている**無効な列名 'フィルタ' **。その部分を削除してプロシージャをコンパイルすると、正常に実行できます。 –

+0

ここでカーソルを使用していますか?また、永続的な "temp"テーブルで競合状態を作成したので注意する必要があります。あなたがこれを実行している複数のユーザーを持っている場合、彼らはお互いに歩み寄るつもりです。行を苦労させることによって行を変更するのではなく、集合に基づいたアプローチとしてこれを書き直すことを検討してください。 –

答えて

0

私はこの問題を理解していると思います。

これは不具合か何かである可能性があります。しかし、ここでは、このテーブル変数を作成した場所に作成された関数が削除されました。最初にストアドプロシージャを作成し、次に関数を作成しました。

正常にコンパイルできました。

関連する問題