存储过程询问空列的输入

时间:2012-06-17 19:02:37

标签: sql-server-2008 tsql stored-procedures sql-server-2008-r2

我有两个主外键关系表。 外键关系中的表有一些列可以为null(不是fk列) 当我使用除了可以接受空值(Path1,Path2,... Path5)的列之外的所有输入值运行以下sp时,编译器抛出Path1,Path2 ... Path5不能为空的错误。

ALTER PROCEDURE [dbo].[Submit_Product]
    @SubjectId uniqueidentifier,
    -- ... other required parameters ...

    -- optional parameters:
    @Path1 nvarchar(75),
    @Path2 nvarchar(75),
    @Path3 nvarchar(75),
    @Path4 nvarchar(75),
    @Path5 nvarchar(75)
AS
...

2 个答案:

答案 0 :(得分:4)

我猜这个错误来自你的应用程序,而不是编译存储过程?

在任何情况下,您都应该在存储过程中设置默认值,如下所示:

ALTER PROCEDURE [dbo].[Submit_Product]  
    (  
    @SubjectId uniqueidentifier,  
    @City nvarchar(30),  
    @Area nvarchar(20),  
    @Description nvarchar(400),  
    @ContactNo nvarchar(15),  
    @UserId int,  
    /*Fk Table*/  
    @Path1 nvarchar(75) = null,  
    @Path2 nvarchar(75) = null,  
    @Path3 nvarchar(75) = null,  
    @Path4 nvarchar(75) = null,  
    @Path5 nvarchar(75) = null 
    )  
AS  

作为最佳实践,我建议在insert语句中指定列名,以避免将来出现向后兼容性陷阱......

INSERT INTO dbo.ImagePath (Id, Path1, Path2, Path3, Path4, Path5) 
VALUES (
  @SubjectId, 
  @Path1, 
  @Path2, 
  @Path3, 
  @Path4, 
  @Path5 
) 

这样,您可以添加另一个具有默认值的列,并且不会影响您现有的存储过程。

答案 1 :(得分:2)

您必须在SP中为应接受空值的值添加默认值。

例如:

@test nvarchar(200) = NULL

如果您不提供任何其他值,则会插入空值。