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;
The absence of evidence is not evidence of absence.
Martin Rees
You can lead a horse to water, but a pencil must be lead.
Stan Laurel
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 6 (of 6 total)
You must be logged in to reply to this topic. Login to reply