it-swarm.com.de

INSERT INTO, falls kein SQL Server vorhanden ist

Ich habe eine Datenbank, die wie folgt aufgebaut ist:

Benutzer

userid (Primary Key)
username

Gruppe

groupid (PK)
groupName

Benutzergruppen

userid (Foreign Key)
groupid (Foreign Key)

Wenn sich ein Benutzer zum ersten Mal anmeldet, möchte ich, dass seine Informationen zur Benutzertabelle hinzugefügt werden. Also im Grunde die Logik, die ich gerne hätte, wenn

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

Wie kann ich dies auf intelligente Weise mit SQL Server/C # ausführen?

14
Simon Kiely

Oder mit der neuen MERGE-Syntax:

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

Grundsätzlich kannst du es so machen: 

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

Aber im Ernst, wie werden Sie wissen, ob Benutzer Ihre Website zum ersten Mal besucht haben? Sie müssen Datensätze in den Tabellenbenutzer einfügen, wenn sich jemand auf Ihrer Website registriert, nicht anmelden.

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

Ich würde zuerst eine gespeicherte Prozedur auf der Datenbank erstellen, um die Überprüfung durchzuführen und gegebenenfalls einzufügen:

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

Dann eine Methode in der App, die diese Prozedur aufruft

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 benötigt SQL Server 2008 oder höher. Ich habe einen Non-Merge-Weg ausprobiert. Hässlich vielleicht, aber es funktioniert. 

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

Wenn Sie eine der Antworten testen möchten, finden Sie hier die SQL für die Tabelle. 

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

Der folgende Code ist eine Methode, die 0 zurückgibt, wenn der Benutzer bereits existiert, und den neuen BenutzerIDzurückgibt, der gerade hinzugefügt wurde:

  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

Es gibt eine einfache Lösung! Ich habe es in diesem post gefunden!

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

In meinem Projekt musste ich es mit 2 Werten machen. Also mein Code war:

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

Hoffe das hilft!

0
levkaster

Hier ist ein (möglicherweise stark vereinfachtes) Beispiel, das Ihr Problem anspricht. Beachten Sie, dass es am besten ist, Parameter zu verwenden, um Injektionsangriffe zu verhindern, insbesondere wenn Benutzer überprüft werden.

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