web-dev-qa-db-fra.com

INSERT INTO s'il n'existe pas de serveur SQL

J'ai une base de données structurée comme suit:

utilisateurs

userid (Primary Key)
username

groupe

groupid (PK)
groupName

Groupes d'utilisateurs

userid (Foreign Key)
groupid (Foreign Key)

La première fois qu'un utilisateur se connecte, j'aimerais que ses informations soient ajoutées à la table des utilisateurs. Donc, essentiellement, la logique que je voudrais avoir si

if (//users table does not contain username)
{
INSERT INTO users VALUES (username);
}

Comment puis-je faire cela intelligemment en utilisant SQL Server/C #?

14
Simon Kiely

Ou en utilisant la nouvelle syntaxe MERGE:

merge into users u
using ( 
   select 'username' as uname
) t on t.uname = u.username
when not matched then 
  insert (username) values (t.uname);
19

En gros, vous pouvez le faire comme ceci: 

IF NOT EXISTS (SELECT * FROM USER WHERE username = @username)
    INSERT INTO users (username) VALUES (@username)

Mais sérieusement, comment allez-vous savoir si un utilisateur a visité votre site Web pour la première fois? Vous devez insérer des enregistrements dans l'utilisateur de la table, lorsque quelqu'un s'inscrit sur votre site Web, pas vous connecter.

10
user194076
IF NOT EXISTS (select * from users where username = 'username')
BEGIN
    INSERT INTO ...
END
3
Sascha

Je voudrais d'abord créer un proc stocké sur la base de données pour faire la vérification et insérer si nécessaire:

CREATE PROCEDURE AddNewUserProc
(
@username       VarChar(50) -- replace with your datatype/size
)

AS

    IF NOT EXISTS (SELECT * FROM users WHERE username = @username)
    BEGIN
        INSERT INTO users
        VALUES (@username)
    END

Ensuite, une méthode sur l'application qui appellera cette procédure

public void AddNewUserMethod(string userName)
{
    SqlConnection connection = new SqlConnection("connection string");
    SqlCommand command = new SqlCommand("AddNewUserProc", connection);

    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("username", SqlDbType.VarChar, 50).Value = userName;

    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    finally
    {
        if (connection.State == ConnectionState.Open) { connection.Close(); }
    }
}
3
Jason

@gbn answer nécessite SQL Server 2008 ou supérieur. J'ai essayé une méthode non-fusion pour le faire. Moche peut-être, mais ça marche. 

declare @user varchar(50)
set @user = 'username'
insert into users (username) 
select @user
where not exists (
 select username 
 from users 
 where username = @user
);

Si vous souhaitez tester l'une des réponses, voici le code SQL de la table - 

CREATE TABLE [dbo].[users](
    [userid] [int] NULL,
    [username] [varchar](50) NULL
)

INSERT [dbo].[users] ([userid], [username]) VALUES (1, N'John')
INSERT [dbo].[users] ([userid], [username]) VALUES (2, N'David')
INSERT [dbo].[users] ([userid], [username]) VALUES (3, N'Stacy')
INSERT [dbo].[users] ([userid], [username]) VALUES (4, N'Arnold')
INSERT [dbo].[users] ([userid], [username]) VALUES (5, N'Karen')
1
Steam

Le code suivant est une méthode qui renvoie 0 si l'utilisateur existe déjà et renvoie le nouvel utilisateurIDqui vient d'être ajouté:

  private int TryToAddUser(string UserName)
        {
            int res = 0;
            try
            {
                string sQuery = " IF NOT EXISTS (select * from users where username = @username) \n\r" + 
                " BEGIN \n\r" + 
                "     INSERT INTO users values (@username) \n\r" + 
                " SELECT SCOPE_IDENTITY() \n\r " + 
                " END \n\r " + 
                " ELSE SELECT 0";
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
                {
                    cmd.CommandText = sQuery;
                    cmd.Parameters.AddWithValue("@username",UserName);
                    cmd.Connection = new System.Data.SqlClient.SqlConnection("SomeSqlConnString");
                    cmd.Connection.Open();
                    res = (int)cmd.ExecuteScalar();
                    cmd.Connection.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return res;
        }
1
Amen Ayach

Il y a une solution simple! Je l'ai trouvé dans ce post !

INSERT INTO users (Username) 
SELECT ('username')
WHERE NOT EXISTS(SELECT * FROM users WHERE Username= 'username')

Dans mon projet, je devais le faire avec 2 valeurs. Donc mon code était:

INSERT INTO MyTable (ColName1, ColName2) 
SELECT 'Value1','Value2' 
WHERE NOT EXISTS
(SELECT * FROM MyTable WHERE ColName1 = 'Value1' AND ColName2= 'Value2')

J'espère que cela t'aides!

0
levkaster

Voici un exemple (probablement trop simplifié) qui aborde votre problème. Notez qu'il est toujours préférable d'utiliser des paramètres pour empêcher les attaques par injection, en particulier lors de la vérification des utilisateurs.

CREATE PROCEDURE AddUser
  @username varchar(20)
AS
  IF NOT EXISTS(SELECT username FROM users WHERE username=@username)
    INSERT INTO users(username) VALUES (@username)
0
ron tornambe