Hej, undrar om någon kan se om det finns en bättre lösning på detta? Har 2 tabeller i detta scenariot, egentligen fler men tar bara med de 2 första då de andra ska updateras på samma sätt. Första tabellen ska bara ha nya värden till kolumnerna intOrdning och vcharBenamning från inparametrarna, de andra ska ha utöver detta, oxå ha värdet på pri.key från förra tabellen(föregående INSERT) osv. detta för att värdena ska visas i nivåer i en TreeView. Har alltså 2 problem: intOrdning ska få högsta värdet i kolumnen + 1 och tblInkStatusTyp.intHuvudStatusID(for.key) ska få värdet från tblInkHuvudStatus.intHuvudStatusID(pri.key)! Nedan visas vart jag är på väg..medveten om att uppdateringen av intOrdning är helt fel(kan man göra något fiffigt med @@IDENTITY?), men som sagt så söker jag en lösning på detta. Mina t-sql kunkaper är inte enorma som ni kommer att se! Tacksam för hjälp.. Hej! Oki, tack för hjälpen.. Så här ser min sp ut nu, verkar funka men får 3 såna här varningar: Warning: Null value is eliminated by an aggregate or other SET operation. Hmm.. Såg inte några NULL i fälten! Vet du/någon hur jag kan hämta/sätta högsta värdet från kolumn intOrdning till värdet + 1? :) @@identity fungerar bara om kolumnen är av typen identity Alla dessa BEGIN TRAN / COMMIT TRAN är väl inte så funktionella... Tjena grabbar! Tack för all hjälp. Jo, jag vill nog att allt eller inget ska hända och koden ser ut så här nu. Min (pri.key)kolumn som jag hämtar värdet till te x @hsId var från början av typen räknare, så felmedd. berodde kanske på något annat, vet ej. Nu får jag inget felmedd. längre. Ser det rätt ut nu? Tack än en gång killar!T-SQL INSERT problem
CREATE PROCEDURE Ink_addCompleteChain
@hsName As varchar(50),
@stName As varchar(50),
@hkName As varchar(50),
AS
SET NOCOUNT ON
DECLARE @cntHS Int
DECLARE @cntST Int
DECLARE @cntHK Int
DECLARE @hsId Int
SELECT @cntHS = COUNT(intOrdning) FROM tblInkHuvudStatus
BEGIN TRAN
INSERT INTO tblInkHuvudStatus(intOrdning, vcharBenamning) VALUES (@cntHS + 1,@hsName)
/*SELECT @@IDENTITY AS 'Identity' (tänkte använda för att lägga in i nästa tbl på något vis)*/
COMMIT TRAN
SELECT @hsId = intHuvudStatusID FROM tblInkHuvudStatus WHERE intOrdning = @cntHS+1 AND vcharBenamning = @hsName
SELECT @cntST = COUNT(intOrdning) FROM tblInkStatusTyp
BEGIN TRAN
INSERT INTO tblInkStatusTyp(intHuvudStatusID, intOrdning, vcharBenamning) VALUES (@hsId, @cntST+1, @stName)
COMMIT TRAN
GOSv: T-SQL INSERT problem
Japp du är på rätt väg..
declare @nID int
INSERT INTO tblInkHuvudStatus(intOrdning, vcharBenamning)
VALUES (5, 'Hej')
SET @nID = @@IDENTITY
ps. Din BEGIN TRAN bör vara innan din select som hör ihop med din insert, annars är den helt onödig.
dd.Sv: T-SQL INSERT problem
/* Lägger till en hel händelsekedja */
CREATE PROCEDURE Ink_addCompleteChain
@hsName As varchar(50),
@stName As varchar(50),
@hkName As varchar(50),
@hName As varchar(50),
@lockDays As Integer,
@type As Integer
AS
SET NOCOUNT ON
DECLARE @cntHS Int
DECLARE @cntST Int
DECLARE @cntHK Int
DECLARE @cntH Int
DECLARE @hsID Int
DECLARE @stID Int
DECLARE @hkID Int
BEGIN TRAN
SELECT @cntHS = COUNT(intOrdning) FROM tblInkHuvudStatus
INSERT INTO tblInkHuvudStatus(intOrdning, vcharBenamning) VALUES (@cntHS + 1,@hsName)
SET @hsID = @@IDENTITY
COMMIT TRAN
BEGIN TRAN
SELECT @cntST = COUNT(intOrdning) FROM tblInkStatusTyp
INSERT INTO tblInkStatusTyp(intHuvudStatusID, intOrdning, vcharBenamning) VALUES (@hsID, @cntST+1, @stName)
SET @stID = @@IDENTITY
COMMIT TRAN
BEGIN TRAN
SELECT @cntHK = COUNT(intOrdning) FROM tblInkHandelseKedja
INSERT INTO tblInkHandelseKedja(intStatusTypID, intOrdning, vcharBenamning) VALUES (@stID, @cntHK+1, @hkName)
SET @hkID = @@IDENTITY
COMMIT TRAN
BEGIN TRAN
SELECT @cntH = COUNT(intOrdning) FROM tblInkHandelser
INSERT INTO tblInkHandelser(intHandelseKedjaID, intHandelseTypID ,intOrdning, intLasdagar, vcharBenamning) VALUES (@hkID, @type, @cntH+1, @lockDays, @hName)
COMMIT TRAN
GOSv: T-SQL INSERT problem
dvs den skapar autoamtiskt ett id. Antagligen är den inte det och du fick att @@identity var NULL, därav felet.
OlaSv: T-SQL INSERT problem
Är inte din vilja att allt sker, eller inget? Nu delar du upp din PROC i massa små delar, som var och en körs som en egen enhet. Går en fel, så händer inget med de andra...
EXEMPEL:
BEGIN TRAN
SELECT @cntHS = COUNT(intOrdning) FROM tblInkHuvudStatus
--Kan knappast gå fel, Är praktiskt sett inte med i transaktionen eftersom
--låsningen släpper direkt - Kan eventuellt(troligen inte) bli ett problem...
--Däremot hade jag valt att köra en MAX(intOrdning) istället,
--för att inte riskera dubletter om man "råkar" radera en post.
INSERT INTO tblInkHuvudStatus(intOrdning, vcharBenamning) VALUES (@cntHS + 1,@hsName)
--Här kan det gå fel. En felkontroll är på sin plats.
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
--Om inte din kolumn är en IDENTITY (Automatisk räknare)
--Så löser du problemet såhär:
SET @hsID = @cntHS + 1
--Detta funkar vid IDENTITY...
--SET @hsID = @@IDENTITY
--Denna måste bort, så att transaktionen fortsätter.
--COMMIT TRAN
--och då kan du inte börja en ny, fortsätt bara...
--BEGIN TRAN
SELECT @cntST = COUNT(intOrdning) FROM tblInkStatusTyp
INSERT INTO tblInkStatusTyp(intHuvudStatusID, intOrdning, vcharBenamning) VALUES (@hsID, @cntST+1, @stName)
IF @@error o.s.v...Sv: T-SQL INSERT problem
CREATE PROCEDURE Ink_addCompleteChain
@hsName As varchar(50),
@stName As varchar(50),
@hkName As varchar(50),
@hName As varchar(50),
@lockDays As Integer,
@type As Integer
AS
SET NOCOUNT ON
DECLARE @cntHS Int
DECLARE @cntST Int
DECLARE @cntHK Int
DECLARE @cntH Int
DECLARE @hsID Int
DECLARE @stID Int
DECLARE @hkID Int
BEGIN TRAN
SELECT @cntHS = MAX(intOrdning) FROM tblInkHuvudStatus
INSERT INTO tblInkHuvudStatus(intOrdning, vcharBenamning) VALUES (@cntHS + 1,@hsName)
SET @hsID = @@IDENTITY /*intHuvudStatusID är en räknare*/
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
SELECT @cntST = MAX(intOrdning) FROM tblInkStatusTyp
INSERT INTO tblInkStatusTyp(intHuvudStatusID, intOrdning, vcharBenamning) VALUES (@hsID, @cntST+1, @stName)
SET @stID = @@IDENTITY
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
SELECT @cntHK = MAX(intOrdning) FROM tblInkHandelseKedja
INSERT INTO tblInkHandelseKedja(intStatusTypID, intOrdning, vcharBenamning) VALUES (@stID, @cntHK+1, @hkName)
SET @hkID = @@IDENTITY
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
SELECT @cntH = MAX(intOrdning) FROM tblInkHandelser
INSERT INTO tblInkHandelser(intHandelseKedjaID, intHandelseTypID ,intOrdning, intLasdagar, vcharBenamning) VALUES (@hkID, @type, @cntH+1, @lockDays, @hName)
IF @@error <> 0
BEGIN
ROLLBACK TRAN
RETURN
END
COMMIT TRAN
GO