es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MS SQL Server: El nombre de columna o el número de valores suministrados no coincide con la definición de la tabla.

Mi definición de tabla:

CREATE TABLE [dbo].[Action](
[ActionId] [int] IDENTITY(1,1) NOT NULL,
[ActionType] [nvarchar](50) NOT NULL,
[Initiator] [nvarchar](256) NOT NULL,
[Date] [datetime] NOT NULL, 
CONSTRAINT [PK_Action] PRIMARY KEY CLUSTERED 
(
    [ActionId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

Código que intento ejecutar:

create trigger delete_on_titles on titles
after delete
as
    begin
        insert into Action (ActionType, Initiator, Date) values ('Add', USER_NAME(), getdate());

        declare @id int = @@identity;
        insert into Old_titles select * from deleted
        update Old_titles set ActionId = @id where ActionId is null
    end

Pero obtengo el mensaje de error:

Msg 213, Level 16, State 1, Procedure delete_on_titles, Line 15 [Batch Start Line 2]
Column name or number of supplied values does not match table definition.

en la línea "insert into Action (ActionType, Initiator, Date) values ('Add', USER_NAME(), getdate());"

¿Qué estoy haciendo mal?

ACTUALIZADO:
Gracias a @Larnu. Sí, el problema estaba en la línea:

insert into Old_titles select * from deleted

Lo cambié por:

insert into Old_titles (
title_id, title, type, pub_id, price, 
advance, royalty, ytd_sales, notes, pubdate) 
select * from deleted

donde title_id, title, type, pub_id, price, advance, royalty, ytd_sales, notes, pubdate son columnas de la tabla deleted, y funciona.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el número o nombres de las columnas que se están insertando en la tabla ‘Action’ no coinciden con la definición de la tabla. Dado que no podemos ver la definición de la tabla ‘Old_titles’, es probable que el error se encuentre en la línea:

    insert into Old_titles select * from deleted
    

    Esto intenta insertar todas las columnas de ‘deleted’ en ‘Old_titles’, pero si las dos tablas tienen diferentes nombres o números de columnas, causará un error al intentar insertar.

    Para solucionar esto, debes especificar explícitamente las columnas que se están insertando en ‘Old_titles’ y asegurarte de que coinciden con las columnas en ‘deleted’. Por ejemplo:

    insert into Old_titles (title_id, title, type, pub_id, price, advance, royalty, ytd_sales, notes, pubdate)
    select title_id, title, type, pub_id, price, advance, royalty, ytd_sales, notes, pubdate from deleted
    

    Esto asume que ‘title_id, title, type, pub_id, price, advance, royalty, ytd_sales, notes, pubdate’ son las columnas tanto en ‘Old_titles’ como en ‘deleted’. Asegúrate de ajustarlo para que coincida con las definiciones específicas de tus tablas.

Comments are closed.