Sql server 2008 请求输入空列的存储过程

Sql server 2008 请求输入空列的存储过程,sql-server-2008,tsql,stored-procedures,sql-server-2008-r2,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

我有两个具有主外键关系的表。 外键关系中的表的某些列可以为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
...

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

例如:

@test nvarchar(200) = NULL

然后,如果您不提供任何其他值,它将插入一个空值。

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

例如:

@test nvarchar(200) = NULL

如果您不提供任何其他值,那么它将插入一个空值。

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

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

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 
) 

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

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

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

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 
) 
通过这种方式,您可以添加另一个具有默认值的列,并且您现有的存储过程不会受到影响