February 19, 2021 at 5:48 pm
I want to update the contents of a variable using a CASE Statement; for example:
I declare the variable and set the initial value, then I want to use a CASE Statement to append to that variable contents. So, in my example below, it initially sets the variable to 'The Following Items Have Changed:' . Using the CASE Statement, if it is true, the variable would be appended to be 'The Following Items Have Changed: some more stuff'.
I can't seem to get this to work. Is there any way to do what I want?
Thanks!
DECLARE @TheDetails VARCHAR(MAX)
SET @TheDetails = 'The Following Items Have Changed: '
SELECT
CASE WHEN ValueA <> ValueB THEN SET @TheDetails += 'Some more stuff'
ELSE ''
END
February 19, 2021 at 5:59 pm
This syntax works ... not sure whether it gets you where you want to be.
DECLARE @TheDetails VARCHAR(MAX);
SET @TheDetails = 'The Following Items Have Changed: ';
IF 1 <> 0
SET @TheDetails += 'Some more stuff';
SELECT @TheDetails;
February 19, 2021 at 7:05 pm
In SQL Server, the CASE WHEN/THEN results are scalar (single) values only: keywords, operators, etc. are not allowed. Thus, you need something more like below.
Edit: That said, the expressions within a CASE can be quite complex, and even include subqueries, but ultimately the result must come down to a single value.
DECLARE @TheDetails varchar(MAX)
SET @TheDetails = 'The Following Items Have Changed: '
SELECT
@TheDetails += CASE WHEN ValueA <> ValueB THEN 'Some more stuff' ELSE '' END
SQL DBA,SQL Server MVP(07, 08, 09) "It's a dog-eat-dog world, and I'm wearing Milk-Bone underwear." "Norm", on "Cheers". Also from "Cheers", from "Carla": "You need to know 3 things about Tortelli men: Tortelli men draw women like flies; Tortelli men treat women like flies; Tortelli men's brains are in their flies".
February 19, 2021 at 7:20 pm
Another key point is that you don't use SET inside a SELECT statement to assign a value to a variable, you just assign a value:
DECLARE @MyVal varchar(64);
SELECT @MyVal = 'Assigned without SET';
SELECT @MyVal AS [MyVal];
Your statement would work by removing the SET and using the CASE to produce a value to add to @TheDetails:
DECLARE @TheDetails VARCHAR(MAX);
SELECT @TheDetails = 'The Following Items Have Changed: ';
SELECT @TheDetails += CASE WHEN ValueA != ValueB THEN 'Some more stuff'
ELSE ''
END;
Eddie Wuerch
MCM: SQL
February 23, 2021 at 5:25 am
Thanks so much for all of your responses; very much appreciated!
February 23, 2021 at 6:34 am
Can you do it in one statement?
SELECT@TheDetails = CONCAT('The Following Items Have Changed:'
, CASE WHEN ValueA <> ValueB THEN ' Some more stuff' ELSE '' END
, CASE WHEN ValueC <> ValueD THEN ' Even more stuff' ELSE '' END
)
You'll get NULL if there are no ROWS included for the ValueA/ValueB part ... so possibly this as an alternative
SELECT@TheDetails = 'The Following Items Have Changed:'
SELECT@TheDetails = CONCAT(@TheDetails
, CASE WHEN ValueA <> ValueB THEN ' Some more stuff' ELSE '' END
, CASE WHEN ValueC <> ValueD THEN ' Even more stuff' ELSE '' END
)
FROM ...
but may not be relevant in your case.
CONCAT will convert any NULL values to EmptyString, whereas
SELECT @TheDetails += NULL
will set @TheDetails to NULL
February 23, 2021 at 12:15 pm
Conceptually, you must always remember that CASE is an expression, not a statement. You use it just as you would use a function, or a formula, to deliver a single value. There is no need for a SELECT, you just SET your variable to a value returned by the case expression.
declare @A int = 2
, @B int = 1
, @details varchar(100) = 'Some stuff'
set @details = case when @A > @B then @details + ' and some more stuff.'
else @details
end
select @details
-- alternative
set @details = @details + case when @A > @B then ' and some more stuff.'
else ''
end
__________________________________________________
Against stupidity the gods themselves contend in vain. -- Friedrich Schiller
Stop, children, what's that sound? Everybody look what's going down. -- Stephen Stills
Viewing 7 posts - 1 through 7 (of 7 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy