Cómo actualizar el valor de una columna específica en SQL – sql sql-server stored-procedure

Pregunta:


la pregunta es como puedo actualizar el valor de una columna específica en SQL sin tener que enviar datos de los otros campos, me explico con el código.

tengo el siguiente Stored Procedure

ALTER PROCEDURE [dbo].[spUpdateCredito]
 @CreditoID int,
 @PersonaID int,
 @NumeroCuotas int,
 @EstadoCredito int,
 @MontoAprovado decimal (18,2),
 @Plazo int,
 @FechaCredito datetime,
 @Tasa decimal (4,2)
AS
 BEGIN
  UPDATE Credito SET
      PersonaID = @PersonaID,
      NumeroCuotas = @NumeroCuotas,
      EstadoCredito = @EstadoCredito,
      MontoAprovado = @MontoAprovado,
      Plazo = @Plazo,
      FechaCredito = @FechaCredito,
     Tasa = @Tasa
  WHERE
   CreditoID = @CreditoID
  END

en una rutina se necesita cambiar SOLO EstadoCredito pero no quiero actualizar las demas columnas.

si lo ejecuto desde sql manager seria asi:

EXEC    @return_value = [dbo].[spUpdateCredito]
    @CreditoID = 3,
    @PersonaID = NULL,
    @NumeroCuotas = NULL,
    @EstadoCredito = 5,
    @MontoAprovado = NULL,
    @Plazo = NULL,
    @FechaCredito = NULL,
    @Tasa = NULL

 SELECT 'Return Value' = @return_value

pero no quiero que me deje columnas en null

si solo quiero que me actualice la columna especifica, ejecuto el script

EXEC    @return_value = [dbo].[spUpdateCredito]
    @CreditoID = 3,
    @EstadoCredito = 5


SELECT  'Return Value' = @return_value

Sale el siguiente error

Msg 201, Level 16, State 4, Procedure spUpdateCredito, Line 0 [Batch Start Line 2]
El procedimiento o la función ‘spUpdateCredito’ esperaba el parámetro ‘@PersonaID’, que no se ha especificado.

Solicitando los otros columnas, como seria para que se actualice la columna especifica

UPDATE NO ES CREAR Otra rutina o script es utilizar esta misma.

Preguntado por: ger

Patricio Moracho

En primer lugar el error lo obtienes por que los parámetros del Sp esperan que les pases un valor, para que no sea necesario hacerlo hay que definirle un valor default a cada uno, por ejemplo:

ALTER PROCEDURE [dbo].[spUpdateCredito]
          @CreditoID int,  -- Este debiera ser el único obligatorio
          @PersonaID int = NULL,
...

Y así con cada parámetro. Ahora el problema lo tienes en que al no definir un parámetro el valor del mismo será NULL lo cual es algo que no queremos ya que lo estamos usando en un UPDATE, una posibilidad es preguntar mediante un IF si el valor NO es NULL y entonces disparar el UPDATEsolo para ese campo:

IF @PersonaID IS NOT NULL
BEGIN
  UPDATE Credito SET
         PersonaID = @PersonaID
         WHERE CreditoID = @CreditoID
END

El problema que tiene esto es que seguramente estamos ejecutando múltiples UPDATE uno por cada campo. La alternativa a esto es usar una sola sentencia de UPDATE pero con ISNULL en cada parámetro, en caso que el mismo sea NULL actualizaremos con el mismo valor:

  UPDATE Credito SET
         PersonaID = ISNULL(@PersonaID, PersonaID),
         ...
         WHERE CreditoID = @CreditoID

Con estos dos consejos tu SP podría quedar así:

ALTER PROCEDURE [dbo].[spUpdateCredito]
 @CreditoID int, -- Este debiera ser el único obligatorio
 @PersonaID int = NULL,
 @NumeroCuotas int = NULL,
 @EstadoCredito int = NULL,
 @MontoAprovado decimal (18,2) = NULL,
 @Plazo int = NULL,
 @FechaCredito datetime = NULL,
 @Tasa decimal (4,2) = NULL
AS
 BEGIN
  UPDATE Credito SET
      PersonaID = ISNULL(@PersonaID,PersonaID),
      NumeroCuotas = ISNULL(@NumeroCuotas,NumeroCuotas)
      EstadoCredito = ISNULL(@EstadoCredito,EstadoCredito)
      MontoAprovado = ISNULL(@MontoAprovado,MontoAprovado)
      Plazo = ISNULL(@Plazo,Plazo)
      FechaCredito = ISNULL(@FechaCredito,FechaCredito)
      Tasa = ISNULL(@Tasa, Tasa)
  WHERE
   CreditoID = @CreditoID
  END

Un comentario más, si quisiéramos ser super exquisitos, hay ciertas situaciones que eventualmente quisiéramos evitar:

  1. Que todos los parámetros sean NULL
  2. Que los valores de los parámetros sean idénticos a los de la tabla

Claramente en estos dos casos no habría sentido hacer el UPDATE, una forma sencilla de controlarlo es en la misma sentencia de UPDATE, agregando más condiciones al WHERE:

WHERE
   CreditoID = @CreditoID
   AND ( 
          ( (PersonaId IS NULL AND @PersonaID IS NOT NULL) OR PersonaID <> ISNULL(@PersonaID, PersonaID))
          OR ( (NumeroCuotas IS NULL AND @NumeroCuotas IS NOT NULL) OR NumeroCuotas <> ISNULL(@NumeroCuotas, NumeroCuotas))
          ...
       )

Y por último es importante aclarar que esta forma de actualizar los datos no permitiría eventualmente modificar una columna para que la misma sea NULL, es decir por ejemplo “nullear” FechaCredito, esto se puede resolver pero habría que modificar un poco la lógica, usando algún “Flag” que “fuerze” el NULL en estos caso.

La rutina almacenada está hecha para actualizar todos los campos,
por tal seria mejor crear una rutina nueva para actualizar solo esos datos y pasar menos parametros o condicionar dentro del procedimiento en base a los valores nulos. por ejemplo

if isnull(@parametroX) and isnull(parametroY) then
//consulta de actualizacion de cierta cantidad de campos
else
//consulta de actualizacion de todos los campos
end if;

Fuente

Related Posts:

Remover 0 de resultado de fecha – sql sql-server
Pregunta: Realizo este comando para traerme la fecha en un formato YYYY/MM/DD: DECLARE @SomeExampleDate DATETIME; SELECT @SomeExampleDate = '2016/08/20'; SELECT STUFF(REPLACE('/'+CONVERT(CHAR(10),@SomeExampleDate,102), '.', '/'),1,1,'') Pero quiero que la fecha que ...
Como Insertar Fecha en SQLite – sql sqlite sqlite3
Pregunta: Tengo una consulta: Tengo una tabla en SQLite con esta estructura CREATE TABLE ( VARCHAR(50) NULL, TIMESTAMP NULL, TIMESTAMP NULL ...
¿Cómo obtener todos los registros duplicados en postgresql? – sql postgresql
Pregunta: Como podría obtener todos los registros duplicados en base a una columna, por ejemplo tengo la tabla codigo: ╔════╦══════════╦══════════╗ ║ id ║ codigo_1 ║ codigo_2 ║ ╠════╬══════════╬══════════╣ ║ ...
Problema con UTF_8 – php sql sql-server
Pregunta: Buen día, mi problema es el siguiente, Php me lanza el siguiente Warning Warning: utf8_decode() expects parameter 1 to be string, object given ...
¿Cómo utilizar `count` para contabilizar la cantidad de registros para distintos valores de un campo en mysql? – php mysql sql
Pregunta: Resulta que tengo un campo llamado ESTADO en mi tabla. En este campo hay varias estados de pedido que son: LOGÍSTICA, PACKING, PICKING, CARTERA, ...
Insertar en una tabla registros basados en el resultado de una consulta – mysql sql
Pregunta: Estoy intentando que insertar una fila nueva con unos datos por cada valor que de un SELECT. Os dejo la última query que se me ...
Seleccion desde varias tablas – asp.net sql-server entity-framework
Pregunta: Tengo esta consulta que funciona bien var rest = (from de in se.DeliveryConfiguration ...
Problema con los Index Primary Key identity dan saltos enormes en tablas. – sql sql-server
Pregunta: En algunas ocasiones la base de datos me han dado salto digamos que de de ir en 200,000 hasta 250,000 o incluso mayores. Alguna ...
¿Como usar una sentencia Case en Mysql? – mysql sql
Pregunta: Tengo dos tablas una es la de detalle de producto y la otra es la de producto, el problema radica en que yo quiero ...
Inconvenientes con Store Procedure – sql sql-server
Pregunta: Estoy realizando un SP para realizar una búsqueda específica con parametros, pero me trae el siguiente error. ¿Cómo solucionarlo? Msg 137, Level 15, ...
buscar las 3 fechas más antiguas en SQL – mysql sql
Pregunta: Tengo un problema con una consulta. La tabla tiene los siguientes campos: Tabla1 --------+-----------+---------+------------------ Id | Inicio | Fin ...
SQL Error 18456 al conectarme al servidor – sql sql-server
Pregunta: Estoy teniendo problemas para conectarme con "SQL Sever Authentication". Cuando instalé el programa en la parte de Database Engine Configuration seleccioné modo de autenticación ...
Cómo importar datos de un Excel a DataGrid pero iniciarlo en la segunda fila? – c# sql-server postgresql
Pregunta: Disculpen una duda, como cargar de excel un formato iniciando en la segunda fila? tengo este código solamente que el excel esta justificado en ...
Clausula Count(*) dentro de un select – sql sql-server
Pregunta: Tengo la siguiente consulta SQL. Lo que no se como hacer es que el count(*), me devuelva una columna mas, con el total de registros. La ...
¿Como puedo tomar un dato de una DB y sumarlo a otro dato de tipo DateTime en C#? – c# sql-server windows-forms
Pregunta: Mi duda es esta: Estoy usando Visual Studio 2015, y estoy programando en C# para Windows Forms, el caso que es tengo una variable ...

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *