下面是我们用来填充SQL数据库中的表的存储过程。 @expDate是一个从C#批处理作业发送的参数,它从Excel电子表格中获取它的值。
如果当前代理的培训处于活动状态,则电子表格在到期日期单元格中将没有值。这会导致从C#代码将空字符串发送到存储过程,然后将其转换为日期时间值1900-01-01。这很好,直到我需要使用游标将新记录插入表中。
如果@expDate值为1900-01-01,那么我需要SQL记录的到期日期字段中的值为NULL。但是,我无法设置@expDate = NULL,也不能将其设置为空白('')[编辑:由于业务规则,我无法设置为空白。空白值将使字段的值设置为1900-01-01]。有什么建议?
DECLARE @date datetime = GETDATE()
IF @expDate = '1900-01-01' SET @flag = '1'
IF @expDate = '1900-01-01' SET @expDate = GETDATE()
DECLARE prod_cursor CURSOR LOCAL SCROLL FOR
SELECT ProductCode
FROM CourseToProduct
WHERE CourseCode = @courseCode and (TerminationDate >= @expDate OR TerminationDate IS NULL)
IF @flag = '1' SET @expDate = ''
OPEN prod_cursor
FETCH NEXT FROM prod_cursor
INTO @productCode
WHILE @@FETCH_STATUS = 0
BEGIN
IF NOT EXISTS
(
SELECT *
FROM AgentProductTraining
WHERE @sNumber = SNumber and
@courseCode = CourseCode and
@productCode = ProductCode and
@dateTaken = DateTaken
)
BEGIN
IF @sNumber IS NOT NULL
BEGIN
INSERT INTO AgentProductTraining
(
SNumber,
CourseCode,
ProductCode,
DateTaken,
DateExpired,
LastChangeOperator,
LastChangeDate
)
VALUES (
@sNumber,
@courseCode,
@productCode,
@dateTaken,
COALESCE(@expDate, 'NULL'),
@lastChangeOperator,
@lastChangeDate
)
END
END
FETCH NEXT FROM prod_cursor
INTO @productCode
END
CLOSE prod_cursor;
DEALLOCATE prod_cursor;
答案 0 :(得分:2)
通过遵循Oded的注释,我摆脱了COALESCE语句并将@flag值设置为NULL而不是NULL。通过更改此行代码:
IF @flag = '1' SET @expDate = ''
到此:
IF @flag = '1' SET @expDate = NULL
现在可以使用。
答案 1 :(得分:1)
这会有用吗?
INSERT INTO AgentProductTraining
(
SNumber,
CourseCode,
ProductCode,
DateTaken,
DateExpired,
LastChangeOperator,
LastChangeDate
)
VALUES (
@sNumber,
@courseCode,
@productCode,
@dateTaken,
CASE WHEN @expDate = '1900-01-01' THEN Null ELSE @expDate END,
@lastChangeOperator,
@lastChangeDate
)