>Why your suggestion is better? If UserID exists, we would need to modify, so we don't have to search?
Remember that INSERT, UPDATE, and DELETEs are two step commands. In the first step, SQL Server must find the applicable row or in the case of INSERT, it must find the location to put the new row. In performing this step, SQL Server uses a special lock - UPDATE. It is different than a SHARED lock. It affects concurrency more than a SHARED lock but less than EXCLUSIVE.
> UPDATE cart
> SET LastModTs = CURRENT_TIMESTAMP,
> @CartID = CartID
> FROM cart
> WHERE UserID = @tcUserID
>
>Incorrect syntax near UserID
You don't need to use this form of UPDATE. Try this
UPDATE cart
SET @cartID = cartID
,lastModified = CURRENT_TIMESTAMP
WHERE
userid = @tnUserID
Now, if lastModified is defined with the TIMESTAMP datatype, you don't have to explicitly update it. SQL Server will automatically do it.
>Also am I getting right, that you don't have to close IF statements, e.g. is this valid:
>Does END means an early exit point from the procedure?
BEGIN and END are use to group statements into blocks. TSQL is similar to C, C++, and C# in that conditional and looping statements only affect the statement that appear directly after it. Executing the following:
IF (1=0)
PRINT 'Hello'
PRINT 'World'
Will produce "World" since the first PRINT is skipped. But, wrapping BEGIN and END around the two prints will produce the output as you might expect:
IF (1=0)
BEGIN
PRINT 'Hello'
PRINT 'World'
END
Nothing will be displayed when the above snippet of code is executed.
-Mike