在更新/插入之前检查是否存在动态值

时间:2014-10-30 11:50:14

标签: sql-server function sql-server-2008-r2 sql-update

我正在尝试使用值批量更新表列,但我需要查询以检查此值是否已存在。如果确实如此,则在再次检查并更新表之前进行相关更改。

数据库主要保存员工信息,我需要创建一个唯一的用户名,创建用户名的脚本是:

select upper(LEFT(first_name,1))+LEFT(surname,3)+'1' 
from staff_test

如果用于示例用户,则会为用户username生成ABit1 Andrew Bithell。我需要做的是检查ABit1表中是否已有username STAFF_TEST,如果是,则将安卓用户名更改为ABit2,因为用户名必须在移动到下一个用户之前是唯一的。

我创建了另一个表,列出了将现有用户名拆分为2列的所有当前用户名,因此它们在此表中显示为

column1 | column2
------------------
ABit    |1

我已经尝试过一个函数,我现在认为Merge语句可能就是这样。

欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

使用row_number可以一次生成所有唯一名称:

select 
    upper(LEFT(first_name,1))+LEFT(surname,3)+ 
        rtrim(row_number() over (partition by upper(LEFT(first_name,1))+LEFT(surname,3) ))
   ,first_name
   ,surname
from staff_test

答案 1 :(得分:0)

执行前期检查以查看是否存在任何冲突:

SELECT  UPPER(LEFT(first_name, 1)) + LEFT(surname, 3) + '1' AS username ,
        COUNT(1) counter
FROM    staff_test
GROUP BY UPPER(LEFT(first_name, 1)) + LEFT(surname, 3) + '1'
HAVING  COUNT(1) > 1
ORDER BY COUNT(1) DESC

这将返回您员工表上的每个用户名,按用户名分组,以及每个用户的出现次数。

您可以清理数据(如果这是您要查找的内容),否则我建议您为每条记录添加Id列值或其他一些唯一值,而不是{{ 1}}在最后。