【问题标题】:Stored Procedure using IF使用 IF 的存储过程
【发布时间】:2017-03-07 12:57:37
【问题描述】:

我需要一些帮助,我对 SQL 还是有点陌生​​。我有一个从另一个应用程序作为智能对象执行的存储过程。我在更改之前的代码看起来像第 1 节中的代码。我根据第 2 节更改了代码,以便存储过程首先查看 Sales id 类型是否实际上是 3 与存储过程中表成员资格中的成员编号进行比较然后在成员表中执行相同的操作。如果查询是 3 和会员号,我希望它使用成员表中的到期日期而不是部分

SELECT @ExpiryDate = DATEADD(YEAR, 1, DATEADD(d, -1, DATEADD(m, 0, @CreatedDate)))

这将在当前日期加上 364 天

第 1 节

USE [HotelStayWorkflow]
GO
/****** Object:  StoredProcedure [dbo].[CP_Create_Card]    Script Date: 3/7/2017 2:50:06 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[CP_Create_Card] 
    -- Add the parameters for the stored procedure here
 @membershipNumber VARCHAR(MAX),
 @CardId BIGINT = NULL OUTPUT,
 @minsToFirstDeadline int = 2880,--defailt 2 days
 @minsToSecondDeadline int = 5760 --default 4 days



AS
BEGIN
    DECLARE @CreatedDate DATETIME = GETDATE()
    DECLARE @ExpiryDate DATETIME
    DECLARE @FirstDeadine DATETIME
    DECLARE @SecondDeadline DATETIME

    BEGIN
                SELECT @ExpiryDate = DATEADD(YEAR, 1, DATEADD(d, -1, DATEADD(m, 0, @CreatedDate)))
    END


    SELECT @FirstDeadine = DATEADD(MINUTE,@minsToFirstDeadline,GETDATE())
    SELECT @SecondDeadline = DATEADD(MINUTE,@minsToSecondDeadline,GETDATE())
    --Create Card Linked to Membership below
    IF EXISTS(SELECT * FROM Cards WHERE MembershipNumber = @membershipNumber AND Enabled = 1)
    BEGIN
        UPDATE Cards SET Enabled = 0 WHERE MembershipNumber = @membershipNumber AND Enabled = 1
    END

    INSERT INTO Cards (CardStatusId, MembershipNumber, PrintedDate, Created, Modified, ExpiryDate,FirstDeadline,SecondDeadline, Enabled) 
    VALUES(1, @membershipNumber, @CreatedDate, @CreatedDate, @CreatedDate, @ExpiryDate,@FirstDeadine,@SecondDeadline, 1)    
    SET @CardId = SCOPE_IDENTITY()

            -- Return Card Id


END

第 2 节

USE [HotelStayWorkflow]
GO
/****** Object:  StoredProcedure [dbo].[CP_Create_Card]    Script Date: 3/7/2017 1:08:05 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[CP_Create_Card] 
    -- Add the parameters for the stored procedure here
 @membershipNumber VARCHAR(MAX),
 @CardId BIGINT = NULL OUTPUT,
 @minsToFirstDeadline int = 2880,--defailt 2 days
 @minsToSecondDeadline int = 5760 --default 4 days



AS
BEGIN
    DECLARE @CreatedDate DATETIME = GETDATE()
    DECLARE @ExpiryDate DATETIME
    DECLARE @FirstDeadine DATETIME
    DECLARE @SecondDeadline DATETIME

    BEGIN
            IF EXIST (FROM Memberships WHERE MembershipNumber = @MembershipNumber AND SalesTypeId = 3 AND Enabled =1)
            AND 
            IF EXIST (FROM Members WHERE MembershipNumber = @MembershipNumber AND Enabled =1)
            SELECT @ExpiryDate = dbo.Members.MembershipExpiry
        OR              

            SELECT @ExpiryDate = DATEADD(YEAR, 1, DATEADD(d, -1, DATEADD(m, 0, @CreatedDate)))
    END


    SELECT @FirstDeadine = DATEADD(MINUTE,@minsToFirstDeadline,GETDATE())
    SELECT @SecondDeadline = DATEADD(MINUTE,@minsToSecondDeadline,GETDATE())
    --Create Card Linked to Membership below
    IF EXISTS(SELECT * FROM Cards WHERE MembershipNumber = @membershipNumber AND Enabled = 1)
    BEGIN
        UPDATE Cards SET Enabled = 0 WHERE MembershipNumber = @membershipNumber AND Enabled = 1
    END

    INSERT INTO Cards (CardStatusId, MembershipNumber, PrintedDate, Created, Modified, ExpiryDate,FirstDeadline,SecondDeadline, Enabled) 
    VALUES(1, @membershipNumber, @CreatedDate, @CreatedDate, @CreatedDate, @ExpiryDate,@FirstDeadine,@SecondDeadline, 1)    
    SET @CardId = SCOPE_IDENTITY()

            -- Return Card Id


END

【问题讨论】:

  • 您的问题是什么?
  • 当我尝试在我添加的部分上运行我的存储过程时,它给了我错误,不确定我是否正确使用命令
  • 您能否在问题中添加您的错误以及您想要达到的目标,我会尽力提供帮助
  • Msg 156,级别 15,状态 1,过程 CP_Create_Card,第 30 行关键字“FROM”附近的语法不正确。消息 156,级别 15,状态 1,过程 CP_Create_Card,第 32 行关键字“FROM”附近的语法不正确。消息 156,级别 15,状态 1,过程 CP_Create_Card,第 34 行关键字“OR”附近的语法不正确。
  • 如果在 SalestypeID 的会员表上的值为 3,我正在尝试打电话给商店程序,如果在 SalestypeId 中找到 3,它应该使用会员表中相同会员号的到期日期启用 = 1。如果不是,则应使用语句 SELECT @ExpiryDate = DATEADD(YEAR, 1, DATEADD(d, -1, DATEADD(m, 0, @CreatedDate)))

标签: sql sql-server-2008 if-statement stored-procedures


【解决方案1】:

将代码更改为

开始 SELECT @ExpiryDate = MembershipExpiry From Members M WHERE M.MembershipNumber = @MembershipNumber
会员资格 MS WHERE M.MembershipNumber = @MembershipNumber AND SalesTypeId = 3 AND MS.[Enabled] =1

    IF @ExpiryDate IS NULL
            SELECT @ExpiryDate = DATEADD(YEAR, 1, DATEADD(d, -1, DATEADD(m, 0, @CreatedDate)))
END

【讨论】:

    【解决方案2】:

    请试试这个,因为你没有包括所有的列,所以很难完成这个答案。

       SELECT @ExpiryDate = M.MembershipExpiry From Memberships M WHERE M.MembershipNumber = @MembershipNumber AND M.SalesTypeId = 3 AND M.[Enabled] =1
    
            IF @ExpiryDate IS NULL
            BEGIN
               SELECT @ExpiryDate = DATEADD(YEAR, 1, DATEADD(d, -1, DATEADD(m, 0, @CreatedDate)))
            end
    

    【讨论】:

    • 您好,我尝试了给出的代码,但它从错误的表中提取列。我调整了代码,但只有当 M.SalesTypeId = 3 AND M.[Enabled] =1 必须使用到期时,我才会在第二个“AND 和表名”上出错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多