.net 更新从代码中提供参数的列
我将从.NET执行一个更新存储过程。我想在T-SQL中使用以下逻辑,但是我似乎无法找到如何做到这一点.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]
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函数。