我是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行受影响)
以下是表格的关系:
答案 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