【发布时间】:2021-02-23 18:29:54
【问题描述】:
这是我的条件:
-
如果 workorderi id = 13 -i.e valid number and allworkorderid=' ' 则只打印一个 workorderid
-
如果 workorderid = 1666666 - invalidnumber 并且 allworkorderid=' ' 则打印 invalidnumber
-
如果 workorderid = 845u485u45u4 - invalidnumber 并且 allworkorderid='yes' 然后打印 allworkorderid
-
如果 workorderid = 13 -validnumber 并且 allworkorderid='yes' 则打印 allworkorderid 。
-
如果 workorderid=845u485u45u4 -invalidnumber 和 allworkorderid='no' 则打印无效字符
除了第五个条件外,所有条件都有效。它显示两条消息,但我只希望这些条件的字符串优先
例如:
- 133333,'no' 应该是一个无效字符,无论它是什么数字,如果它不是,它应该显示无效字符。
这是我的代码:
CREATE OR ALTER PROCEDURE Sp_workorders
(@workorderid INT,
@allworkerid VARCHAR(20))
AS
BEGIN
--this is used to check the id , if it exists below condition will execute or else ,it will print as invalid number
IF EXISTS (SELECT wo.workorderid, wr.productid
FROM adventureworks2019.production.workorder wo
INNER JOIN adventureworks2019.production.workorderrouting wr
ON wo.workorderid = wr.workorderid
WHERE wo.workorderid = @workorderid
GROUP BY wo. workorderid, wr.productid)
BEGIN
--this will run if exists is true
IF (@workorderid = @workorderid AND @allworkerid = ' ')
SELECT Workorders.workorderid,
productid,
countofoperationsequence,
countoflocationid,
max_operationseq,
max_locationid,
completionduration,
latedays,
category
FROM
(SELECT wo.workorderid,
wo.productid,
Count(operationsequence) CountofOperationSequence,
Count(locationid) CountofLocationID,
Max(operationsequence) Max_operationSeq,
Max(locationid) Max_LocationID
FROM
adventureworks2019.production.workorder WO
INNER JOIN
adventureworks2019.production.workorderrouting WR
ON WO.workorderid = WR.workorderid
GROUP BY wo.workorderid, wo.productid) Workorders
INNER JOIN
(SELECT
workorderid,
DATEDIFF(DAY, startdate, enddate)
CompletionDuration ,
DATEDIFF(DAY, duedate, enddate) LateDays,
CASE
WHEN enddate > duedate
THEN 'Delayed Completion of Work Order'
WHEN enddate = duedate
THEN 'On time Completion of Work Order'
WHEN enddate < duedate
THEN 'Advance Completion of Work Order'
END AS Category
FROM
adventureworks2019.production.workorder) DaysforCompletingwork ON Workorders.workorderid = DaysforCompletingwork.workorderid
WHERE
Workorders.workorderid = @workorderid
END
ELSE--Else it will execute this
BEGIN
PRINT 'invalid number'
END
--it is used to check only one parameter which is string ,whatever the first parameter it ignores it ,it will check only yes.
IF ( @allworkerid = 'yes ' or @allworkerid=' ' )
--calling a second procedure which is saved as a seperate file
EXEC Sp_workorders2
@workorderid=@workorderid,
@allworkerid=@allworkerid
ELSE
PRINT 'invalid character'
END
--Scenarios:
--exec Sp_workorders 13,'' -- working fine
-- exec Sp_workorders 13,'yes'--working fine
-- exec Sp_workorders 13,'no'--working fine
-- exec Sp_workorders 137777,'yes '--working fine whatever workorderidnumber it should give only precedence to only yes
-- exec Sp_workorders 137788,'no' -- not working ,showing both the messages here i want to print message as invalid character
【问题讨论】:
-
附注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@workorderid = @workorderid不是必需的,因为它始终为真(除非它为空,否则它将不起作用)。对于您正在做的事情,@allworkerid似乎应该是bit而不是varchar。
标签: sql sql-server tsql if-statement stored-procedures