找到一个字符串,它拆分字符串

时间:2011-06-09 09:13:36

标签: sql

我在数据库表中有一个“SelectedCustomers”列,其中包含管理员正在编辑的所有客户现在正在编辑详细信息。例如,它可以包含此字符串'111,222,333',这意味着在当前时间管理器被选中以使用这些ID 111,222和333编辑客户。如果另一个经理正在尝试编辑已由第一个经理编辑的客户,则第二个经理应该收到错误,阻止他编辑这个客户。这个检查应该在sql中保存。并且让我们说检查商店程序获得nvarchard“CheckCustomers”这个值:'234,222,341'。并且因为第二个经理正在尝试编辑已经被第一个经理选择编辑的id为222的客户。第二个经理将收到错误消息。 sql查询应该怎么做? (我已经有了“分裂”功能。)

SELECT * FROM dbo.test WHERE dbo.Split(SelectedCustomers)IN (CheckCustomers)

3 个答案:

答案 0 :(得分:1)

为什么不在客户的表中添加另一列'IsBeingEdited'?你可以简单地说:

SELECT id FROM customer WHERE id IN (CheckCustomers) AND IsBeingEdited = 1;

该列表显示当前正在编辑的客户的ID,对(并且可以轻松改为其他列名称)?所以你也可以向第二位经理展示。

答案 1 :(得分:0)

您可以使用CROSS APPLY执行此操作。

IF EXISTS (
    SELECT S.CustomerID
    FROM dbo.test T
    CROSS APPLY dbo.Split(T.SelectedCustomers) S
    CROSS APPLY dbo.Split(T.CheckCustomers) C
    WHERE S.CustomerID = C.CustomerID
)
BEGIN
    RAISERROR('Customer is locked by another user', 16, 0)
END

答案 2 :(得分:0)

我建议改变这种设计。任何时候都需要执行诸如拆分字符串以获取字符串中的“隐藏”字段之类的内容,这违反了使用关系数据库的基本原则之一,即一行中的每个字段都应存储单个值。这可以使用吗?大概。这样做是个好主意吗?不在我看来。

正如其他人所指出的,有几种方法可以改变设计。可以将一列添加到Customer表以指示客户已被锁定。可以使用包含CustomerID和经理ID的单独表(例如,CustomerLocked) - 这将允许添加附加信息,例如客户被锁定的时间等,如果有人要锁定一个,这可能是有用的。客户,然后离开他们的办公桌。

我相信这些变化中的任何一个都能满足要求。例如,假设创建了一个LockedCustomer表:

Table LockedCustomer
  CustomerID    NUMBER  PRIMARY KEY
  ManagerID     VARCHAR
  AddDate       DATE

让我们说经理A锁定了客户111,222和333;因此,在LockedCustomer表中将存在以下行:

CustomerID      ManagerID
111             A
222             A
333             A

现在来了经理B,他希望锁定客户222.应用程序管理员B正在尝试将新行插入LockedCustomer表,如下所示:

INSERT INTO LockedCustomer (CustomerID, ManagerID)
  VALUES (222, 'B');

此语句应该失败,因为表中已存在CustomerID 222,而CustomerID列是LockedCustomer上的主键。这是有道理的,因为我们只希望给定的CustomerID在任何时间点在LockedCustomer表中最多存在一次。应用程序管理器B正在使用然后可以检测INSERT由于主键约束违规而失败,并且将理解这意味着此时客户无法被锁定。通过重新查询LockedCustomer表以获取其他数据,如:

SELECT *
  FROM LockedCustomer
  WHERE CustomerID = 222

应用程序可以向Manager B显示一个可能类似于

的对话框
The customer you wished to edit (222) is currently in use
by Manager A since 03-Jun-2011 2:17 PM.  Would you like to
  A) Wait
  B) Send an email to Manager A
  C) Take a long vacation
  D) Violate company policy regarding alcohol consumption
     during working hours
Please select one of the above options?

分享并享受。