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 根本没有 运行,或者当它做了时什么也没做。
有人知道问题出在哪里吗?
您可以 运行 没有 EXEC( )
的表扬。
只需插入和删除即可。
exec 用于动态代码,其中 table 名称是一个变量。一个不同的用例。
我推荐你使用CREATE OR ALTER PROCEDURE
。
因此,当您实施生产时,您拥有正确的代码。
同理DROP TABLE IF EXISTS
.
开始使用 NOCOUNT ON
。
以 GO
结束。
我喜欢在创建 proc 后对其进行测试 - 如果其中没有 GO
,它会进入 proc 的代码。
没有参数 - 只是 运行 代码原样。
如果它在 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
我是 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 根本没有 运行,或者当它做了时什么也没做。
有人知道问题出在哪里吗?
您可以 运行 没有
EXEC( )
的表扬。
只需插入和删除即可。
exec 用于动态代码,其中 table 名称是一个变量。一个不同的用例。我推荐你使用
CREATE OR ALTER PROCEDURE
。
因此,当您实施生产时,您拥有正确的代码。
同理DROP TABLE IF EXISTS
.开始使用
NOCOUNT ON
。以
GO
结束。
我喜欢在创建 proc 后对其进行测试 - 如果其中没有GO
,它会进入 proc 的代码。没有参数 - 只是 运行 代码原样。
如果它在 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