如何 create/drop 在 SQL 服务器中的存储过程中运行
How to create/drop function within stored procedure in SQL Server
我创建了一个存储过程,我在其中循环遍历数据并根据数据插入记录。插入的格式相同,但数据略有变化。
决策是通过 IF/ELSE 语句处理的,我有十几个 INSERT
查询(每个决策一个)。
我想将 INSERT
放入一个函数中,我可以用变化的变量调用它。
我想在存储过程的开头创建函数,然后 DROP
在最后创建它。
USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[DataParser]
AS
CREATE FUNCTION [dbo].[InsertFunc]
(@Number VARCHAR(40),
@Line_No INT,
@Topic VARCHAR(30),
@Note VARCHAR(4099),
@Bool VARCHAR(1))
RETURNS bit
AS
BEGIN
INSERT INTO Processing (Number, Line_No, Topic, Note, Activation_Date, Mandatory)
VALUES (@Number, @Line_No, @Topic, @Note,
CONVERT(VARCHAR(8), GETDATE(), 1), @Mandatory)
RETURN @@ROWCOUNT
END
...
...
Decision tree
...
...
InsertFunc(@oid, @lidCounter, 'StrVal1', @strVar2, 'Y')
现在它不会让我保存存储过程,如果我尝试在存储过程之外创建函数,我会收到以下错误:
Msg 443, Level 16, State 15, Procedure DataParser, Line 12 [Batch Start Line 23]
Invalid use of a side-effecting operator 'INSERT' within a function.
感谢任何帮助。
简短的回答是,在 SQL 服务器中,您不能在函数内执行插入/更新/删除操作。
虽然我不推荐动态创建和删除存储过程的方法,但如果您尝试使用创建存储过程而不是函数的方法,它应该可以工作。
以下存储过程可能对您有所帮助。
创建Table #Temp
(
数字 varchar(40),
Line_No 智力,
主题 VARCHAR(30),
注意 VARCHAR(4099),
布尔 VARCHAR(1),
Activation_Date 日期时间,
强制 varchar(10)
)
CREATE procedure [dbo].[InsertDataIntoTable]
(@Number VARCHAR(40),
@Line_No INT,
@Topic VARCHAR(30),
@Note VARCHAR(4099),
@Bool VARCHAR(1),
@Mandatory varchar(4))
AS
BEGIN
INSERT INTO #Temp (Number, Line_No, Topic, Note, Activation_Date, Mandatory)
VALUES (@Number, @Line_No, @Topic, @Note,
CONVERT(VARCHAR(8), GETDATE(), 1), @Mandatory)
END
我创建了一个存储过程,我在其中循环遍历数据并根据数据插入记录。插入的格式相同,但数据略有变化。
决策是通过 IF/ELSE 语句处理的,我有十几个 INSERT
查询(每个决策一个)。
我想将 INSERT
放入一个函数中,我可以用变化的变量调用它。
我想在存储过程的开头创建函数,然后 DROP
在最后创建它。
USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[DataParser]
AS
CREATE FUNCTION [dbo].[InsertFunc]
(@Number VARCHAR(40),
@Line_No INT,
@Topic VARCHAR(30),
@Note VARCHAR(4099),
@Bool VARCHAR(1))
RETURNS bit
AS
BEGIN
INSERT INTO Processing (Number, Line_No, Topic, Note, Activation_Date, Mandatory)
VALUES (@Number, @Line_No, @Topic, @Note,
CONVERT(VARCHAR(8), GETDATE(), 1), @Mandatory)
RETURN @@ROWCOUNT
END
...
...
Decision tree
...
...
InsertFunc(@oid, @lidCounter, 'StrVal1', @strVar2, 'Y')
现在它不会让我保存存储过程,如果我尝试在存储过程之外创建函数,我会收到以下错误:
Msg 443, Level 16, State 15, Procedure DataParser, Line 12 [Batch Start Line 23]
Invalid use of a side-effecting operator 'INSERT' within a function.
感谢任何帮助。
简短的回答是,在 SQL 服务器中,您不能在函数内执行插入/更新/删除操作。
虽然我不推荐动态创建和删除存储过程的方法,但如果您尝试使用创建存储过程而不是函数的方法,它应该可以工作。
以下存储过程可能对您有所帮助。
创建Table #Temp ( 数字 varchar(40), Line_No 智力, 主题 VARCHAR(30), 注意 VARCHAR(4099), 布尔 VARCHAR(1), Activation_Date 日期时间, 强制 varchar(10) )
CREATE procedure [dbo].[InsertDataIntoTable]
(@Number VARCHAR(40),
@Line_No INT,
@Topic VARCHAR(30),
@Note VARCHAR(4099),
@Bool VARCHAR(1),
@Mandatory varchar(4))
AS
BEGIN
INSERT INTO #Temp (Number, Line_No, Topic, Note, Activation_Date, Mandatory)
VALUES (@Number, @Line_No, @Topic, @Note,
CONVERT(VARCHAR(8), GETDATE(), 1), @Mandatory)
END