更正此插入,选择,删除的sql语句

时间:2011-12-10 20:34:04

标签: sql asp.net database visual-studio-2008

INSERT INTO Checkout(ProductID, MemberID, Quantity) 
  SELECT ProductID, MemberID, Quantity 
    FROM Cart 
    WHERE (MemberID = MemberID) 
  DELETE FROM CART WHERE (MemberID = MemberID)

sql语句在Select,WHERE部分之前是可行的,但是一旦我添加了delete语句,就会出现错误(查询表达式中的语法错误缺少运算符)。第二个MemberID是我为第一个MemberID参数赋予的值。请帮我解决这个问题,因为在将数据从第一个表格传输到第二个表格后,我需要从第一个表格中删除数据。

[编辑]感谢您的所有建议,现在我意识到WHERE(MemberID = MemberID) 将整个表导入到新表中,此语句也将删除整个表的内容。我该怎么做才能确保sql语句只删除特定成员项?

主页>会员登录页面>购买商品>存储在购物车数据库中的商品(具有会员ID)>仅显示购物车中特定会员购买的商品>继续结帐(仅显示该成员项目,删除购物车项目)

3 个答案:

答案 0 :(得分:1)

问题在于第二个“MemberID”。这需要是常量或具有与字段名称不冲突的变量名称。消除歧义的一些技巧显示在相关的SO帖子中:How do you avoid column name conflicts?

答案 1 :(得分:1)

您没有提到您正在使用的SQL Server的版本 - 但您可以使用OUTPUT clause DELETE语句来实现您的目标正在寻找。 OUTPUT子句是在SQL Server 2005中引入的,因此,如果您使用的是2005或更新版本,则此代码段应该适用于您:

试试这个:

DELETE FROM dbo.CART 
OUTPUT deleted.ProductID, deleted.MemberID, deleted.Quantity
  INTO dbo.Checkout(ProductID, MemberID, Quantity) 
WHERE MemberID = @MemberID  

基本上,它会针对您的DELETE表运行dbo.Cart语句,并捕获已删除的行;然后将这些插入到dbo.Checkout表中。

此外 - WHERE子句中的条件似乎很有趣 - 基本上,这将选择并从而删除表中的所有行 ......

更新:我假设您以某种方式将相关成员的ID存储在@MemberID中并使用它来从dbo.Cart表中选择要删除的行..

答案 2 :(得分:0)

将传递的数据存储到新声明的变量中,并将该变量用于以下所有位置,这样可以正常工作,谢谢

DECLARE @PassedMemberID INT
SET @PassedMemberID = MemberID --Store your passing MemberID here for later use

INSERT INTO Checkout(ProductID, MemberID, Quantity) 
    SELECT ProductID, MemberID, Quantity 
    FROM Cart 
    WHERE (MemberID = @PassedMemberID) 
DELETE FROM CART WHERE (MemberID = @PassedMemberID)