积极答复者
已有表table1,修改栏位约束,增加计算

问题
答案
-
create table test (number int,price int,amout as number*price)
insert into test values (1,3)
select * from test
注意:非另行指定,否则计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将重新计算它们的值。据库引擎在 CREATE TABLE 和 ALTER TABLE 语句中使用 PERSISTED 关键字来将计算列实际存储在表中。如果在计算列的计算更改时涉及任何列,将更新计算列的值
- 已编辑 KevinLiu328 2013年2月28日 8:32
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2013年3月7日 3:39
-
新增栏位是可以的,
但是修改栏位计算是不可以的。我现在在环境SQLSERVER 2008下执行。是不可以的。
举个例子,假如你想把amout=number*price, 改为 amout233=number*price*price (同时修改名字跟计算方式), 执行如下步骤。
CREATE TABLE dbo.Tmp_test
(
number int NULL,
price int NULL,
amout233 AS (([number]*[price])*[price])
) ON [PRIMARY]go
ALTER TABLE dbo.Tmp_test SET (LOCK_ESCALATION = TABLE)
go
IF EXISTS(SELECT * FROM dbo.test)
EXEC('INSERT INTO dbo.Tmp_test (number, price)
SELECT number, price FROM dbo.test WITH (HOLDLOCK TABLOCKX)')go
DROP TABLE dbo.test
go
EXECUTE sp_rename N'dbo.Tmp_test', N'test', 'OBJECT'
Please click the Mark as Answer button if a post solves your problem!- 已编辑 Michael CS 2013年2月28日 9:15
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2013年3月7日 3:01
全部回复
-
create table test (number int,price int,amout as number*price)
insert into test values (1,3)
select * from test
注意:非另行指定,否则计算列是未实际存储在表中的虚拟列。每当在查询中引用计算列时,都将重新计算它们的值。据库引擎在 CREATE TABLE 和 ALTER TABLE 语句中使用 PERSISTED 关键字来将计算列实际存储在表中。如果在计算列的计算更改时涉及任何列,将更新计算列的值
- 已编辑 KevinLiu328 2013年2月28日 8:32
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2013年3月7日 3:39
-
alter table test add amout as number*price- 已建议为答案 TerryChuang 2013年3月1日 0:49
- 取消建议作为答案 TerryChuang 2013年3月1日 0:52
-
新增栏位是可以的,
但是修改栏位计算是不可以的。我现在在环境SQLSERVER 2008下执行。是不可以的。
举个例子,假如你想把amout=number*price, 改为 amout233=number*price*price (同时修改名字跟计算方式), 执行如下步骤。
CREATE TABLE dbo.Tmp_test
(
number int NULL,
price int NULL,
amout233 AS (([number]*[price])*[price])
) ON [PRIMARY]go
ALTER TABLE dbo.Tmp_test SET (LOCK_ESCALATION = TABLE)
go
IF EXISTS(SELECT * FROM dbo.test)
EXEC('INSERT INTO dbo.Tmp_test (number, price)
SELECT number, price FROM dbo.test WITH (HOLDLOCK TABLOCKX)')go
DROP TABLE dbo.test
go
EXECUTE sp_rename N'dbo.Tmp_test', N'test', 'OBJECT'
Please click the Mark as Answer button if a post solves your problem!- 已编辑 Michael CS 2013年2月28日 9:15
- 已标记为答案 Amy PengMicrosoft employee, Moderator 2013年3月7日 3:01
-
新增栏位是可以的,
但是修改栏位计算是不可以的。我现在在环境SQLSERVER 2008下执行。是不可以的。
不知道我有沒有會錯意,根據MSDN說明,ALTER COLUMN似乎不支援把COLUMN變更為計算資料行。
或許你可以考慮先DROP CLOUMN在ADD計算資料行。
if object_id('test') is not null drop table test go create table test (number int,price int) go insert into test values (1,10),(2,20),(3,30) go --新增 amount 資料行 alter table test add amount int go --刪除 amount 資料行 alter table test drop column amount go --重新加入amount資料行並定義為計算資料行 alter table test add amount as number * price go select * from test drop table test go
http://msdn.microsoft.com/zh-tw/library/ms190273.aspx
以上說明若有錯誤請指教,謝謝。
-
我测试了一下
--修改字段数据类型 如果amount是计算列,不能修改数据类型 ALTER TABLE [dbo].[test] ALTER COLUMN [amount] INT GO --直接报错语法错误 ALTER TABLE [dbo].[test] ALTER COLUMN [amount] ADD amount2 AS number * price GO
其实从字面意思来看ALTER COLUMN应该就是做修改的,例如修改字段的数据类型
除了Jackie shen大侠使用了新建表格然后移数据,其他大侠都使用了下面的语句
alter table test add amount as number * price go
-
我执行Jackie shen大侠的脚本会出现语法错误
消息 156,级别 15,状态 1,第 1 行
关键字 'SET' 附近有语法错误。ALTER TABLE dbo.Tmp_testComputeColumn SET (LOCK_ESCALATION = TABLE) go
Jackie shen大侠set 选项是不是写错了?
SET (LOCK_ESCALATION = TABLE)
Please click the Mark as Answer button if a post solves your problem! -
我执行Jackie shen大侠的脚本会出现语法错误
消息 156,级别 15,状态 1,第 1 行
关键字 'SET' 附近有语法错误。ALTER TABLE dbo.Tmp_testComputeColumn SET (LOCK_ESCALATION = TABLE) go
Jackie shen大侠set 选项是不是写错了?
SET (LOCK_ESCALATION = TABLE)
"ALTER TABLE dbo.Tmp_testComputeColumn SET (LOCK_ESCALATION = TABLE)" 这个语句是哪里来的,我上面没有写过这句语句。
Please click the Mark as Answer button if a post solves your problem!