-1

数据库中有一个 INT 类型的列(Sql server)。

这个 int 值用于位标志,所以我将对它进行 AND'ing 和 OR'ing。

我必须将一个参数传递到我的存储过程中,该参数将代表一个特定的标志项。

我通常会使用枚举并将 int 表示传递给 sproc,但由于许多不同的模块将访问它,因此它们都拥有我的枚举定义是不切实际的(如果它被更改,那将是一个令人头疼的问题推出)。

所以我应该使用“字符串”还是幻数作为参数值,然后在我的存储过程中我会这样做:

IF(@blah = 'approved')
BEGIN
      // bit banging here
END
4

2 回答 2

2

您可以使用字符串和 CASE 构造:

CREATE PROCEDURE BitBang(@Flag AS VARCHAR(50), @Id AS INT)
AS
BEGIN
  DECLARE @Bit INT

  SET @BIT = CASE @Flag
    WHEN 'approved'   THEN 16
    WHEN 'noapproved' THEN 16
    WHEN 'fooflag'    THEN 8
    WHEN 'nofooflag'  THEN 8
  END

  IF @Bit IS NOT NULL
  BEGIN
    IF LEFT(@Flag, 2) = 'no' 
    BEGIN
      UPDATE TheTable SET BitField = BitField & ~@Bit WHERE Id = @Id
    END
    ELSE
    BEGIN
      UPDATE TheTable SET BitField = BitField | @Bit WHERE Id = @Id
    END
  END
END
于 2008-12-05T16:35:28.543 回答
0

为什么不使用旧的 0 和 1 作为标志?它已经被广泛接受为位开关,对于 0 和 1 的含义不会有任何混淆或拼写错误。除非你说会有超过 2 个标志并且超过 1 个标志将具有相同的最终含义

于 2008-12-05T16:24:51.060 回答