在插入之前查明行是否存在的存储过程
Stored procedure to find out if row exists before insertion
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SS_InsertApplicationStatus]
@CustomerID int,
@EventType nvarchar,
@EventDateTime datetime,
@Comments nvarchar,
@EmployeeID varchar,
@ApplicationDate date
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXIST(SELECT COUNT(*) FROM [dbo].[SS_CustomerCard]
WHERE SS_ID = '@SS_ID')
BEGIN
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
VALUES (@CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
END
END
行有错误IF NOT EXIST
;我从 MySQL.
复制了这个
我想做的是
如果不存在 ROW,那么我想执行 2 次插入,如下所示:
-- Insert statements for procedure here
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
VALUES (@CustomerID, "Application Submission", @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
VALUES (@CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
如果 ROW 确实存在
-- Insert statements for procedure here
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
VALUES (@CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
以下语句存在逻辑错误
IF NOT EXIST(SELECT COUNT(*) FROM [dbo].[SS_CustomerCard] WHERE SS_ID='@SS_ID')
您在查询中使用了聚合函数 COUNT(*)
,该函数总是 return 单行,其中数值 1
或 0
基于您的 WHERE
条件。
为什么要使用过程逻辑?使其完全基于设置。当然,您需要解释 @SS_ID
的来源,因为它不存在于您的代码片段中。
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
SELECT @CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate
WHERE NOT EXISTS (SELECT 1 FROM [dbo].[SS_CustomerCard] WHERE SS_ID = @SS_ID);
SQL 服务器中的注释:
- 关键字是
EXISTS
而不是 EXIST
- 你没有引用参数,所以应该是
@SS_ID
而不是'@SS_ID'
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SS_InsertApplicationStatus]
@CustomerID int,
@EventType nvarchar,
@EventDateTime datetime,
@Comments nvarchar,
@EmployeeID varchar,
@ApplicationDate date
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXIST(SELECT COUNT(*) FROM [dbo].[SS_CustomerCard]
WHERE SS_ID = '@SS_ID')
BEGIN
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
VALUES (@CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
END
END
行有错误IF NOT EXIST
;我从 MySQL.
我想做的是
如果不存在 ROW,那么我想执行 2 次插入,如下所示:
-- Insert statements for procedure here INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate) VALUES (@CustomerID, "Application Submission", @EventDateTime, @Comments, @EmployeeID, @ApplicationDate) INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate) VALUES (@CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
如果 ROW 确实存在
-- Insert statements for procedure here INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate) VALUES (@CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate)
以下语句存在逻辑错误
IF NOT EXIST(SELECT COUNT(*) FROM [dbo].[SS_CustomerCard] WHERE SS_ID='@SS_ID')
您在查询中使用了聚合函数 COUNT(*)
,该函数总是 return 单行,其中数值 1
或 0
基于您的 WHERE
条件。
为什么要使用过程逻辑?使其完全基于设置。当然,您需要解释 @SS_ID
的来源,因为它不存在于您的代码片段中。
INSERT INTO SS_ApplicationStatus (CustomerID, EventType, EventDateTime, Comments, EmployeeID, ApplicationDate)
SELECT @CustomerID, @EventType, @EventDateTime, @Comments, @EmployeeID, @ApplicationDate
WHERE NOT EXISTS (SELECT 1 FROM [dbo].[SS_CustomerCard] WHERE SS_ID = @SS_ID);
SQL 服务器中的注释:
- 关键字是
EXISTS
而不是EXIST
- 你没有引用参数,所以应该是
@SS_ID
而不是'@SS_ID'