webForumDet fria alternativet

Return multiple value?

Databaser & SQL

26 svar · 3 124 visningar · startad av harry_boy · sida 2 av 2

Frågan, av harry_boy

Jag försöker skapa följande trigger: CREATE TRIGGER [dbo].[FreightSearch] ON [dbo].[Ord] FOR UPDATE AS BEGIN SET NOCOUNT ON; UPDATE Ord SET Web = (SELECT CONCAT(Stc.Ad4, Ord.OrdNo) AS FreightSearch FROM Ord INNER JOIN Stc ON Ord.OrdNo = Ord.OrdNo) END GO Men jag får felmeddelande att jag försöker sätta in "multiple value". Någon som ser vad jag gör för nybörjarfel?

Läs frågan i sin helhet →
Medlem sedan feb. 2003193 inlägg
#21

Tack @nders för ditt tålamod.

I min demomiljö så fungerar det men när jag kör på den skrapa miljön så får jag nu:

Maximum stored procedure, function, trigger or view nesting level exceeded limit 32

Och jag har kontrollerat så att inga andra triggers ligger på ord.

Medlem sedan aug. 20039 340 inlägg
#22

Triggern triggar sig själv när den ändrar raden ifråga, igen och igen, till den når 32 nivåer och stannar. Mer frihands-SQL, jag lade till en IF EXISTS-rad som ska kolla om ordern har "fel" URL och behöver uppdateras. Förhoppningsvi ska det funka. Det kanske finns något bättre sätt att göra det på.

CREATE TRIGGER [dbo].[FreightSearch] 
ON [DB1].[dbo].[Ord]

AFTER UPDATE
AS

BEGIN 
  SET NOCOUNT ON;

DECLARE @Web VARCHAR(260)

SELECT @Web = CONCAT(Stc.Ad4, inserted.OrdNo) 
FROM Stc 
JOIN inserted
ON Stc.StcNo = inserted.FrStc

IF EXISTS(
SELECT * FROM Ord
WHERE  (Ord.OrdNo = inserted.OrdNo AND Ord.TrTp = '1') AND Web <> @Web
)

BEGIN
  UPDATE Ord SET Web = @Web FROM inserted
  WHERE  Ord.OrdNo = inserted.OrdNo
  AND Ord.TrTp = '1'
END
   
END  
GO
Medlem sedan juni 200032 967 inlägg
#23

En idé (istället för att lägga in SQL-kod för att kontrollera) är att stänga av "recursive triggers" på databasen. Om man har rättigheter, förstås.

ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF
GO

mvh

Medlem sedan juni 200032 967 inlägg
#24

Förresten - det luktar Visma om det här - kan det stämma? :)

Medlem sedan feb. 2003193 inlägg
#25

@nders - Du har bra näsa :-)

Var tycker du att jag ska sätta in detta värde?

Medlem sedan aug. 20039 340 inlägg
#26

@nders skrev:

En idé (istället för att lägga in SQL-kod för att kontrollera) är att stänga av "recursive triggers" på databasen. Om man har rättigheter, förstås.

ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF
GO

Frågan jag spontant ställer mig är om det stänger av rekursiva anrop globalt och permanent, och kan skapa problem med annan kod som använder det.

Medlem sedan juni 200032 967 inlägg
#27

nitro2k01 skrev:

Frågan jag spontant ställer mig är om det stänger av rekursiva anrop globalt och permanent, och kan skapa problem med annan kod som använder det.

Det gör det, och det kan det. Tänkte'nte på det!

Kanske är det smartast att lägga in en kontroll i sin kod som nitro tidigare föreslog - eller möjligen leka lite med trigger_nestlevel() för att göra en snygg exit.

mvh

264 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)