T-SQL 存储过程没有做任何事情

T-SQL stored procedure did not do anything

我是 SQL 存储过程的新手,并且很难让我继承的存储过程 [来自另一位作者编写的现有 SP,它确实有效] 正确执行。以下内容旨在用更新的记录替换 'Data' table 中的现有记录,并附加新记录(更新时均来自 'UpdateTemp' table)。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ProcessNewData]
AS

DECLARE @MaxDate varchar(10);
DECLARE @MinDate varchar(10);

SELECT @MaxDate = Max([Date]) FROM [dbo].[UpdateTemp];
SELECT @MinDate = Min([Date]) FROM [dbo].[UpdateTemp];

--Remove months from existing data that have updated data
DELETE
FROM [Data]
WHERE
([Type] = 'A' AND
([Date] = @MaxDate OR [Date] = @MinDate))
OR
([Type] = 'B' AND
([Date] = @MaxDate OR [Date] = @MinDate))

--Insert new data
EXEC('INSERT INTO [Data] SELECT * FROM [UpdateTemp];')

--Delete UpdateTemp table
EXEC('DROP TABLE [dbo].[UpdateTemp];')

还有一个别人写的非常相似的SP确实执行成功了。下面是:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[process_data]
AS

DECLARE @max_month varchar(10);
DECLARE @min_month varchar(10);
DECLARE @newTableName varchar(21);

SELECT @max_month = Max([month]) FROM [dbo].[Update_Temp];
SELECT @min_month = Min([month]) FROM [dbo].[Update_Temp];

SET @newTableName = 'Update_' + @max_month  


--Drop table if exists
EXEC('DROP TABLE IF EXISTS [dbo].['+@newTableName+'];')

--Rename the database
EXEC sp_rename 'Update_Temp', @newTableName

--Remove 2 month from outcome
DELETE
FROM [Outcome]
WHERE
[month] = @max_month OR [month] = @min_month

--Insert new data
EXEC('INSERT INTO [Outcome] SELECT * FROM ['+@newTableName+'];')

'UpdateTemp' table 加载成功。我自己测试了代码并且它有效。然而,似乎 SP 根本没有 运行,或者当它做了时什么也没做。

有人知道问题出在哪里吗?

  1. 您可以 运行 没有 EXEC( ) 的表扬。
    只需插入和删除即可。
    exec 用于动态代码,其中 table 名称是一个变量。一个不同的用例。

  2. 我推荐你使用CREATE OR ALTER PROCEDURE
    因此,当您实施生产时,您拥有正确的代码。
    同理DROP TABLE IF EXISTS.

  3. 开始使用 NOCOUNT ON

  4. GO 结束。
    我喜欢在创建 proc 后对其进行测试 - 如果其中没有 GO,它会进入 proc 的代码。

  5. 没有参数 - 只是 运行 代码原样。
    如果它在 SP 之外工作,它将在其中。
    当 SP 接收参数时,将 PROCEDURE 语句替换为 DECLARE 并执行相同的操作。

CREATE OR ALTER PROCEDURE [dbo].[ProcessNewData]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @MaxDate varchar(10),
        @MinDate varchar(10);
    
SELECT @MaxDate = Max([Date]), @MinDate = Min([Date])
FROM [dbo].[UpdateTemp];
    
--Remove months from existing data that have updated data
DELETE
FROM [Data]
WHERE
([Type] = 'A' OR [Type] = 'B') AND
([Date] = @MaxDate OR [Date] = @MinDate))
    
--Insert new data
INSERT INTO [Data]
SELECT * FROM [UpdateTemp];
    
--Delete UpdateTemp table
DROP TABLE IF EXISTS [dbo].[UpdateTemp];
END;
GO