【问题标题】:Insert Stored Procedure with null parameters插入带有空参数的存储过程
【发布时间】:2013-10-06 05:19:50
【问题描述】:

我想创建一个带有空参数的插入存储过程,如果传递该参数的值,那么它必须在数据库中插入或更新

我的存储过程是:

Create proc [dbo].[SP_InsertOrUpdateCourseDetails]
    @CourseID int,
    @Tab1Title nvarchar(250) = null,
    @Tab1Description nvarchar(max) = null,
    @Tab2Title nvarchar(250) = null,
    @Tab2Description nvarchar(max) = null,
    @Tab3Title nvarchar(250) = null,
    @Tab3Description nvarchar(max) = null,
    @Tab4Title nvarchar(250) = null,
    @Tab4Description nvarchar(max) = null,
    @Syllabus nvarchar(max) = null
As
Begin

    If NOT EXISTS (Select * from CourseDetail Where CourseID=@CourseID )
    Begin
        Insert into CourseDetail(CourseID, Tab1Title, Tab1Description, 
                                 Tab2Title, Tab2Description,
                                 Tab3Title, Tab3Description, Tab4Title, Tab4Description,
                                 Syllabus)
        values (@CourseID, @Tab1Title, @Tab1Description, @Tab2Title, @Tab2Description,
                @Tab3Title, @Tab3Description, @Tab4Title, @Tab4Description, @Syllabus)

        IF @@ERROR = 0 AND @@ROWCOUNT =1
        Begin
            Select top 1 CourseID from CourseDetail Order by CourseDetailID Desc
        End
        Else 
        Begin
             Select 0
        End
    End
 Else
 Begin
     Update CourseDetail 
     SET
        Tab1Title = @Tab1Title,
        Tab1Description = @Tab1Description,
        Tab2Title = @Tab2Title,
        Tab2Description = @Tab2Description,
        Tab3Title = @Tab3Title,
        Tab3Description = @Tab3Description,
        Tab4Title = @Tab4Title,
        Tab4Description = @Tab4Description,
        Syllabus = @Syllabus
     Where 
        CourseID = @CourseID

     IF @@ERROR = 0 AND @@ROWCOUNT =1
     Begin
         Select top 1 CourseID from CourseDetail Order by CourseDetailID Desc
     End
     Else 
     Begin
         Select 0
     End
   End
 End

【问题讨论】:

  • 'Null' 用于varchar 字段。
  • 如果您需要为任何列设置NULL 值怎么办?
  • 如果我没有从我的 C# 代码中传递值,我不想插入或更新空值
  • 您应该使用OUTPUT 子句来返回您刚刚插入/更新的行,而不是按 coursedetailID 排序的前 1 行。首先,除非更新恰好更新了最新的课程 ID,否则您的方法将不起作用,并且并发性也没有问题。
  • 我发现在某些组合中,如 JDBC 和 SQL 服务器,由于某种原因,您必须将所有可能为空的参数放在查询末尾

标签: sql stored-procedures


【解决方案1】:

你可以使用ISNULL函数传入它的SP参数作为第一个参数和默认值在插入的情况下或实际列的值在更新的情况下:

    Insert into CourseDetail(CourseID, Tab1Title, Tab1Description, 
                             Tab2Title, Tab2Description,
                             Tab3Title, Tab3Description, Tab4Title, Tab4Description,
                             Syllabus)
    values (@CourseID, ISNULL(@Tab1Title, 'default value'), ISNULL(@Tab1Description,'default value'), ...


 Update CourseDetail 
 SET
    Tab1Title = ISNULL(@Tab1Title, Tab1Title),
    Tab1Description = ISNULL(@Tab1Description, Tab1Description),
    ....
 Where 
    CourseID = @CourseID

但在这种情况下,即使您需要,您也无法明确设置 NULL 值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多