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.
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 ONset QUOTED_IDENTIFIER ONGODECLARE @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 ONDECLARE @Found_ScheduleID VARCHAR(20), @Found_ResourceID VARCHAR(35), @ProductionDate DATETIME, @BlockMethod INTEGER, @Found_ScheduleIDhi VARCHAR(20), @Found_ResourceIDhi VARCHAR(35), @ProductionDatehi DATETIME, @BlockMethodhi INTEGERSELECT @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 = 1LEFT OUTER JOIN smResc T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID AND T2.ParentClassID = 10459 AND T2.CollectionID = 0 AND T2.CalcValResource = @ResourceWHERE 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 = 1LEFT OUTER JOIN smReschi T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID AND T2.ParentClassID = 10459 AND T2.CollectionID = 0 AND T2.CalcValResource = @ResourceWHERE T0.ScheduleSite = @OperatorSite AND T0.ScheduleSchedNum = @Schedule AND T0.SchedStatus IN ('1','2','3') --"Released" & "Running"PRINT @Found_ScheduleIDPRINT @Found_ScheduleIDhiSELECT CASE T0.ScheduleSchedNum WHEN (@Found_ScheduleID IS NULL) AND (@Found_ScheduleIDhi IS NULL) THEN --Schedule not found '!' AS 'Message'-- BEGIN-- SELECT '!' AS 'Message'-- ENDEND |
|
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. |
 |
|
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' |
 |
|
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 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
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 queryset ANSI_NULLS ONset QUOTED_IDENTIFIER ONGODECLARE @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 ONDECLARE @Found_ScheduleID VARCHAR(20), @Found_ResourceID VARCHAR(35), @ProductionDate DATETIME, @BlockMethod INTEGER, @Found_ScheduleIDhi VARCHAR(20), @Found_ResourceIDhi VARCHAR(35), @ProductionDatehi DATETIME, @BlockMethodhi INTEGERSELECT @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 = 1LEFT OUTER JOIN smResc T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID AND T2.ParentClassID = 10459 AND T2.CollectionID = 0 AND T2.CalcValResource = @ResourceWHERE 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 = 1LEFT OUTER JOIN smReschi T2 (NOLOCK) ON T2.ParentObjectID = T1.ObjectID AND T2.ParentClassID = 10459 AND T2.CollectionID = 0 AND T2.CalcValResource = @ResourceWHERE T0.ScheduleSite = @OperatorSite AND T0.ScheduleSchedNum = @Schedule AND T0.SchedStatus IN ('1','2','3') --"Released" & "Running"PRINT @Found_ScheduleIDPRINT @Found_ScheduleIDhiSELECT 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 71Only one expression can be specified in the select list when the subquery is not introduced with EXISTS." |
 |
|
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 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
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? |
 |
|
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 |
 |
|
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 metExample:IF @foo = 'bar'BEGIN SELECT '!' AS [Message] RETURN -- An optional int error value hereEND Then in the rest of the code just SELECT whatever output you did want.Charlie===============================================================Msg 3903, Level 16, State 1, Line 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
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 |
 |
|
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 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION |
 |
|
|
|
|
|
|