none
Actualizar campo de varios registros SqlServer. RRS feed

  • Pregunta

  • Buenas.

    Estoy tratando de actualizar un campo de una cierta cantidad de registros, y no he logrado concretarlo favor necesito su ayuda.

    he avanzado con esto.

    Declare @Docentes table (nombres nvarchar(30), dni nvarchar(8), nivel nvarchar(15))
    insert into @Docentes values('Miguel Cisneros',	'11111111', 'Primaria')
    insert into @Docentes values('Andres Añaguari',	'22222222', 'Primaria')
    insert into @Docentes values('Daniel Garcia',	'33333333', 'Primaria')
    insert into @Docentes values('Maria Levano',	'44444444', 'Primaria')
    insert into @Docentes values('Andrea Loayza',	'55555555', 'Primaria')
    insert into @Docentes values('Pedro Aquino',	'66666666', 'Primaria')
    insert into @Docentes values('Ana Felipa',	'77777777', 'Primaria')
    insert into @Docentes values('Zandra Saavedra',	'88888888', 'Primaria')
    
    update @Docentes 
    set nivel = REPLACE(nivel, 'Primaria', 'Secundaria')
    where dni = dni //Aqui quiero seleccionarlos de acuerdo al DNI para poder actualizarlos
    select * from @Docentes

    pero me cambia todos los registros y si (dni = '11111111') solo me actualiza el de miguel.

    ejemplo: me arroja esto al ejecutar el codigo 

    nombres		dni		nivel
    Miguel Cisneros	11111111	Secundaria
    Andres Añaguari	22222222	Secundaria
    Daniel Garcia	33333333	Secundaria
    Maria Levano	44444444	Secundaria
    Andrea Loayza	55555555	Secundaria
    Pedro Aquino	66666666	Secundaria
    Ana Felipa	77777777	Secundaria
    Zandra Saavedra	88888888	Secundaria

    pero lo que estoy buscando es que solo 5 campos varíen los de Andres, Maria, Andrea,Pedro y Zandra, algo asi:

    nombres		dni		nivel
    Miguel Cisneros	11111111	Secundaria
    Andres Añaguari	22222222	Primaria
    Daniel Garcia	33333333	Secundaria
    Maria Levano	44444444	Primaria
    Andrea Loayza	55555555	Primaria
    Pedro Aquino	66666666	Primaria
    Ana Felipa	77777777	Secundaria
    Zandra Saavedra	88888888	Primaria
    Espero me ayuden de antemano gracias.


    • Editado jesusalf domingo, 19 de febrero de 2017 16:46
    domingo, 19 de febrero de 2017 16:44

Respuestas

  • jesusalf,

    ¿Cuál es el criterio de selección de los registros a actualizar? ¿La selección lo realizas desde la aplicación? 

    Si la selección lo realizas desde la aplicación podrías obtener la lista en una cadena e "inyectarla" como argumento del operador IN, si haces uso de procedimientos almacenados podrías definir un parámetro de tipo tabla. Por otro lado, te recomiendo que seas más especifico si deseas obtener respuestas más precisas.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta jesusalf domingo, 19 de febrero de 2017 18:47
    domingo, 19 de febrero de 2017 17:44

Todas las respuestas

  • jesusalf,

    La expresión (dni = dni) retorna True en todas las lecturas, por tanto todas las filas son actualizadas. 

    La expresión (dni = '11111111') retorna True cuando el valor de la columna [dni] sea igual a '1111111', para el ejemplo sólo existe una fila que cumpla con la condición, en consecuencia será la única fila actualizada.

    Para filtrar por mas de un valor puedes combinar expresiones de comparación con el operador lógico OR o puedes simplificar la operación utilizando el predicado IN(Lista):

    UPDATE @Docentes 
    SET 
        nivel = 'Secundaria'
    WHERE dni IN ('22222222', '44444444', '55555555', '66666666', '88888888');
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    domingo, 19 de febrero de 2017 17:01
  • Exacto pude hacerlo de esta forma pero como hago para cientos de registros?

    lo que quisiera es que seleccione una cierta cantidad de registros y una vez seleccionados actualice el nivel de todos ellos. 

    domingo, 19 de febrero de 2017 17:22
  • jesusalf,

    ¿Cuál es el criterio de selección de los registros a actualizar? ¿La selección lo realizas desde la aplicación? 

    Si la selección lo realizas desde la aplicación podrías obtener la lista en una cadena e "inyectarla" como argumento del operador IN, si haces uso de procedimientos almacenados podrías definir un parámetro de tipo tabla. Por otro lado, te recomiendo que seas más especifico si deseas obtener respuestas más precisas.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta jesusalf domingo, 19 de febrero de 2017 18:47
    domingo, 19 de febrero de 2017 17:44
  • Si gracias es justamente lo que voy a realizar desde la aplicacion almacenando los registros en un datagridview y con un foreach. Queria saber si se podia hacer directamente desde Sql. 
    domingo, 19 de febrero de 2017 18:47
  • jesusalf,

    Claro, la idea es contener en una cadena los elementos seleccionados (bajo la forma: 'Val1', 'Val2', 'Val3'), la cadena -conteniendo la lista- se "inyecta" como argumento del operador IN, algo como:

    //Obtener lista de documentos seleccionados: '1111', '2222', '4444'
    string lista = string.Format("'{0}'", string.Join("', '", 
    			dataGridView1.Rows.Cast<DataGridViewRow>().Where(x => x.Selected)
    			.Select(x => Convert.ToString(x.Cells["dni"].Value)).ToArray()));
    
    string ConsultaSql = string.Format(@"UPDATE Docentes SET nivel = 'Secundaria' 
    				WHERE dni IN({0});", lista);
    
    SqlCommand cmd = new SqlCommand(ConsultaSql, cn);
    
    //Ejecutar consulta
    cmd.ExecuteNonQuery();

    No olvides escribir el espacio de nombres: using System.Linq;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    domingo, 19 de febrero de 2017 19:07