sql-server - 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 已连接,因此这两个表在一起
解决方案
你的ISNULL
逻辑是倒退的。首先,如果@StartDate IS NULL
,EXISTS
则将返回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'