如何实现MS SQL 2014存储过程

时间:2016-02-29 14:56:05

标签: sql-server stored-procedures

我是MS SQL 2014存储过程的新手。我有一张桌子如下图所示。我想创建一个存储过程。 我设计了我的存储过程,但是我感到非常困难,甚至无法启动。任何人都可以帮助我,我该怎么做?

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

发送: CardNo,CardPass,PosSerialNo

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

MY TABLES:

1)CardIssueTable: 的列:     CardId,CardNo,CustId

2)CustomerTable: 的列:         CustId,CustName,CustSurname

3)PosTable: 的列:         PosId,PosSerial,PosLocation

4)PaymentTable: 的列:         PaymentId,PaymentLoaction,PaymentAmount

5)CardPasswordTable: 的列:         PassId,密码

编辑:

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

商店程序:

    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

错误:

  

Msg 248,Level 16,State 1,Procedure ElitcardCustomerControl,Line 21   varchar值的转换' 5852354822730001'溢出了   int column。

     

(1行受影响)

     

(1行受影响)

以下是表格的关系:

enter image description here

2 个答案:

答案 0 :(得分:3)

查看数据模型这一行

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

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

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

这是一种标准关系 - 我不知道为什么你觉得顾客的名字是加入的领域。

答案 1 :(得分:2)

我真的希望你不以明文形式存储密码,并且我没有得到你们桌子之间的所有关系(例如,在postable和paytable之间,在passwordtable和cartable之间的关系) ),但我给你一个你需要的示例的SP。不要忘记IT只是示例。

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