首页 > 解决方案 > SQL Server:过程抛出批处理错误

问题描述

如果单元格具有 NULL 值,则编写带有条件的过程,而不是添加变量具有的任何内容,但如果它已经具有值,则保留其原始值/不要覆盖它。

这是一个更新过程。

这是我的查询:

CREATE PROCEDURE dbo.[Learning]
    @StartDate NVARCHAR(20) = NULL,
    @EndDate   NVARCHAR(20) = NULL,
    @Data      NVARCHAR(20) = NULL
AS
BEGIN
    IF EXISTS (SELECT TOP(1) T1.CID  
               FROM temp.dbo.TABLE1 AS T1 
               WHERE StartDate = @StartDate)
    BEGIN
        UPDATE temp.dbo.TABLE1
        SET StartDate = ISNULL(@StartDate, StartDate),
            EndDate = ISNULL(@EndDate, EndDate),
            Data = ISNULL(@Data, Data)
        WHERE TABLE1.SSC = 'OP'
    END

CREATE TABLE temp.dbo.Table1
(
     CID INT,
     PID INT,
     SSC VARCHAR(3),
     StartDate VARCHAR(20),
     EndDate VARCHAR(20), 
     Data VARCHAR(20)
)

INSERT INTO temp.dbo.Table1
VALUES
(1001,  1333,   'OP','20011505','19952012','OP2001156519952012'),
(1002,  1245,   'OR','20121005',NULL,'OR20121005'),
(1003,  1116,   'OP','20131215',NULL,'OP20131215'),
(1004,  1234,   'OP','20011505','19952012','OP2001156519952012')    

CREATE TABLE temp.dbo.Table2
(
     CID INT,
     PID INT,
     SSC VARCHAR(3),
     StartDate VARCHAR(20),
     EndDate VARCHAR(20), 
     Data VARCHAR(20)
)

INSERT INTO temp.dbo.Table2
VALUES
(1001,  1333,   'OP','20111015',NULL,'OP20111015'),
(1002,  1245,   'OR','20131005',NULL,'OR20131005'),
(1003,  1116,   'OP','20131415',NULL,'OP2013141520131516'),
(1004,  1235,   'OP','20121015',NULL,'OP20121015')

这是具有空值的示例数据的屏幕截图,此过程将用于更新它。表 1 和表 2 已连接,因此这两个表在一起

在此处输入图像描述

标签: sql-server

解决方案


你的ISNULL逻辑是倒退的。首先,如果@StartDate IS NULLEXISTS则将返回FALSE并且UPDATE将不会运行,这是正确的。但是,向后的部分在UPDATE. 在这里,您想要StartDate = ISNULL(StartDate,@StartDate)将其设置为变量,如果它IS NULL用于该行。

这也需要针对其他列进行更改。

   UPDATE temp.dbo.TABLE1
    SET StartDate = ISNULL(StartDate,@StartDate)
        ,EndDate = ISNULL(EndDate,@EndDate)
        ,Data = ISNULL(Data,@Data)
    WHERE TABLE1.SSC = 'OP'

推荐阅读