存储过程模板
SQL Server连接数据库后,依次找到“数据库——》可编程性——》存储过程——》新建——》存储过程”,如下图:

打开一个存储过程模板界面:
-- ================================================
-- Template generated from Template Explorer using:
-- Create Procedure (New Menu).SQL
--
-- Use the Specify Values for Template Parameters
-- command (Ctrl-Shift-M) to fill in the parameter
-- values below.
--
-- This block of comments will not be included in
-- the definition of the procedure.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
-- Add the parameters for the stored procedure here
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
GO
这段代码是一个SQL Server存储过程的模板,其目的是创建一个新的存储过程。逐行解析这段代码:
-
SET ANSI_NULLS ON: 这行代码设置了SQL Server的行为,使其在比较NULL值时遵循ANSI标准。当此选项启用时,NULL值将被视为未知,而非零或空字符串。 -
SET QUOTED_IDENTIFIER ON: 这行代码启用了SQL Server的引号标识符模式。这意味着你可以使用双引号(")或方括号([])来引用SQL对象的名称,即使它们与关键字冲突或包含特殊字符。
接下来是一段注释,其中包含了关于存储过程的一些元数据,包括作者、创建日期和描述。这些信息在存储过程的定义中不会出现,但可以作为开发者的参考。
-
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>: 这行代码定义了一个新的存储过程。<Procedure_Name, sysname, ProcedureName>是一个占位符,应该被替换为实际的存储过程名称。 -
参数定义部分:在这段代码中,
<@Param1, sysname, @p1>和<@Param2, sysname, @p2>是存储过程的输入参数。<Datatype_For_Param1, , int>和<Datatype_For_Param2, , int>定义了参数的数据类型,而<Default_Value_For_Param1, , 0>和<Default_Value_For_Param2, , 0>定义了参数的默认值。这些都需要被具体的参数名称、数据类型和默认值所替换。 -
AS: 标记着存储过程体的开始。 -
BEGIN: 开始一个代码块。 -
SET NOCOUNT ON: 这行代码防止了存储过程执行时返回不必要的行计数,这对于提高性能和避免意外的输出很有帮助。 -
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>: 这是一个示例查询,它返回存储过程的两个输入参数。在实际的存储过程中,你会用具体的逻辑或查询语句替换这一行。 -
END: 结束代码块。 -
GO: 这是一个批处理结束标记,用于SQL Server Management Studio或其他SQL客户端工具,指示SQL引擎执行前面的批处理语句。
使用该模板,创建存储过程Proc_Machining_Allocate_Detail_Query_debug并传入参数
存储过程将接受四个参数:@sWhere、@orderBy、@PageIndex 和 @PageSize,并执行一个基于这些参数的查询
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE Proc_Machining_Allocate_Detail_Query_debug
@sWhere VARCHAR(1000),
@orderBy VARCHAR(200),
@PageIndex INT,
@PageSize INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- 主查询
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'
SELECT AutoID, PID, MOMID, cDepCode, iDate, fQty, cDeviceCode, EquipName, cTeam, cTeamName,
dWorkCreateTime, cMemo, optTime, optUserID, optUserName, ProcessType, MOM_MainNo,
cInvCode, cInvName, cInvStd, ProcedureCode, ProcedureName, bClose, cInvDefine8,
cDefine8, IsHide, fQty, iSerialNo
FROM dbo.V_Machining_Allocate_Detail WITH(NOLOCK)
WHERE 1=1 ' + @sWhere + ' ' + @orderBy + '
OFFSET ' + CAST((@PageIndex - 1) * @PageSize AS NVARCHAR) + ' ROWS
FETCH NEXT ' + CAST(@PageSize AS NVARCHAR) + ' ROWS ONLY;';
-- 执行动态SQL
EXEC sp_executesql @SQL;
END
GO
创建临时表#cTmp,执行查询,并将结果插入到该表中与查询结果相对应的列中
-- 创建临时表
CREATE TABLE #cTmp(
AutoID INT,
PID INT,
MOMID INT,
cDepCode VARCHAR(30),
cDepName NVARCHAR(30),
iDate DATE,
fQty DECIMAL(13,3),
cDeviceCode VARCHAR(30),
EquipName NVARCHAR(30),
cTeam VARCHAR(30),
cTeamName NVARCHAR(30),
dWorkCreateTime DATETIME,
cMemo NVARCHAR(120),
optTime DATETIME,
optUserID VARCHAR(30),
optUserName NVARCHAR(30),
ProcessType INT,
MOM_MainNo VARCHAR(30),
cInvCode VARCHAR(30),
cInvName NVARCHAR(30),
cInvStd NVARCHAR(255),
ProcedureCode VARCHAR(30),
ProcedureName NVARCHAR(30),
bClose INT,
cInvDefine8 VARCHAR(30),
cDefine8 VARCHAR(30),
IsHide INT,
IssueQty DECIMAL(13,3),
iSerialNo INT
-- 注意:以下列未在查询中出现,需要默认值或之后填充
-- ,OKQty INT DEFAULT 0
-- ,NGQty INT DEFAULT 0
-- ,preQty DECIMAL(18,6) DEFAULT 0
-- ,thisQty DECIMAL(18,6) DEFAULT 0
-- ,OkJobQty DECIMAL(18,6) DEFAULT 0
-- ,preID INT DEFAULT 0
-- ,ReportQty INT DEFAULT 0
-- ,RestQty INT DEFAULT 0
-- ,ScrapQty INT DEFAULT 0
);
-- 插入数据
INSERT INTO #cTmp(
AutoID, PID, MOMID, cDepCode, iDate, fQty, cDeviceCode, EquipName, cTeam, cTeamName,
dWorkCreateTime, cMemo, optTime, optUserID, optUserName, ProcessType, MOM_MainNo,
cInvCode, cInvName, cInvStd, ProcedureCode, ProcedureName, bClose, cInvDefine8,
cDefine8, IsHide, IssueQty, iSerialNo
)
SELECT
AutoID, PID, MOMID, cDepCode, iDate, fQty, cDeviceCode, EquipName, cTeam, cTeamName,
dWorkCreateTime, cMemo, optTime, optUserID, optUserName, ProcessType, MOM_MainNo,
cInvCode, cInvName, cInvStd, ProcedureCode, ProcedureName, bClose, cInvDefine8,
cDefine8, IsHide, fQty, iSerialNo -- 注意:这里的fQty被重复使用为IssueQty,如果IssueQty有不同数据,请替换
FROM dbo.V_Machining_Allocate_Detail WITH(NOLOCK)
WHERE 1=1
AND bClose = '1'
AND iDate BETWEEN '2024-07-17' AND '2024-07-22'
AND ProcedureName LIKE '%阀焊接1%'
AND cDepCode = '1014'
ORDER BY dWorkCreateTime DESC
OFFSET 0 ROWS
FETCH NEXT 30 ROWS ONLY;
注释中指出了那些在查询中未出现但在#cTmp表定义中包含的列。这些列需要默认值或者你可能需要在插入数据后另外的逻辑来填充它们
当前文章价值0.62元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

评论已关闭!