C# 如何基于CASE语句返回数据库结果?

C# 如何基于CASE语句返回数据库结果?,c#,tsql,sql-server-2000,C#,Tsql,Sql Server 2000,我现在有一个应用程序,它将特殊的用户角色硬连接到可执行文件中。它是防篡改的,但是当涉及到新员工、角色变更等时,它有点混乱 因此,我想创建一个存储过程,它可以为任何给定的操作返回适当的员工证号 我的专长是C#开发,但我也是SQL Server(2000)数据库的工作人员 这是我的开始,但T-SQL根本不喜欢这样 CREATE PROCEDURE sp1_GetApprovalBadges(@operation varchar(50)) as BEGIN -- SET NOCOUNT ON

我现在有一个应用程序,它将特殊的用户角色硬连接到可执行文件中。它是防篡改的,但是当涉及到新员工、角色变更等时,它有点混乱

因此,我想创建一个存储过程,它可以为任何给定的操作返回适当的员工证号

我的专长是C#开发,但我也是SQL Server(2000)数据库的工作人员

这是我的开始,但T-SQL根本不喜欢这样

CREATE PROCEDURE sp1_GetApprovalBadges(@operation varchar(50)) as
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
    SET NOCOUNT ON;
  declare @op varchar(50); 
  declare @num varchar(50); 
  declare @table table (NUM varchar(50) null);

  select @op=upper(@operation);
  case
    when @op='CLERK' then
      insert into @table (NUM) values (@num) where @num in ('000988','001508','003790','007912') end
    when @op='HRMANAGER' then
      insert into @table (NUM) values (@num) where @num in ('003035') end
    when @op='HUMANRESOURCES' then
      insert into @table (NUM) values (@num) where @num in ('002864','005491') end
    when @op='INFORMATIONTECHNOLOGY' then
      insert into @table (NUM) values (@num) where @num in ('001258','003423','007135','007546') end
    end;
    SELECT NUM from @table order by NUM;
END
GO

我意识到这与我编写的代码非常相似,与数据库无关,但拥有数据库为我提供了存储和执行一些脚本的好方法,我可以根据需要修改这些脚本,以保持应用程序正常工作。

CASE
是一个返回单个值的表达式。您不能像正在尝试的那样使用它来控制流逻辑。根据条件(硬编码字符串集),您可能是指这样的情况(悄悄地考虑您尝试的语法的其他几个问题):


我至少看到两个问题

  • 用if ELSE替换外壳
  • 使用动态sql执行表变量
  • 比如说

    if @op='CLERK'
      begin
          exec 'insert into ' + @table + '(NUM) values (' + @num + ') where' + @num + 'in    (''000988'',''001508',''003790',''007912'')' 
      end
      else if @op='HRMANAGER'
      begin
          i-- see above
      end
      else if @op='HUMANRESOURCES'
      begin
        -- see above
      end
      else if @op='INFORMATIONTECHNOLOGY'
      begin
          -- see above
      end
    
      exec 'SELECT NUM from' + @table + 'order by NUM;'
    

    语法可能不准确,但想法会奏效

    您收到的错误是什么?你如何从应用程序中调用它?它是否在MSSMS中运行?
    CASE
    是一个返回单个值的表达式。您不能像正在尝试的那样使用它来控制流逻辑。另外,您的插入语法非常不正确。@num的这些值应该来自哪里?错误只是
    关键字“Where”附近的语法不正确。
    对于每一行。我相信有更好的方法,但这对我来说是最快的启动和运行的方法
    @table
    是一个表变量,而不是表示表名的字符串。看起来像我要做的。Management Studio在“插入到”附近说了不正确的语法。如果这看起来像你想要做的,那么你需要在问题中更好地解释这一点,因为它听起来不像你已经解释过的,或者看起来不像你尝试过的示例代码。为什么这样做SQL对C#家伙来说效率不高?@jp2code因为SQL不是OOP?您认为SQL人员觉得迭代有效吗?[Touche!]基本上,这是一次插入多个项目的唯一方法,不过?@jp2code在SQL Server 2000中?是的,这是我在使用13岁以上的软件时经常使用的技术。一个关心性能的C#家伙使用SQL Server 2000有什么原因吗?:-)因为我的雇主太便宜了,不能升级!仅供参考,我可能会删除此帖子。此后,我使用短语multipleinsert进行搜索,找到了许多点击,其中有几个被关闭为“太本地化”
    if @op='CLERK'
      begin
          exec 'insert into ' + @table + '(NUM) values (' + @num + ') where' + @num + 'in    (''000988'',''001508',''003790',''007912'')' 
      end
      else if @op='HRMANAGER'
      begin
          i-- see above
      end
      else if @op='HUMANRESOURCES'
      begin
        -- see above
      end
      else if @op='INFORMATIONTECHNOLOGY'
      begin
          -- see above
      end
    
      exec 'SELECT NUM from' + @table + 'order by NUM;'