9

テーブルにデータを挿入するストアドプロシージャを作成しようとしていますが、次のようなエラーが発生します。

列名が無効です

ストアドプロシージャで指定したすべての列。レコードが挿入されるたびに1ずつ増加するIDというIDENTITYCOLUMNがあります。テーブルには他にもいくつかの列がありますが、それらはnullになる可能性があります。これが私のストアドプロシージャであり、ここで何が間違っているのか理解できません。

USE MYDB
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_Test]
  @myID bigInt,
  @myFirstName nvarchar(50)
  ,@myLastName nvarchar(50)
  ,@myAddress nvarchar(MAX)
   ,@myPort int

AS 
BEGIN 

 SET NOCOUNT ON; 

  BEGIN 

insert into MYDB.dbo.MainTable (MyID, MyFirstName, MyLastName, MyAddress, MyPort)
values(@myID, @myFirstName, @myLastName, @myAddress, @myPort)

  END 

END
GO

テーブルの定義は次のとおりです。

USE [MYDB]
GO

/****** Object:  Table [dbo].[MainTable]    Script Date: 01/03/2013 11:17:17 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[MainTable](
    [ID] [bigint] IDENTITY(1,1) NOT NULL,
    [MyID] [bigint] NULL,
    [MyFirstName] [nvarchar](50) NULL,
    [MyLastName] [nvarchar](50) NULL,
    [MyAddress] [nvarchar](max) NULL,
    [MyPort] [int] NULL,
    [MyZipCode] [nchar](10) NULL,
    [CompName] [nvarchar](50) NULL
) ON [PRIMARY]

GO
4

3 に答える 3

6

IDENTITY列を持つテーブル定義(IDENTITY(1,1)など)がある場合は、INSERTINTOステートメントにMyIdを含めないでください。IDENTITYのポイントは、主キー値として次の未使用の値を与えることです。

insert into MYDB.dbo.MainTable (MyFirstName, MyLastName, MyAddress, MyPort)
values(@myFirstName, @myLastName, @myAddress, @myPort)

その場合、@MyIdパラメータをストアドプロシージャに渡す必要もありません。したがって、次のように変更します。

CREATE PROCEDURE [dbo].[sp_Test]
@myFirstName nvarchar(50)
,@myLastName nvarchar(50)
,@myAddress nvarchar(MAX)
,@myPort int

AS 

新しく挿入されたレコードのIDを知りたい場合は、

@@IDENTITYを選択

手順の最後まで。例: http: //msdn.microsoft.com/en-us/library/ms187342.aspx

これにより、SQLまたは.NETと呼んでいる方法でこれを取得できるようになります。

テーブルの定義を表示するためのより良い方法は、テーブルのスクリプトを作成し、テキストをスタックオーバーフローブラウザウィンドウに貼り付けることです。これは、GUIを介してIDENTITYが設定されている列のプロパティ部分がスクリーンショットにないためです。これを行うには、テーブル'Script Table as'->'CREATEto'->Clipboardを右クリックします。また、ファイルまたは新しいクエリエディタウィンドウ(すべて自明)を経験して、何が得られるかを確認することもできます。

于 2013-01-03T16:22:09.783 に答える
0

スコープ内のIDを返そうとしている場合は、を使用SCOPE_IDENTITY()する方が適切な方法です。@@IDENTITYこれは任意のIDを返す可能性があるため、使用することはお勧めしません。

CREATE PROC [dbo].[sp_Test] (
  @myID int output,
  @myFirstName nvarchar(50),
  @myLastName nvarchar(50),
  @myAddress nvarchar(50),
  @myPort int
) AS
BEGIN
    INSERT INTO Dvds (myFirstName, myLastName, myAddress, myPort)
    VALUES (@myFirstName, @myLastName, @myAddress, @myPort);

    SET @myID = SCOPE_IDENTITY();
END
GO
于 2020-05-24T03:22:24.720 に答える
-1

SQL SERVERにテーブルを設定する場合は、次のようにwhileステートメントを使用できます。

declare @llenandoTabla INT = 0;
while @llenandoTabla < 10000
begin
insert into employeestable // Name of my table
(ID, FIRSTNAME, LASTNAME, GENDER, SALARY) // Parameters of my table
VALUES 
(555, 'isaias', 'perez', 'male', '12220') //values
set @llenandoTabla = @llenandoTabla + 1;
end

それが役に立てば幸い。

于 2018-01-11T22:52:28.490 に答える