早期执行“sp_rename”会导致查询失败

时间:2015-06-01 22:21:40

标签: sql sql-server tsql

我正在尝试在Microsoft SQL Server 2014中运行的MSSQL查询出现一个奇怪的问题。它是我的数据库结构的更新脚本。它应该基本上重命名表的列(从PriceSellingPrice后将其内容合并到另一个。

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,这显然会导致它失败。

我认为查询是从上到下处理的?为什么执行序列在我上面编写的代码之前执行?

1 个答案:

答案 0 :(得分:3)

脚本从上到下排序。但是,在提交脚本的事务之后,对模式的某些更改是“可见的”。将脚本拆分为两个脚本,它可以提供帮助。