你能否在T-SQL的case语句中引发错误?我总是遇到SQL case语句的问题:/
begin try
declare @i int
--set @i = (select COUNT(1) from table_name)
select Item_Num =
CASE (select COUNT(1) from table_name)
when 1 then (select Item_Num from table_name)
when 0 then (raiserror('No records in database', 0, 0))
ELSE (raiserror('Multiple records in database', 0, 0))
END
from table_name
end try
begin catch
declare @errormsg nvarchar(1024),
@severity int,
@errorstate int;
select @errormsg = error_message(),
@severity = error_severity(),
@errorstate = error_state();
raiserror(@errormsg, @severity, @errorstate);
end catch
答案 0 :(得分:4)
考虑案例/何时对单个数据进行操作。如果你这样想,你的很多问题就会消失。
如果/ Then用于控制逻辑流程。
这样的事情对你有用。
declare @i int
set @i = (select COUNT(1) from table_name)
If @i = 1
Begin
Print "1 row"
End
Else If @i = 0
Begin
Print "no rows"
End
Else
Begin
Print "too many rows"
End
答案 1 :(得分:1)
正如我在评论中所说,我认为简单地创建一个你在CASE
语句范围之外检查的标志会更容易。有点像:
--- code before the TRY...
BEGIN TRY
DECLARE @i int
-- declare a variable to act as a flag
DECLARE @my_flag as int
-- than change your statement to simply fill the value of the flag
CASE (SELECT COUNT(1) FROM table_name)
WHEN 1 THEN SET @my_flag = 1
WHEN 0 THEN SET @my_flag = 0
ELSE SET @my_flag = -1
END
IF (NOT @my_flag in (-1, 0))
BEGIN
SET @Item_Num = (SELECT Item_Num FROM table_name) -- consider a filter here
END
ELSE
BEGIN
IF (-1 = @my_flag) RAISERROR('too many records', 0, 0)
IF (0 = @my_flag) RAISERROR('no records', 0, 0)
END
END TRY
BEGIN CATCH
--- rest of the code goes here....
答案 2 :(得分:1)
您可以通过将错误字符串转换为int来引发case表达式中的错误。
select case (select count(*) from mytable)
when 1 then 100
when 2 then 200
else convert(int, 'ERROR')
end
这会显示类似错误消息
Conversion failed when converting the varchar value 'ERROR' to data type int.
这与您将要获得的效果差不多。
并非所有失败的转换都会在错误消息中提供输入字符串。例如,不转换为日期时间。因此,如果您的case表达式返回日期时间,则仍然必须使用字符串到整数的转换来触发错误:
select case (select count(*) from mytable)
when 1 then getdate()
else convert(datetime, convert(int, 'ERROR'))
end
情况变得更糟:如果您要返回日期,则无法将其显式转换为int,因此您必须求助于
convert(date, convert(char(1), convert(int, 'ERROR')))
这非常可怕,但是在我看来,比干净的代码更重要的是信息错误消息,所以我忍受了它。
答案 3 :(得分:0)
With #TempTable as
(
Select * from ...
-- record set that determines if I should error out
)
SELECT CASE WHEN COUNT(1) > 0
THEN 'Multiple records in database'
ELSE 0
END AS [Value]
FROM #TempTable
如果您尝试使用TSQL错误地调用整个调用,则数据类型不匹配将终止该方法。在我的案例中工作,因为这是一个我需要知道的重要过程被正确转移。如果我的记录集是> 1,那么我知道我应该失败这个。如果您在.NET环境中使用SSIS或多种方法,则非常有用