最近我遇到了这样的情况:我需要从一个表中删除一些行,但是拼写错误导致一个列名错误。在没有报错的情况下,表中所有的行都被删除了。以下是重现此问题的脚本。
现有一个 Order 表,其中包含四个带有 OrderID 的订单。还有一个 LIST_TO_DELETE 表,其中只有一个 ItemID。
我应该使用:
DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT ItemID FROM #LIST_TO_DELETE )
我使用了另一种方法
DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OrderID FROM #LIST_TO_DELETE )
这导致在我只想删除一个订单时,所有 #Orders 表中的行都被删除了。
CREATE TABLE #Orders (OrderID INT, OrderName VARCHAR(100))
INSERT INTO #Orders(OrderID, OrderName) VALUES (1,'Order One'),(2,'Order Two'),(3,'Order Three'), (4,'Order Four')
CREATE TABLE #LIST_TO_DELETE (ItemID INT);INSERT INTO #LIST_TO_DELETE(ItemID) VALUES (1)
DECLARE @rowcount INT = 1
WHILE @rowcount > 0
BEGIN
DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OrderID FROM #LIST_TO_DELETE )
SET @rowcount = @@rowcount
END
SELECT * FROM #Orders
DROP TABLE #Orders
DROP TABLE #LIST_TO_DELETE
在我的原始代码中,Orders表是真实存在的,而LIST_TO_DELETE是一个表变量,但使用哪种类型的表似乎没有任何区别。 如果我使用OrderID或ItemID之外的任何列名,就会出现错误。
DELETE TOP(1) FROM #Orders WHERE OrderID IN (SELECT OtherID FROM #LIST_TO_DELETE )
Invalid column name 'OtherID'
为什么这段代码会表现出这种行为?