【问题标题】:Use stored procedure to insert some data into a table使用存储过程向表中插入一些数据
【发布时间】:2013-01-03 15:51:43
【问题描述】:

我正在尝试创建将一些数据插入到我的表中的存储过程,但是我遇到了一些错误,例如

列名无效

对于我在存储过程中指定的所有列。我有一个名为 ID 的 IDENTITY COLUMN,每次插入记录时都会增加一。表中还有其他一些列,但它们可以为空。这是我的存储过程,无法弄清楚我在这里做错了什么。

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

【问题讨论】:

  • 显示你的表定义。
  • 如果它是一个标识列,您只需将其从列列表中排除。您可能还想添加一个 try/catch。
  • 我刚刚添加了表定义。我还添加了身份列,但仍然出现相同的错误。感谢您的帮助
  • dbo.MainTable 肯定存在于MyDb 数据库中吗?
  • 您能否添加一个 CREATE TABLE 脚本来显示更多信息,而不是表中列的图像?最简单的方法是右键单击 Management Studio 中的表,然后从菜单中选择 SCRIPT Table 作为 Create to Clipboard。

标签: sql-server tsql stored-procedures


【解决方案1】:

如果您的表定义有一个 IDENTITY 列,例如IDENTITY(1,1) 然后不要在您的 INSERT INTO 语句中包含 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 的方式来选择它。

附:向您展示表格定义的更好方法是编写表格脚本并将文本粘贴到您的 stackoverflow 浏览器窗口中,因为您的屏幕截图缺少通过 GUI 设置 IDENTITY 的列属性部分。为此,请右键单击表“将表编写为”-->“创建到”--> 剪贴板。您还可以体验 File 或 New Query Editor Window(所有自我解释),看看您得到了什么。

【讨论】:

  • MyID 不是 identity 字段。身份字段是id
  • 是的,这是真的 MyID 不是身份。身份列称为 ID。我已经用脚本更新了表定义。谢谢
  • 好吧,在这种情况下,我刚刚将您的代码编写到新数据库中并运行存储过程。为我插入的记录。
  • 永远不要使用@@IDENTITY,使用SCOPE_IDENTITY(),如果您需要询问原因,请进行谷歌搜索。
【解决方案2】:

如果您尝试返回范围内的 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

【讨论】:

    【解决方案3】:

    如果要在 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
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      相关资源
      最近更新 更多