【发布时间】:2021-10-22 01:01:39
【问题描述】:
在 SE 上有一些使用 DateAdd 和 DatePart 的示例,但它们都没有解决我的具体问题,即如何使用参数执行此操作。我需要做的是强制日期参数使用当月的第一天,而不是传递给参数的日期。所以,我截断的代码如下所示:
ALTER PROCEDURE [dbo].[usp_CR_PW_Insert]
(
@PR_STATUS int = NULL
,@CASE_TYPE int = NULL
,@FROM_DATE date = NULL
,@TO_DATE date = NULL
)
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
INSERT into [dbo].[tbl_CR_Premium]
(
PR_STATUS
,CASE_TYPE
,FROM_DATE
,TO_DATE
)
VALUES
(
@PR_STATUS
,@CASE_TYPE
,@FROM_DATE
,@TO_DATE
);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
BEGIN
PRINT
N'The transaction is in an uncommittable state.' +
'Rolling back transaction.'
ROLLBACK TRANSACTION;
END;
END CATCH;
END
GO
我正在使用日期选择器来获取日期,但我们只想存储所选月份的第一个日期。因此,如果 @FROM_DATE = 4/8/2021 我们实际上想将 4/1/2021 写入表中。我该怎么做?
【问题讨论】:
-
单个语句是原子的——你不需要在这里进行事务。您也不应该以这种方式使用 PRINT。通过不处理错误或重新抛出错误,让此过程的调用者知道发生了错误。您的代码有效地吃掉了错误,任何人或任何其他代码都无法确切知道错误发生的原因。并停止提供无意义的默认值 - 不要鼓励懒惰的编码
-
要添加到@SMor 所说的内容,请完全删除
TRY\CATCH并使用SET XACT ABORT ON;,这样可以确保回滚 -
为简单起见,代码被截断。我不是在寻找编码建议,而是在寻找问题的答案。
标签: sql sql-server