【问题标题】:How can I implement MS SQL 2014 Stored Procedure如何实现 MS SQL 2014 存储过程
【发布时间】:2016-06-12 16:11:58
【问题描述】:

我是 MS SQL 2014 存储过程的新手。我有一个如下所示的表格。我想创建一个存储过程。 我设计了我的存储过程,但我觉得很难,我什至无法开始。谁能帮助我,我该怎么做?

我必须将 CardNo、CardPassword 和 PosSerialNo 发送到 SQL 存储过程。作为回报,我需要获取客户姓名、姓氏和金额。

发送: CardNo、CardPass、PosSerialNo

正在接收: 如果 Sending.CardPass = CardPasswordTable.Password 请执行下列操作: 如果成功,我会得到:CustomerName、CustomerSurname 和 Amount 如果没有,我会得到:“未找到数据”

我的桌子:

1) CardIssueTable: 列: CardId、CardNo、CustId

2) 客户表: 列: CustId、CustName、CustSurname

3) 后置表: 列: PosId、PosSerial、PosLocation

4) 付款表: 列: PaymentId、PaymentLoaction、PaymentAmount

5) 卡片密码表: 列: 密码、密码

已编辑:

这是我的存储过程。当我执行时,我得到一个错误。

存储过程:

    USE [LTKB_Card]
GO
/****** Object:  StoredProcedure [dbo].[CardCustomerControl]    Script Date: 2.03.2016 10:03:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


/*parameters*/ 
ALTER Procedure [dbo].[CardCustomerControl]( 
    @CardNo varchar(50), 
    @CardPass varchar(10),
    @PosSerialNo varchar(50)
)
AS 
BEGIN
    DECLARE /*internal of sp*/
        @CustName varchar(100),
        @CustId int,
        @CustSurName varchar(100),
        @Amout int,
        @PosId int,
        @PassId int

    SELECT @CustName=CUS.CustomerName, @CustSurName=CUS.CustomerSurname ,@CustId=C.CardCustomer
    FROM CardBASIM C
        INNER JOIN CUSTOMERS CUS ON C.CardCustomer=CUS.CustomerName
        WHERE C.CardNo=@cardNo

    SELECT @PassId=PASID FROM CardPASSLIST C WHERE C.CardPassowrd=@CardPass

    SELECT @Amout=PT.PaymentAmount  
    FROM POS P 
        INNER JOIN PAYMENT PT on P.PosLocation=PT.PAYID
        WHERE P.PosSerial=@PosSerialNo

    if (@CustId is not null and @PassId is not null and @PosId is not null) 
        begin
            select @CustName CustName, @CustSurName CustSurname , @Amout Amount
        end
    else 
        begin
            select 'NoDataFound'
    end
END

执行语句:

    USE [LTKB_Card]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[CardCustomerControl]
        @CardNo = N'5852354822730001',
        @CardPass = N'jSCm6xkBpK',
        @PosSerialNo = N'RR-312-001387'

SELECT  'Return Value' = @return_value

GO

错误:

消息 248,级别 16,状态 1,过程 ElitcardCustomerControl,第 21 行 varchar 值 '5852354822730001' 的转换溢出 int 列。

(受影响的 1 行)

(受影响的 1 行)

下面是表格的关系:

【问题讨论】:

  • 你能解释一下所有表格之间的关系,并展示你到目前为止所做的尝试吗?
  • 在英语中我们称它们为“存储过程”的缩写,它是一个存储在服务器上的过程。商店程序是在零售地点完成的一组操作。
  • 您遇到了什么问题?你能写一个查询来获取带有所需过滤器的数据吗?从那里将其放入存储过程非常简单。
  • 请告诉我,您并没有真正以纯文本形式存储信用卡号和密码。
  • 不,我没有以密文形式存储,我将使用 SP 来提供 Web 服务。加上卡号和密码是加密的。这就是例子。另外,我还有另外 2 个安全选项。 PIN 码和 OTP(一次性密码)

标签: sql-server stored-procedures


【解决方案1】:

看这一行的数据模型

 INNER JOIN CUSTOMERS CUS ON C.CardCustomer=CUS.CustomerName

将字符串连接到整数。我无法查看数据以确定这是否是确切的问题,但根据 您的模型,您想要的连接是这样的:

 INNER JOIN CUSTOMERS CUS ON C.CardCustomer=CUS.CUSTID

这是一种标准关系——我不知道您为什么认为客户的名字是要加入的字段。

【讨论】:

    【解决方案2】:

    我真的希望您不要以纯文本形式存储密码,并且我不了解您的表格之间的所有关系(例如 postable 和 paymenttable 之间的关系,passwordtable 和 cartable 之间的关系),但我给你一个你需要的SP的示例。不要忘记这只是一个例子。

    CREATE PROCEDURE dbo.spnamegoeshere
    @CardNo int, 
    @CardPass nvarchar(8), 
    @PosSerialNo nvarchar(8)
    AS
    BEGIN
    --Check if password is Sending.CardPass = CardPasswordTable.Password
    IF (SELECT ISNULL(PassId,0) FROM CardPasswordTable WHERE Password = @CardPass) != 0
    BEGIN
    -- If successful you get: CustomerName,
    -- CustomerSurname and Amount 
    -- not sure of table relations
    SELECT ct.CustomerName, ct.CustomerSurname, pat.PaymentAmount
    FROM CardIssueTable cit
    INNER JOIN CustomerTable ct ON cit.CustId = Ct.CustId
    LEFT JOIN PosTable pt ON pt.PosSerial = @PosSerialNo
    LEFT JOIN PaymentTable pat ON pt.PosLocation = pat.PaymentLoaction
    WHERE CardNo = @CardNo
    END
    ELSE
    BEGIN
    --If not you get: “No Data Found”
    SELECT 'No Data Found'
    END
    END
    

    【讨论】:

    • CardBASIMCardNo 字段的数据类型是什么?您能否添加此列中的数据示例。
    • 我附上了显示数据类型的图片。 CardNo 数据类型是 nvarchar(16)
    • @CardNo设为同一类型,并检查SP。
    • 我必须重新制定我的照片。你说的对。我会更新我的问题,请耐心等待。
    • 我更新了显示表格关系的图片。
    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多