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.
Was ist die genaue Fehlermeldung ?. Hat die 'agentids' Tabelle tatsächlich eine' filter' Spalte? – Lamak
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. –
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. –