我正在尝试在Microsoft SQL Server 2014中运行的MSSQL查询出现一个奇怪的问题。它是我的数据库结构的更新脚本。它应该基本上重命名表的列(从Price
到SellingPrice
)后将其内容合并到另一个。
USE db_meta
GO
DECLARE @BakItemPrices TABLE
(
ItemNum int,
Price int,
CashPrice int
)
-- backup old prices
insert into @BakItemPrices
select ItemNum, Price from dbo.ItemInfo
-- merge into other table
alter table ShopInfo
add column Price int NOT NULL DEFAULT ((0))
update ShopInfo
set ShopInfo.Price = i.Price
from ShopInfo s
inner join @BakItemPrices i
on s.ItemNum = i.ItemNum
GO
-- rename the column
exec sp_rename 'ItemInfo.Price', 'SellingPrice', 'COLUMN' -- The Debugger executes this first
GO
此查询总是给我错误
Msg 207,Level 16,State 1,Line 13 列名称“价格”无效。
在调试查询之前,我无法理解此错误。当我看到调试器甚至没有达到我在备份代码上放置的断点并说“它无法访问因为另一批正在执行时”时,我感到很惊讶。
进一步向下看,我看到调试器在执行我上面写的查询代码之前立即以exec sp_rename ...
行开头。因此,当我的备份代码被执行时,Column被命名为SellingPrice
而不是Price
,这显然会导致它失败。
我认为查询是从上到下处理的?为什么执行序列在我上面编写的代码之前执行?
答案 0 :(得分:3)
脚本从上到下排序。但是,在提交脚本的事务之后,对模式的某些更改是“可见的”。将脚本拆分为两个脚本,它可以提供帮助。