вторник, 24 июня 2008 г.

T-SQL example: "UPSERT" model (Insert + Update) by T-SQL with changeable number of input parameters

ALTER PROCEDURE [dbo].[spSave]
@InputItems char(2048)
AS
BEGIN
SET NOCOUNT ON;

DECLARE @FilterID INT;
SET @FilterID = -1;

BEGIN TRANSACTION;

DECLARE @TempString varchar(2048)
DECLARE @Temp varchar(2048)
DECLARE @ChPos int

DELETE FROM WorkTable WHERE ID = @FilterID

IF @InputItems <> ''
BEGIN
SET @TempString = ''
SET @Temp = ''
SET @ChPos = -1

SET @TempString = @InputItems

SET @ChPos = CHARINDEX(',', @TempString)

WHILE @ChPos > 0
BEGIN
SET @Temp = SUBSTRING(@TempString, 1, (@ChPos - 1))
INSERT INTO WorkTable
(ID, YourValue)
VALUES
(@FilterID, CAST(@Temp AS int))

IF @@ERROR != 0 GOTO ErrorHandler

SET @TempString = SUBSTRING(
@TempString,
(@ChPos + 1),
(LEN(@TempString) - @ChPos))
SET @ChPos = CHARINDEX(',', @TempString)
END

INSERT INTO WorkTable
(ID, YourValue)
VALUES
(@FilterID, CAST(@TempString AS int))
IF @@ERROR != 0 GOTO ErrorHandler
END
COMMIT TRANSACTION

SELECT @FilterID AS RetVal
RETURN 0
ErrorHandler:
SELECT @FilterID AS RetVal
IF @@TRANCOUNT != 0 ROLLBACK TRANSACTION
RETURN @@ERROR
END