Domanda

Oh grande StackOverflow, ti supplico ... Devo fare quanto segue:

CREA INDICE UNICO Nome utente ON Emp (Nome utente) - Sheesh!

UPDATE Emp SET
UserName = Left(FirstName,1)+LastName

DOVE NON esiste già un dipendente con quel Nome utente.

È stato utile?

Soluzione

Ciò consentirà comunque i duplicati ... ma se vuoi quello che hai detto,   Prova questo (esattamente quello che hai detto):

UPDATE Emp SET
   UserName = Left(FirstName,1) + LastName
Where Not Exists (Select * From Emp 
                  Where UserName = Left(FirstName,1) + LastName)

Immagino, tuttavia, che tu stia cercando di evitare duplicati, non semplicemente resettare UserNames dove nessuno esistente è uguale al nuovo valore proposto. In tal caso, dovresti aggiungere un indice univoco sulla colonna userName, ma prima esegui questo:

UPDATE Emp SET
   UserName = Left(FirstName,1) + LastName
Where  Not Exists 
             (Select * From Emp 
              Where UserName = Left(FirstName,1) + LastName)
    And Not Exists 
             (Select * From Emp 
              Group By Left(FirstName,1) + LastName
              Having Count(*) > 1)

Ciò ripristinerà tutti i nomi utente che possono essere ripristinati senza creare duplicati. (Non eliminerà i duplicati esistenti). Se non ci sono duplicati dopo questo, è possibile applicare l'indice.

Altri suggerimenti

Vorrei mettere un indice univoco sul nome utente e utilizzare:

UPDATE IGNORE Emp SET UserName = Left(FirstName,1)+LastName

Se il tuo database lo supporta;)

Sì, nel caso in cui non leggessi più in basso, il nome utente dovrebbe essere Unico, inoltre mi assicurerei che ci sia qualcos'altro nella clausola where perché sarà una query intensa.

Puoi prendere in considerazione la possibilità di scrivere una funzione per fare ciò in modo da aggiungere alla fine qualche altra unicità o ID se esiste (Count (*) dove userName come Username).

UPDATE Emp SET
UserName = Left(FirstName,1)+LastName
WHERE
UserName not in (Select UserName From Emp Where UserName = Left(FirstName,1) + LastName)

In primo luogo, il campo del tuo nome utente dovrebbe avere un indice univoco. Se non lo fai, t i tuoi dati sono a rischio da qualcuno che aggiorna senza usare la tua piccola dichiarazione di aggiornamento. I suggerimenti sul codice corrente non ti danno un esempio di come gestire l'impostazione del nome utente se viene utilizzato quello esistente, cosa vuoi fare? Questo dovrebbe far parte del tuo processo. L'utente ha bisogno di un nome utente.

solo per mostrare qui è un modo per gestire l'incremento del nome utente fino a quando non ne ottieni uno che non esiste. Questo esempio è un inserto non un aggiornamento, ma penso che tu possa usarlo come punto di partenza. Usando questo metodo (e questo è per un record alla volta inserimenti), nessuno entra mai nel sistema con un nome utente duplicato e non vengono generati errori se esiste una corrispondenza esatta, si sposta semplicemente per trovare la corrispondenza successiva.

CREATE PROC [dbo].[ins_MyUserTable]
(
@userID int,
@Login varchar(255)
)

As

DECLARE 

@ValidateUserName varchar(50),
@NewUserName varchar(50),
@CheckUserName varchar(50),
@Holding int

-- Get User Name (first letter of first name + last name)
SELECT @NewUserName = @Login
SET @Holding = 0

-- Examine User Name (must be unique)
SELECT @ValidateUserName = 1

WHILE @ValidateUserName = 1
  BEGIN
    -- Check for Login
    SELECT @CheckUserName = (SELECT TOP 1 login FROM MyUserTable WHERE login = @NewUserName)

    IF @CheckUserName = @NewUserName
      BEGIN
                    SELECT @Holding = @Holding + 1
        SELECT @NewUserName = @Login + Convert(varchar(2), @Holding)
      END
    ELSE
      BEGIN
        SELECT @ValidateUserName = 0
      END
  END
    -- Insert  into MyUserTable 
    INSERT INTO MyUserTable
      ([user_id], login)
    VALUES
      (@userID, @NewUserName) 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top