1

現在、小さなデータベース プロジェクトに取り組んでいますが、すでに問題が発生しています。生成されたスクリプトが下に投稿されている 2 つのテーブルがあり、最初のレコードの ID を使用して、最初に小さい方のレコードを追加し、2 番目のレコードの隣にレコードを追加する手順を作成しようとしています。しかし、「列名または指定された値の数がテーブル定義と一致しません」というエラーが表示されます。テーブル Klienci にデフォルト値を追加しようとする行で。列や引数がないため、何が起こっているのかわかりません。少なくともこのような問題はありません。

最初のテーブル:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[KlienciIndywidualni](
    [IDKlientaIndywidualnego] [int] IDENTITY(1,1) NOT NULL,
    [IDKlienta] [int] NOT NULL,
    [Imie] [nvarchar](50) NOT NULL,
    [Nazwisko] [nvarchar](50) NOT NULL,
    [NumerLegitymacji] [int] NULL,
    [Adres] [nvarchar](50) NOT NULL,
    [Miasto] [nvarchar](50) NOT NULL,
    [KodPocztowy] [nvarchar](50) NOT NULL,
    [Kraj] [nvarchar](50) NOT NULL,
    [Telefon] [int] NOT NULL,
    [Email] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_KlienciIndywidualni] PRIMARY KEY CLUSTERED 
(
    [IDKlientaIndywidualnego] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[KlienciIndywidualni]  WITH CHECK ADD  CONSTRAINT [FK_KlienciIndywidualni_Klienci] FOREIGN KEY([IDKlienta])
REFERENCES [dbo].[Klienci] ([IDKlienta])
GO

ALTER TABLE [dbo].[KlienciIndywidualni] CHECK CONSTRAINT [FK_KlienciIndywidualni_Klienci]
GO

ALTER TABLE [dbo].[KlienciIndywidualni]  WITH CHECK ADD  CONSTRAINT [CK_KlienciIndywidualni] CHECK  ((len([Telefon])>=(9)))
GO

ALTER TABLE [dbo].[KlienciIndywidualni] CHECK CONSTRAINT [CK_KlienciIndywidualni]
GO

ALTER TABLE [dbo].[KlienciIndywidualni]  WITH CHECK ADD  CONSTRAINT [CK_KlienciIndywidualni_mail] CHECK  (([Email] like '%@%.[a-z][a-z][a-z]'))
GO

ALTER TABLE [dbo].[KlienciIndywidualni] CHECK CONSTRAINT [CK_KlienciIndywidualni_mail]
GO

二つ目:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Klienci](
    [IDKlienta] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_Klienci] PRIMARY KEY CLUSTERED 
(
    [IDKlienta] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,   ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

手順:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE dodaj_klienta_indywidualnego 
-- parametry
@Imie nvarchar(50),
@Nazwisko nvarchar(50),
@Adres nvarchar(50),
@KodPocztowy nvarchar(50),
@Miasto nvarchar(50) ,
@Kraj nvarchar(50),
@Telefon int,
@Email nvarchar(50),
@NumerLegitymacji nvarchar(50) = null

AS
BEGIN

SET NOCOUNT ON;
declare @IDKlienta as int;

begin try
    begin tran
    --dodaj klienta
    INSERT INTO Klienci
    DEFAULT VALUES
    set @IDKlienta = @@IDENTITY;

    --dodaj klienta indywidualnego
    INSERT INTO KlienciIndywidualni
    VALUES(@IDKlienta, @Imie, @Nazwisko, @Adres, @Miasto, 
    @KodPocztowy, @Kraj, @Telefon, @Email);
    COMMIT TRAN
end try
begin catch
    declare @error as varchar(127)
    set @error = (Select ERROR_MESSAGE())
    RAISERROR('Nie mozna dodac osoby-klienta, blad danych. %s', 16, 1, @error);
    ROLLBACK TRAN
end catch
END
GO
4

1 に答える 1

2

2 番目の挿入には 10 個のパラメーターが必要です。指定したのは 9 個だけです。NumerLegitymacjiフィールドをスキップする場合は、各列をその名前で指定する必要があります。これは、挿入が最後の NOT NULL 列を待機するためです。

    --dodaj klienta indywidualnego
    INSERT INTO KlienciIndywidualni (
    IDKlienta,
    Imie,
    Nazwisko,
    Adres,
    Miasto,
    KodPocztowy,
    Kraj,
    Telefon,
    Email
)
    VALUES(@IDKlienta, @Imie, @Nazwisko, @Adres, @Miasto, 
    @KodPocztowy, @Kraj, @Telefon, @Email);
    COMMIT TRAN
于 2013-01-18T22:56:27.827 に答える