web-dev-qa-db-fra.com

Utiliser une procédure stockée pour insérer des données dans une table

J'essaie de créer une procédure stockée qui insère des données dans ma table, mais j'obtiens des erreurs telles que 

Nom de colonne invalide

Pour toutes les colonnes que j'ai spécifiées dans ma procédure stockée. J'ai une IDENTITY COLUMN appelée ID qui s'incrémente d'une unité à chaque enregistrement. J'ai aussi quelques autres colonnes dans la table mais elles peuvent être nulles. Voici ma procédure stockée et ne peut pas comprendre ce que je fais mal ici. 

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

Voici la définition de la table:

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
7
user1858332

Si vous avez la définition de table pour avoir une colonne IDENTITY, par exemple. IDENTITY (1,1) alors n'incluez pas MyId dans votre instruction INSERT INTO. Le point IDENTITY est qu'il lui donne la prochaine valeur inutilisée en tant que valeur de clé primaire.

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

Il n'est alors pas nécessaire de passer le paramètre @MyId dans votre procédure stockée. Alors changez le en:

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

AS 

Si vous voulez savoir quel est l'ID de l'enregistrement nouvellement inséré, ajoutez

SELECT @@ IDENTITY 

à la fin de votre procédure. par exemple. http://msdn.Microsoft.com/en-us/library/ms187342.aspx

Vous serez alors en mesure de choisir la méthode que vous appelez, qu'elle soit SQL ou .NET.

P.s. Un meilleur moyen de vous montrer que la définition de la table aurait consisté à créer un script pour la table et à coller le texte dans la fenêtre de votre navigateur stackoverflow, car votre capture d'écran manque de la partie des propriétés de la colonne où IDENTITY est défini via l'interface graphique. Pour ce faire, cliquez avec le bouton droit de la souris sur la table "Table de script en tant que" -> "CRÉER en" -> Presse-papiers. Vous pouvez également faire une expérience dans un fichier ou dans une nouvelle fenêtre de l'éditeur de requêtes (toutes explicites) et voir ce que vous obtenez.

4
Matthew Radford

si vous souhaitez remplir une table dans SQL Server, vous pouvez utiliser l'instruction while comme suit:

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

J'espère que ça aide. 

0
Manuel Pérez