.net 更新从代码中提供参数的列

.net 更新从代码中提供参数的列,.net,sql,tsql,stored-procedures,.net,Sql,Tsql,Stored Procedures,我将从.NET执行一个更新存储过程。我想在T-SQL中使用以下逻辑,但是我似乎无法找到如何做到这一点 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE sp_UpdateTable @TableID int, @StartTime1 datetime, @EndTime1 datetime AS BEGIN SET NOCOUNT ON; UPDATE [Table]

我将从.NET执行一个更新存储过程。我想在T-SQL中使用以下逻辑,但是我似乎无法找到如何做到这一点

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE sp_UpdateTable

    @TableID int,
    @StartTime1 datetime,
    @EndTime1 datetime

AS
BEGIN
    SET NOCOUNT ON;

    UPDATE [Table]
       SET [StartTime1] = WAS_PASSED_FROM_CODE(@StartTime1, @StartTime1, [StartTime1])
          ,[EndTime1]   = WAS_PASSED_FROM_CODE(@EndTime1,   @EndTime1,   [EndTime1])
    WHERE TableID = @TableID
END
GO
好的,所以我基本上在寻找一种方法来确定参数是否是从代码中指定的(因此是从代码中传递的),如果参数是从代码中指定的,那么将该列更新为指定的值,否则保持不变(更新为现有值)

这可能吗


请注意,在这种情况下,代码传递NULL是有效的,在这种情况下,列应更新为NULL。

将参数默认为
NULL
,然后使用
ISNULL
。如果未指定参数,则该参数将为
NULL

编辑:如果NULL是有效值,则添加两个附加参数以标记是否指定了日期参数

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE sp_UpdateTable

    @TableID int,
    @StartTime1 datetime,
    @StartTime1Specified BIT,
    @EndTime1 datetime,
    @EndTime1Specified BIT

AS
BEGIN
    SET NOCOUNT ON;

    UPDATE [Table]
       SET [StartTime1] = (CASE WHEN @StartTime1Specified = 1 THEN @StartTime1 ELSE [StartTime1] END)
          ,[EndTime1]   = (CASE WHEN @EndTime1Specified = 1 THEN @EndTime1 ELSE [EndTime1])
    WHERE TableID = @TableID
END
GO

将参数默认设置为
NULL
,然后使用
ISNULL
。如果未指定参数,则该参数将为
NULL

编辑:如果NULL是有效值,则添加两个附加参数以标记是否指定了日期参数

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE sp_UpdateTable

    @TableID int,
    @StartTime1 datetime,
    @StartTime1Specified BIT,
    @EndTime1 datetime,
    @EndTime1Specified BIT

AS
BEGIN
    SET NOCOUNT ON;

    UPDATE [Table]
       SET [StartTime1] = (CASE WHEN @StartTime1Specified = 1 THEN @StartTime1 ELSE [StartTime1] END)
          ,[EndTime1]   = (CASE WHEN @EndTime1Specified = 1 THEN @EndTime1 ELSE [EndTime1])
    WHERE TableID = @TableID
END
GO

旁注:存储过程不应使用
sp
前缀。微软已经保留了这个前缀供自己使用,你确实会在将来的某个时候冒名字冲突的风险。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!我不知道2008+的情况,但sp_uu也会对绩效产生影响。那么,在编写函数是从代码传递的过程中,您是否需要帮助?您可能必须指定dbo.WAS\u PASSED\u FROM\u CODE。@sam yi是的,如果可以创建这样的函数。旁注:您不应该在存储过程中使用sp\u前缀。微软已经保留了这个前缀供自己使用,你确实会在将来的某个时候冒名字冲突的风险。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!我不知道2008+的情况,但sp_uu也会对绩效产生影响。那么,在编写函数是从代码传递的过程中,您是否需要帮助?您可能必须指定dbo.WAS_PASSED_FROM_CODE.@sam yi是的,如果可以创建这样的函数,我想不出更好的方法了。我认为唯一的选择是使用sentinel值,例如
NULL
,或者如果不存在这样的值,因为整个值域可能是有效的,那么使用单独的参数来表示“ischanged”,实际上可能存在代码指定NULL的有效情况,这就是我的问题所在。我编辑了我的帖子,以反映我需要处理这种情况。@ReedParks通过添加两个额外的参数,指示是否指定了日期,从而更新了答案,以处理空值为有效值的情况。然后在基于该值的更新中使用case语句。我会将其标记为答案,我知道我可以做到这一点,但希望得到一些我从未听说过的神奇SQL函数。我想不出更好的方法。我认为唯一的选择是使用sentinel值,例如
NULL
,或者如果不存在这样的值,因为整个值域可能是有效的,那么使用单独的参数来表示“ischanged”,实际上可能存在代码指定NULL的有效情况,这就是我的问题所在。我编辑了我的帖子,以反映我需要处理这种情况。@ReedParks通过添加两个额外的参数,指示是否指定了日期,从而更新了答案,以处理空值为有效值的情况。然后在基于该值的更新中使用case语句。我会将其标记为答案,我知道我可以做到这一点,但希望得到一些我从未听说过的神奇的SQL函数。