-1

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

所以,我想创建一个存储过程,它可以为任何给定的操作返回适当的员工徽章编号。

我的专长是 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

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

4

2 回答 2

2

我看到至少两个问题

  1. 用 if else 替换大小写
  2. 使用动态 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;'

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

于 2013-04-19T17:55:27.530 回答
1

CASE是一个返回单个值的表达式。您不能像您尝试的那样将它用于控制流逻辑。根据条件(硬编码的字符串集),您可能的意思是这样的(用您尝试的语法悄悄地解决其他几个问题):

  ... 

  SELECT @op=upper(@operation);

  IF @op = 'CLERK'
  BEGIN
      INSERT @table (NUM) 
        SELECT '000988'
        UNION ALL SELECT '001508'
        UNION ALL SELECT '003790'
        UNION ALL SELECT '007912';
  END

  IF @op = 'HRMANAGER'
  BEGIN
      INSERT @table (NUM) 
        SELECT '003035';
  END

  IF @op = 'HUMANRESOURCES'
  BEGIN
      INSERT @table (NUM) 
        SELECT '002864'
        UNION ALL SELECT '005491';
  END

  IF @op = 'INFORMATIONTECHNOLOGY'
  BEGIN
       INSERT @table (NUM) 
         SELECT '001258'
         UNION ALL SELECT '003423'
         UNION ALL SELECT '007135'
         UNION ALL SELECT '007546'
  END

  SELECT NUM from @table order by NUM;

  ...
于 2013-04-19T17:54:54.550 回答