存储过程太多参数错误

时间:2014-04-23 14:45:14

标签: sql-server tsql

我写了以下存储过程: 其中有2个表艺术和艺术家.artistId是艺术表中的外键。

create procedure spInsertArts(
     @artsId int out,
     @name varchar(50),
     @category varchar(50),
     @artistId int
     )
     as
          begin
            declare @artistId int
    set @artistId=@@IDENTITY

            if exists(select artistId from artist)
              insert into arts(name,category,artistId) values(@name,@category,@artistId)
           end

我收到的错误是:

  

过程或函数spInsertArts指定了太多参数。

用于调用此过程的代码是:

cmd.CommandType = System.Data.CommandType.StoredProcedure; 
cmd.Parameters.AddWithValue("@name", TextBox1.Text); 
cmd.Parameters.AddWithValue("@category", DropDownList1.SelectedValue); 
SqlParameter output = new SqlParameter(); 
output.ParameterName = "@artsId"; 
output.SqlDbType = System.Data.SqlDbType.Int; 
output.Direction = System.Data.ParameterDirection.Output; 
cmd.Parameters.Add(output); 
con.Open(); 
cmd.ExecuteNonQuery();

请帮助

3 个答案:

答案 0 :(得分:0)

您没有为参数@artistId传递任何值 传递值或更改过程并将其设置为默认值null,请参见下文:

cmd.Parameters.AddWithValue("@artistId", "VALUE_HERE"); 

OR

create procedure spInsertArts(
     @artsId int out,
     @name varchar(50),
     @category varchar(50),
     @artistId int = null
     )

答案 1 :(得分:0)

output.ParameterName = "@artsId";

您使用的"@artsId"应该是"@artistId"

答案 2 :(得分:0)

根据您的评论,您希望使用艺术家表中最后插入的记录,您想要使用:

DECLARE @artistId INT = IDENT_CURRENT('dbo.Artist');

或者只是

DECLARE @artistId INT = (SELECT MAX(ArtistID) FROM dbo.Artist);

CREATE PROCEDURE dbo.spInsertArts
    @name       VARCHAR(50), 
    @category   VARCHAR(50), 
    @artsId     INT OUT
AS
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT 1 FROM dbo.Artist)
    BEGIN

        DECLARE @artistId INT = (SELECT MAX(ArtistID) FROM dbo.Artist);

        INSERT dbo.Arts (Name, Category, ArtistID)
        VALUES (@Name, @Category, @ArtistID);

        SET @ArtsID = SCOPE_IDENTITY();
    END
END

我对您的代码进行了以下更改:

Aaron Bertrand写了一篇名为My stored procedure "best practices" checklist的好文章,我倾向于坚持,虽然其中一些是个人偏好,但对我来说这一切都是合乎逻辑的。

我真的不同意这种逻辑,它会使你的程序完全不灵活。如果您需要为不是最新艺术家的艺术家插入艺术品,该怎么办?如果插入最后一位艺术家是一个真正的要求,那么我建议有两个程序:

CREATE PROCEDURE dbo.spInsertArts
    @name       VARCHAR(50), 
    @category   VARCHAR(50), 
    @ArtistID   INT,
    @artsId     INT OUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT dbo.Arts (Name, Category, ArtistID)
    VALUES (@Name, @Category, @ArtistID);
END
GO
CREATE PROCEDURE dbo.spInsertArtsWithLatestArtist
    @name       VARCHAR(50), 
    @category   VARCHAR(50), 
    @artsId     INT OUT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @artistId INT = (SELECT MAX(ArtistID) FROM dbo.Artist);

    IF @ArtistID IS NOT NULL
    BEGIN
        EXECUTE dbo.spInsertArts @name, @category, @ArtistID, @artsID OUT;
    END
END