2016-06-29 14 views
2

Ich habe eine Tabelle, sagt ‚Tabelle 1‘ wie untenaktualisiert mehrere Werte in einer Tabelle in einer einzigen Abfrage

Table1 
    --------------- 
    Name | Value 
    ---------------- 
    name1 | val1 

    name2 | val2 

    name3 | val3 

    name4 | val4 

hier I Feld ‚Werte‘ aktualisieren muß gezeigt, basierend auf ‚Namen‘

I hat unter gespeicherte Prozedur verwendet, dies zu tun,

CREATE PROCEDURE [dbo].[UpdateDetails] 
(
    @name1 NVARCHAR(MAX) = NULL, 
    @name2 NVARCHAR(MAX) = NULL, 
    @name3 NVARCHAR(MAX) = NULL, 
    @name4 NVARCHAR(MAX) = NULL, 
) 
AS 
BEGIN 
    UPDATE Table1 SET Value = @name1 WHERE Name = 'name1'; 
    UPDATE Table1 SET Value = @name2 WHERE Name = 'name2'; 
    UPDATE Table1 SET Value = @name3 WHERE Name = 'name3'; 
    UPDATE Table1 SET Value = @name4 WHERE Name = 'name4'; 
END 

was wäre der beste Weg sein, um diese Tabelle zu aktualisieren?

+0

Ihr sp sieht wie gut aus. Du hast 4 Param oder? – NEER

+0

@Hebele, In meinem aktuellen Szenario gibt es 9 Parameter, und ich muss alle diese Felder aktualisieren. –

Antwort

2

diesen Code Versuchen:

UPDATE Table1 
SET Value = CASE Name WHEN 'name1' THEN @name1 
         WHEN 'name2' THEN @name2 
         WHEN 'name3' THEN @name3 
         WHEN 'name4' THEN @name4      
      END 
WHERE Name in ('name1', 'name2', 'name3', 'name4'); 
+0

@JaydipJ Was ist ein Fehler in dieser Syntax? – Swapnil

+0

Ich denke, die Where-Klausel ist nicht erforderlich. –

+1

@Jobin Wenn Sie die where-Klausel nicht verwenden, wird die Value-Spalte für alle anderen Datensätze mit einem anderen Namen als name1, name2, name3 oder name4 auf NULL gesetzt. – Swapnil

2

Sie können dafür eine Anweisung CASE verwenden. Ich empfehle Ihnen, eine ELSE-Anweisung am Ende hinzuzufügen. Der untere Teil filtert, sodass Sie nur die Zeilen aktualisieren, nach denen Sie suchen.

UPDATE Table1 SET Value = 
        CASE WHEN Name = 'name1' THEN @name1 
          WHEN Name = 'name2' THEN @name2 
          WHEN Name = 'name3' THEN @name3 
          WHEN Name = 'name4' THEN @name4 
          ELSE Value 
        END 
WHERE Name in ('name1','name2','name3','name4') 
+1

WHERE Bedingung ist falsch. Es sollte Name in name1, name2, etc. überprüfen. – Swapnil

+0

@Swapnil Korrigiert, danke! Obwohl wir die gleiche Antwort hatten, sieht es so aus, als ob Ihre von Jobin ausgewählt wurde. –

-1

Sie können vielmehr eine dynamische SQL-Abfrage verwenden. Etwas wie unten. Ich würde wie pass Wert1, Name1 und Iterate auf Prozedur aufrufen.

CREATE PROCEDURE [dbo].[UpdateDetails] 
    (
    @l_value NVARCHAR(MAX) = NULL, 
    @l_name NVARCHAR(MAX) = NULL, 
    @sql NVARCHAR(MAX) 
    ) 
    AS 
    BEGIN 
    SELECT @sql = 'UPDATE Table1 SET Value = [' + @l_value + '] WHERE Name =['+ @l_name + '] ' 

    EXEC sp_executesql @sql 

    END 
0

Sie haben gesagt, nicht explizit so, aber in der Regel, wenn Sie dies tun, Sie wissen nicht, zum Zeitpunkt Codierung, wie viele Zeilen in der Tabelle sind, noch wie viele von ihnen Sie auf jedem zu aktualisierenden gegebener Moment. Der schnellste Weg, um damit fertig zu werden, besteht darin, die Schleife in das C# zu setzen. Sie benötigen zwei Parameter @name und @value, die Sie außerhalb der Schleife erstellen. Anschließend ändern Sie einfach ihre Werte für jede Iteration der Schleife. Ihr Code sieht also so aus ...

Dictionary<string, string> myUpdates = new Dictionary<string, string>(); 
myUpdates.Add("name1", "value1"); 
myUpdates.Add("name2", "value2"); 
myUpdates.Add("name3", "value3"); 
myUpdates.Add("name4", "value4"); 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand("UPDATE Table1 set value = @value where name = @name", connection); 
    var nameParam = new SqlParameter("name", System.Data.SqlDbType.NVarChar); 
    var valueParam = new SqlParameter("value", System.Data.SqlDbType.NVarChar); 
    command.Parameters.Add(nameParam); 
    command.Parameters.Add(valueParam); 
    connection.Open(); 
    foreach (var item in myUpdates) 
    { 
     try 
     { 
      nameParam.Value = item.Key; 
      valueParam.Value = item.Value; 
      command.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

"Name" und "Wert" sind beunruhigend abstrakte Namen für DB-Spalten. Im Allgemeinen sollten Ihre DB-Spaltennamen enger mit der "realen Welt" verknüpft sein. Sie sind wahrscheinlich nur Beispiele?

Verwandte Themen