【发布时间】:2015-02-02 08:07:37
【问题描述】:
我正在尝试使用存储过程从CSD_4_00 中的另一个trade 表更新surveillance 数据库中的trade 表,如下所示:
USE [CSD_4_00]
GO
CREATE PROCEDURE [dbo].[TradeData]
AS
BEGIN
UPDATE [surveillance].[dbo].Trade
SET SellerMarketMember = (SELECT [SellerMember].[MemberCode]
FROM Trade
INNER JOIN [Member] As SellerMember ON Trade.[SellerMarketMemberId] = [SellerMember].[MemberId])
, SellerAccount = (SELECT [SellerAccount].[AccountNumber]
FROM Trade
INNER JOIN [Account] As SellerAccount ON Trade.[SellerAccountId] = [SellerAccount].[AccountId])
, BuyerMarketMember = (SELECT [BuyerMember].[MemberCode]
FROM Trade
INNER JOIN [Member] As BuyerMember ON Trade.[BuyerMarketMemberId] = [BuyerMember].[MemberId])
, BuyerAccount = (SELECT [BuyerAccount].[AccountNumber]
FROM Trade
INNER JOIN [Account] As BuyerAccount ON Trade.[BuyerAccountId] = [BuyerAccount].[AccountId])
, CancelTime = (SELECT CancelTime
FROM Trade)
WHERE [surveillance].[dbo].Trade.[Ticket] = (SELECT TicketNumber FROM Trade )
END
GO
但在执行时却出现以下错误:
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
所以,我尝试使用我的程序的这个修改版本来解决这个问题:
CREATE PROCEDURE [dbo].[TradeData]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
UPDATE [surveillance].[dbo].Trade
SET SellerMarketMember = [SellerMember].[MemberCode]
FROM Trade as T
INNER JOIN [Member] As SellerMember ON T.[SellerMarketMemberId] = [SellerMember].[MemberId]
WHERE [surveillance].[dbo].Trade.[Ticket] in(SELECT TicketNumber FROM Trade )
UPDATE [surveillance].[dbo].Trade set SellerAccount = [SellerAccount].[AccountNumber]
FROM Trade as T
INNER JOIN [Account] As SellerAccount ON T.[SellerAccountId] = [SellerAccount].[AccountId]
WHERE [surveillance].[dbo].Trade.[Ticket] in(SELECT TicketNumber FROM Trade )
UPDATE [surveillance].[dbo].Trade set BuyerMarketMember = [BuyerMember].[MemberCode]
FROM Trade as T
INNER JOIN [Member] As BuyerMember ON T.[BuyerMarketMemberId] = [BuyerMember].[MemberId]
WHERE [surveillance].[dbo].Trade.[Ticket] in(SELECT TicketNumber FROM Trade )
UPDATE [surveillance].[dbo].Trade set BuyerAccount = [BuyerAccount].[AccountNumber]
FROM Trade as T
INNER JOIN [Account] As BuyerAccount ON T.[BuyerAccountId] = [BuyerAccount].[AccountId]
WHERE [surveillance].[dbo].Trade.[Ticket] in(SELECT TicketNumber FROM Trade )
UPDATE [surveillance].[dbo].Trade set CancelTime = T.CancelTime FROM Trade as T
WHERE [surveillance].[dbo].Trade.[Ticket] in(SELECT TicketNumber FROM Trade )
END
GO
执行时没有出现错误,但我的表中得到了错误的结果。 有什么帮助吗?
【问题讨论】:
-
您遇到的问题是,在至少一个 UPDATE 中,您的子选择或 JOIN 返回不止一行,因此 TicketNumber 在 Trade 表中不是唯一的 - 您需要使谓词准确返回1 或 0 行。
标签: sql-server sql-server-2008 stored-procedures