Please start any new threads on our new site at https://forums.sqlteam.com. We've got lots of great SQL Server experts to answer whatever question you can come up with.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 Help with Case expression

Author  Topic 

eljapo4
Posting Yak Master

100 Posts

Posted - 2012-01-18 : 10:09:48
Hi, i'm trying to rewrite an existing SP to accommodate data that may have been moved to historical tables, in my case expression I'd like to say if @Found_ScheduleID & @Found_ScheduleIDhi IS NULL then '!' AS 'Message'. Can anyone help me to fix the case expression?
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

DECLARE
@OperatorSite VARCHAR(4),
@Schedule VARCHAR(20),
@Resource VARCHAR(35),
@DefaultUnitType VARCHAR(7)
--AS
--/*
SELECT
@OperatorSite = 'S05',
@Schedule = '1200905125',
@Resource = '7905800',
@DefaultUnitType = 'PE80_E'
--*/

SET NOCOUNT ON

DECLARE
@Found_ScheduleID VARCHAR(20),
@Found_ResourceID VARCHAR(35),
@ProductionDate DATETIME,
@BlockMethod INTEGER,
@Found_ScheduleIDhi VARCHAR(20),
@Found_ResourceIDhi VARCHAR(35),
@ProductionDatehi DATETIME,
@BlockMethodhi INTEGER


SELECT
@Found_ScheduleID = MAX(T0.ScheduleSchedNum),
@Found_ResourceID = MAX(T2.CalcValResource),
@BlockMethod = MAX(T0.BlockIDMthd),
@ProductionDate = GETDATE()

FROM smSchedule T0 (NOLOCK)
LEFT OUTER JOIN smStage T1 (NOLOCK) ON T1.ParentObjectID = T0.ObjectID
AND T1.ParentClassID = 10460
AND T1.CollectionID = 1
LEFT OUTER JOIN smResc T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID
AND T2.ParentClassID = 10459
AND T2.CollectionID = 0
AND T2.CalcValResource = @Resource
WHERE
T0.ScheduleSite = @OperatorSite
AND T0.ScheduleSchedNum = @Schedule
AND T0.SchedStatus IN ('1','2','3') --"Released" & "Running"


SELECT
@Found_ScheduleIDhi = MAX(T0.ScheduleSchedNum),
@Found_ResourceIDhi = MAX(T2.CalcValResource),
@BlockMethodhi = MAX(T0.BlockIDMthd),
@ProductionDatehi = GETDATE()

FROM smSchedulehi T0 (NOLOCK)
LEFT OUTER JOIN smStagehi T1 (NOLOCK) ON T1.ParentObjectID = T0.ObjectID
AND T1.ParentClassID = 10460
AND T1.CollectionID = 1
LEFT OUTER JOIN smReschi T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID
AND T2.ParentClassID = 10459
AND T2.CollectionID = 0
AND T2.CalcValResource = @Resource
WHERE
T0.ScheduleSite = @OperatorSite
AND T0.ScheduleSchedNum = @Schedule
AND T0.SchedStatus IN ('1','2','3') --"Released" & "Running"

PRINT @Found_ScheduleID
PRINT @Found_ScheduleIDhi


SELECT CASE T0.ScheduleSchedNum
WHEN (@Found_ScheduleID IS NULL) AND (@Found_ScheduleIDhi IS NULL) THEN
--Schedule not found
'!' AS 'Message'
-- BEGIN
-- SELECT '!' AS 'Message'
-- END
END

ehorn
Master Smack Fu Yak Hacker

1632 Posts

Posted - 2012-01-18 : 10:22:49
Hello elhapo4,

Do you mean this structure?


SELECT
CASE
WHEN (@Found_ScheduleID IS NULL) AND (@Found_ScheduleIDhi IS NULL)
THEN '!' --the values are null
ELSE
--the values are not null
END


HTH.
Go to Top of Page

eljapo4
Posting Yak Master

100 Posts

Posted - 2012-01-18 : 10:29:05
thanks ehorn that helps but I'd like to assign the value '!' to a column called 'Message'
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2012-01-18 : 11:17:32
[code]
SELECT CASE
WHEN (@Found_ScheduleID IS NULL) AND (@Found_ScheduleIDhi IS NULL) THEN '!'
ELSE <SOMETHING ELSE>
END AS [Message]
[/code]
I don't know what the <SOMETHING ELSE> is for you.

Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

eljapo4
Posting Yak Master

100 Posts

Posted - 2012-01-18 : 11:21:34
i've expanded my code to cater for the following scenarios:
1) WHEN (@Found_ScheduleID IS NULL) AND (@Found_ScheduleIDhi IS NULL)
2) WHEN (@Found_ScheduleID IS NOT NULL) AND (@Found_ResourceID IS NOT NULL)
3) WHEN (@Found_ScheduleIDhi IS NOT NULL) AND (@Found_ResourceIDhi IS NOT NULL)
4) WHEN (@Found_ResourceID IS NULL) OR (@Found_ResourceIDhi IS NULL)
5) ELSE - same rule as scenario 1.

here's the full query
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

DECLARE
@OperatorSite VARCHAR(4),
@Schedule VARCHAR(20),
@Resource VARCHAR(35),
@DefaultUnitType VARCHAR(7)
--AS
--/*
SELECT
@OperatorSite = 'S05',
@Schedule = '1200905125',
@Resource = '7905800',
@DefaultUnitType = 'PE80_E'
--*/

SET NOCOUNT ON

DECLARE
@Found_ScheduleID VARCHAR(20),
@Found_ResourceID VARCHAR(35),
@ProductionDate DATETIME,
@BlockMethod INTEGER,
@Found_ScheduleIDhi VARCHAR(20),
@Found_ResourceIDhi VARCHAR(35),
@ProductionDatehi DATETIME,
@BlockMethodhi INTEGER


SELECT
@Found_ScheduleID = MAX(T0.ScheduleSchedNum),
@Found_ResourceID = MAX(T2.CalcValResource),
@BlockMethod = MAX(T0.BlockIDMthd),
@ProductionDate = GETDATE()

FROM smSchedule T0 (NOLOCK)
LEFT OUTER JOIN smStage T1 (NOLOCK) ON T1.ParentObjectID = T0.ObjectID
AND T1.ParentClassID = 10460
AND T1.CollectionID = 1
LEFT OUTER JOIN smResc T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID
AND T2.ParentClassID = 10459
AND T2.CollectionID = 0
AND T2.CalcValResource = @Resource
WHERE
T0.ScheduleSite = @OperatorSite
AND T0.ScheduleSchedNum = @Schedule
AND T0.SchedStatus IN ('1','2','3') --"Released" & "Running"


SELECT
@Found_ScheduleIDhi = MAX(T0.ScheduleSchedNum),
@Found_ResourceIDhi = MAX(T2.CalcValResource),
@BlockMethodhi = MAX(T0.BlockIDMthd),
@ProductionDatehi = GETDATE()

FROM smSchedulehi T0 (NOLOCK)
LEFT OUTER JOIN smStagehi T1 (NOLOCK) ON T1.ParentObjectID = T0.ObjectID
AND T1.ParentClassID = 10460
AND T1.CollectionID = 1
LEFT OUTER JOIN smReschi T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID
AND T2.ParentClassID = 10459
AND T2.CollectionID = 0
AND T2.CalcValResource = @Resource
WHERE
T0.ScheduleSite = @OperatorSite
AND T0.ScheduleSchedNum = @Schedule
AND T0.SchedStatus IN ('1','2','3') --"Released" & "Running"

PRINT @Found_ScheduleID
PRINT @Found_ScheduleIDhi

SELECT CASE
--Schedule/Schedulehi not found
WHEN (@Found_ScheduleID IS NULL) AND (@Found_ScheduleIDhi IS NULL) THEN
'!' --the values are null

--Schedule and Resource exist
WHEN (@Found_ScheduleID IS NOT NULL) AND (@Found_ResourceID IS NOT NULL) THEN
( SELECT
'0' AS '!ActivityType',--------------------------------||0: SAF, 1:UDA
T0.ScheduleSchedNum AS 'Schedule',
T4.ResourceUK AS 'Resource',

CASE
WHEN T3.DfltUntTyp IS NULL THEN
@DefaultUnitType
ELSE
T3.DfltUntTyp
END AS 'UnitType',
@ProductionDate AS 'ProductionDate',
@ProductionDate +
COALESCE(T6.ExpDateOff/60/60/24,0) AS '!ExpiryDate',

CASE
WHEN T3.DfltUntTyp IS NULL THEN
ISNULL(T9.UTQty,-1)
ELSE
T8.UTQty
END AS 'Quantity',

CASE
WHEN T3.DfltUntTyp IS NULL THEN
ISNULL(T9.UTQtyUM,T5.MfgUM)
ELSE
T8.UTQtyUM
END AS 'UM',
T3.DfltClass AS 'Classification',
T3.ClassIfRestrict AS 'Restricted', ---------------------------------|| 0 = Not restricted, 1 = Restricted

CASE
WHEN T3.DfltUntTyp IS NULL THEN
ISNULL(T10.UserDef2,'')
ELSE
ISNULL(T7.UserDef2,'')
END AS '!UnitIDCodeType',

T11.DfltLocnArea AS '!DefaultArea',
T11.DfltLocn AS '!DefaultLocation',

CASE
WHEN T0.BlockIDMthd = 1 THEN--BLK_SCHED_NUMBER
T0.ScheduleSchedNum
ELSE
'!'
END AS '!Lot',

CASE
WHEN T0.BlockIDMthd = 1 THEN--BLK_SCHED_NUMBER
CASE
WHEN T12.SubLot IS NULL THEN
REPLICATE('0', 3) + '1'
ELSE
REPLICATE('0', 4 - LEN(CAST(T12.SubLot +1 AS INTEGER))) + CAST(T12.SubLot + 1 AS VARCHAR(4))
END

ELSE
'!'
END AS '!SubLot'
FROM smSchedule T0 (NOLOCK)
LEFT OUTER JOIN smStage T1 (NOLOCK) ON T1.ParentObjectID = T0.ObjectID
AND T1.ParentClassID = 10460
AND T1.CollectionID = 1
LEFT OUTER JOIN smResc T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID
AND T2.ParentClassID = 10459
AND T2.CollectionID = 0
AND T2.CalcValResource = @Resource
INNER JOIN smBalProdRescDt T3 (NOLOCK) ON T3.ObjectID = T2.RescDtlObjectID

LEFT OUTER JOIN fdBasResc T4 (NOLOCK) ON T4.ObjectID = T2.CalcValRescOID
LEFT OUTER JOIN fdMfgBalConsRol T5 (NOLOCK) ON T5.ObjectID = T4.MfgResDtl1ObjectID
LEFT OUTER JOIN fdInvRole T6 (NOLOCK) ON T6.ObjectID = T4.InvRescObjectID
LEFT OUTER JOIN inUnitType T7 (NOLOCK) ON T7.UnitType = T3.DfltUntTyp
LEFT OUTER JOIN rsUnitType T8 (NOLOCK) ON T8.ParentObjectID = T6.ObjectID
AND T8.ParentClassID = 10183
AND T8.CollectionID = 1
AND T8.UnitType = T3.DfltUntTyp
LEFT OUTER JOIN rsUnitType T9 (NOLOCK) ON T9.ParentObjectID = T6.ObjectID
AND T9.ParentClassID = 10183
AND T9.CollectionID = 1
AND T9.UnitType = @DefaultUnitType
LEFT OUTER JOIN inUnitType T10 (NOLOCK) ON T10.UnitType = @DefaultUnitType
LEFT OUTER JOIN fdMfgBalProdRol T11 (NOLOCK) ON T11.ObjectID = T4.MfgResDtl2ObjectID
LEFT OUTER JOIN (
SELECT
MAX(SubLot) AS 'SubLot'
FROM
(
SELECT
T0.LotSubLot AS 'SubLot'
FROM
inLot T0 (NOLOCK)
WHERE
ISNUMERIC(T0.LotSubLot) = 1
AND T0.LotSubLot IS NOT NULL

AND T0.LotResource = @Resource
AND T0.Lot = @Schedule
AND T0.RescSite = @OperatorSite
) T0

) T12 ON 1=1
WHERE
T0.ScheduleSite = @OperatorSite
AND T0.ScheduleSchedNum = @Schedule )

--Schedulehi and Resourcehi exist
WHEN (@Found_ScheduleIDhi IS NOT NULL) AND (@Found_ResourceIDhi IS NOT NULL) THEN
( SELECT
'0' AS '!ActivityType',--------------------------------||0: SAF, 1:UDA
T0.ScheduleSchedNum AS 'Schedule',
T4.ResourceUK AS 'Resource',

CASE
WHEN T3.DfltUntTyp IS NULL THEN
@DefaultUnitType
ELSE
T3.DfltUntTyp
END AS 'UnitType',
@ProductionDate AS 'ProductionDate',
@ProductionDate +
COALESCE(T6.ExpDateOff/60/60/24,0) AS '!ExpiryDate',

CASE
WHEN T3.DfltUntTyp IS NULL THEN
ISNULL(T9.UTQty,-1)
ELSE
T8.UTQty
END AS 'Quantity',

CASE
WHEN T3.DfltUntTyp IS NULL THEN
ISNULL(T9.UTQtyUM,T5.MfgUM)
ELSE
T8.UTQtyUM
END AS 'UM',
T3.DfltClass AS 'Classification',
T3.ClassIfRestrict AS 'Restricted', ---------------------------------|| 0 = Not restricted, 1 = Restricted

CASE
WHEN T3.DfltUntTyp IS NULL THEN
ISNULL(T10.UserDef2,'')
ELSE
ISNULL(T7.UserDef2,'')
END AS '!UnitIDCodeType',

T11.DfltLocnArea AS '!DefaultArea',
T11.DfltLocn AS '!DefaultLocation',

CASE
WHEN T0.BlockIDMthd = 1 THEN--BLK_SCHED_NUMBER
T0.ScheduleSchedNum
ELSE
'!'
END AS '!Lot',

CASE
WHEN T0.BlockIDMthd = 1 THEN--BLK_SCHED_NUMBER
CASE
WHEN T12.SubLot IS NULL THEN
REPLICATE('0', 3) + '1'
ELSE
REPLICATE('0', 4 - LEN(CAST(T12.SubLot +1 AS INTEGER))) + CAST(T12.SubLot + 1 AS VARCHAR(4))
END

ELSE
'!'
END AS '!SubLot'
FROM smSchedulehi T0 (NOLOCK)
LEFT OUTER JOIN smStagehi T1 (NOLOCK) ON T1.ParentObjectID = T0.ObjectID
AND T1.ParentClassID = 10460
AND T1.CollectionID = 1
LEFT OUTER JOIN smReschi T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID
AND T2.ParentClassID = 10459
AND T2.CollectionID = 0
AND T2.CalcValResource = @Resource
INNER JOIN smBalProdRescDt T3 (NOLOCK) ON T3.ObjectID = T2.RescDtlObjectID

LEFT OUTER JOIN fdBasResc T4 (NOLOCK) ON T4.ObjectID = T2.CalcValRescOID
LEFT OUTER JOIN fdMfgBalConsRol T5 (NOLOCK) ON T5.ObjectID = T4.MfgResDtl1ObjectID
LEFT OUTER JOIN fdInvRole T6 (NOLOCK) ON T6.ObjectID = T4.InvRescObjectID
LEFT OUTER JOIN inUnitType T7 (NOLOCK) ON T7.UnitType = T3.DfltUntTyp
LEFT OUTER JOIN rsUnitType T8 (NOLOCK) ON T8.ParentObjectID = T6.ObjectID
AND T8.ParentClassID = 10183
AND T8.CollectionID = 1
AND T8.UnitType = T3.DfltUntTyp
LEFT OUTER JOIN rsUnitType T9 (NOLOCK) ON T9.ParentObjectID = T6.ObjectID
AND T9.ParentClassID = 10183
AND T9.CollectionID = 1
AND T9.UnitType = @DefaultUnitType
LEFT OUTER JOIN inUnitType T10 (NOLOCK) ON T10.UnitType = @DefaultUnitType
LEFT OUTER JOIN fdMfgBalProdRol T11 (NOLOCK) ON T11.ObjectID = T4.MfgResDtl2ObjectID
LEFT OUTER JOIN (
SELECT
MAX(SubLot) AS 'SubLot'
FROM
(
SELECT
T0.LotSubLot AS 'SubLot'
FROM
inLot T0 (NOLOCK)
WHERE
ISNUMERIC(T0.LotSubLot) = 1
AND T0.LotSubLot IS NOT NULL

AND T0.LotResource = @Resource
AND T0.Lot = @Schedule
AND T0.RescSite = @OperatorSite
) T0

) T12 ON 1=1
WHERE
T0.ScheduleSite = @OperatorSite
AND T0.ScheduleSchedNum = @Schedule )


--Resource OR Resourcehi not on Schedule
WHEN (@Found_ResourceID IS NULL) OR (@Found_ResourceIDhi IS NULL) THEN
( SELECT
'1' AS '!ActivityType', --0: SAF, 1:UDA
@Schedule AS 'Schedule',
T0.ResourceUK AS 'Resource',
T1.DfltUntTyp AS 'UnitType',
@ProductionDate AS 'ProductionDate',
@ProductionDate +
COALESCE(T2.ExpDateOff/60/60/24,NULL) AS '!ExpiryDate',
ISNULL(T3.UTQty,0) AS 'Quantity',
ISNULL(T3.UTQtyUM,'-') AS 'UM',
T1.DfltClass AS 'Classification',
T1.ClassIfRestrict AS 'Restricted',
ISNULL(T4.UserDef2,'') AS '!UnitIDCodeType',

---------------------------------------------------------------

T5.DfltLocnArea AS '!DefaultArea',
T5.DfltLocn AS '!DefaultLocation',

CASE
WHEN @BlockMethod = 1 THEN--BLK_SCHED_NUMBER
@Found_ScheduleID
ELSE
'!'
END AS '!Lot',

CASE
WHEN @BlockMethod = 1 THEN--BLK_SCHED_NUMBER
CASE
WHEN T6.SubLot IS NULL THEN
REPLICATE('0', 3) + '1'
ELSE
REPLICATE('0', 4 - LEN(CAST(T6.SubLot +1 AS INTEGER))) + CAST(T6.SubLot + 1 AS VARCHAR(4))
END

ELSE
'!'
END AS '!SubLot'
FROM fdBasResc T0 (NOLOCK)
INNER JOIN fdMfgBalProdRol T1 (NOLOCK) ON T1.ObjectID = T0.MfgResDtl2ObjectID
INNER JOIN fdInvRole T2 (NOLOCK) ON T2.ObjectID = T0.InvRescObjectID
LEFT OUTER JOIN rsUnitType T3 (NOLOCK) ON T3.ParentObjectID = T2.ObjectID AND
T3.ParentClassID = 10183 AND
T3.CollectionID = 1 AND
T3.UnitType = T1.DfltUntTyp
LEFT OUTER JOIN inUnitType T4 (NOLOCK) ON T4.UnitType = T1.DfltUntTyp
LEFT OUTER JOIN fdMfgBalProdRol T5 (NOLOCK) ON T5.ObjectID = T0.MfgResDtl2ObjectID
LEFT OUTER JOIN (
SELECT
MAX(SubLot) AS 'SubLot'
FROM
(
SELECT
T0.LotSubLot AS 'SubLot'
FROM
inLot T0 (NOLOCK)
WHERE
ISNUMERIC(T0.LotSubLot) = 1
AND T0.LotSubLot IS NOT NULL

AND T0.LotResource = @Resource
AND T0.Lot = @Schedule
AND T0.RescSite = @OperatorSite
) T0
) T6 ON 1=1
WHERE
T0.ResourceUKSite = @OperatorSite
AND T0.ResourceUK = @Resource )

Else
'!'
END


when I run this SQL generates the following error "Msg 116, Level 16, State 1, Line 71
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS."
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2012-01-18 : 11:30:10
case doesn't work that way.

You are trying to stuff a completely different format result set into it.

CASE in sql is an EXPRESSION, not a control flow mechanism.

You would have 1 query of the same structure, but CASE expressions in the SELECT portion that make choices based on the rows they are processing.

Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

eljapo4
Posting Yak Master

100 Posts

Posted - 2012-01-18 : 11:32:15
can you recommend a way in which I can process the above query if CASE will not work?
Go to Top of Page

eljapo4
Posting Yak Master

100 Posts

Posted - 2012-01-18 : 11:41:38
Actually ignore my last question I have used a series if IF...ELSE IF... to amend the code - just need to check that its working properly now. Thanks for your help
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2012-01-18 : 11:42:13
Do you really want to return two different types of result from the sp?

so if there is some condition not met you only want to return a result set that looks like
[message]
---------
!

but if the condition is met you want to return a different format result?

That's not really a good idea (IMHO) because your result format is then non determanistic.

But if you do then all you need to do is:

1) Check the condition and return early if it's met
Example:

IF @foo = 'bar'
BEGIN
SELECT '!' AS [Message]
RETURN -- An optional int error value here
END

Then in the rest of the code just SELECT whatever output you did want.

Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page

eljapo4
Posting Yak Master

100 Posts

Posted - 2012-01-18 : 11:51:19
I don't see it as 2 different types of results, depending on the initial values the query will either be selecting against unarchived or archived tables
Go to Top of Page

Transact Charlie
Master Smack Fu Yak Hacker

3451 Posts

Posted - 2012-01-18 : 12:22:17
I think that if the condition is met then the result will be a single column with the header [message] and the value '!'

Otherwise it will be a completely different format.

Charlie
===============================================================
Msg 3903, Level 16, State 1, Line 1736
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
Go to Top of Page
   

- Advertisement -