Tsql Case语句中的RAISERROR

Tsql Case语句中的RAISERROR,tsql,case,raiserror,Tsql,Case,Raiserror,您不能在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_n

您不能在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

正如我在评论中所说的,我认为简单地创建一个标记,在
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.... 

将Case/When视为对单个数据段进行操作。如果你这样想的话,你的很多问题都会消失

If/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

如果您试图用TSQL错误地完成整个调用,那么数据类型不匹配将终止该方法。在我的案例中起作用,因为这是一个繁重的过程,我需要知道是否正确转移了。如果我的记录集>1,那么我知道我会失败。如果在.NET环境中使用SSI或多个方法,则此功能非常有用。您可以通过将错误字符串转换为int,从大小写表达式中引发错误

select case (select count(*) from mytable)
  when 1 then 100 
  when 2 then 200
  else convert(int, 'ERROR')
end
这会给出一条错误消息,如

将varchar值“ERROR”转换为int数据类型时,转换失败。

这是你能得到的最好的结果

并非所有失败的转换都会在错误消息中给出输入字符串。例如,转换为datetime不需要。因此,如果您的case表达式返回datetime,您仍然需要通过字符串到整数的转换来触发错误:

select case (select count(*) from mytable)
  when 1 then getdate()
  else convert(datetime, convert(int, 'ERROR'))
end
更糟糕的是:如果要返回日期,就不能显式地将其从int转换为int,因此必须使用

convert(date, convert(char(1), convert(int, 'ERROR')))

这很可怕,但在我看来,唯一比干净代码更重要的是信息性错误消息,所以我接受它。

创建一个标志,并在
CASE
语句中设置它的值。然后根据此标志的值调用
RAISERROR
SELECT
语句…我不明白您的意思。这看起来与我需要的非常接近,但我仍然得到一个语法错误(当我声明@I时,我试图*做类似的事情-我仍然得到语法错误,现在它似乎忽略了变量I和我的_标志的声明(如果我将“at”保留在中,它认为我试图标记某人)。'关键字'CASE'附近的语法错误您的代码将无法工作。您需要将其更改为设置@myFlag=CASE(条件)当1然后1当0然后0其他-1end@GMastros好的,谢谢你的帮助-一旦我旅行回来,我会尝试这个。我仍然想知道,从最初的问题-你不能在一个案例陈述中提出错误吗?从你发布的内容来看,我假设答案是否定的,对吗?你知道-有什么原因你不能这样做吗韩:“你不能”哈哈,这是一个关于事务处理的问题,我觉得奇怪的是,你不能像其他语言一样把错误扔到你想要的地方。时间错误,对吗?Ex:x=throwError+7甚至不会编译。在其他语言中,您使用CASE语句来控制逻辑流。在T-SQL中不是这样。在T-SQL中,您使用If/Then来控制逻辑流。确保您可以…切换(条件){案例1:执行某项操作;中断;案例2:抛出新异常(“对某项的无效调用”);案例3:做点什么;中断;默认值:抛出新异常(“idk something”)}是的-我在C#VB和Java中使用case语句-只是出于某种原因SQL语法让我感到不舒服…本质上我试图在SQL…switch(选择计数(1)…{案例1:返回(选择项_Num)案例0:抛出新的SqlException(“未找到记录”);案例1:抛出新的SqlException(“找到重复记录”);默认值:抛出新的SqlException();//这将是一个实际的SQL异常},因此我想要么rtn该标量值(例如对象o=cmd.ExecuteScalar();)然后抛出异常您应该能够使用我显示的代码作为您编码的基础。只需使用您想要的功能替换打印语句。这无助于我学会正确使用SQL case语句。有几种替代方法-我可以在后端处理它。我想知道我在SQL case状态下做错了什么是的。
convert(date, convert(char(1), convert(int, 'ERROR')))