none
已有表table1,修改栏位约束,增加计算 RRS feed

  • 问题

  • 现有表table1

    栏位为:

    number decimal(18,4),
    price money,

    先增加栏位Amount ,Amount  = number*price

    我将如何做?

    2013年2月28日 8:21

答案

  • 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 关键字来将计算列实际存储在表中。如果在计算列的计算更改时涉及任何列,将更新计算列的值

    2013年2月28日 8:32
  • 新增栏位是可以的,

    但是修改栏位计算是不可以的。我现在在环境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!

    2013年2月28日 9:14

全部回复

  • 增加一个计算列就可以了,Amount  as number*price

    2013年2月28日 8:28
  • 请教,如何写? 我是个SQLSERVER 菜鸟!
    2013年2月28日 8:29
  • 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 关键字来将计算列实际存储在表中。如果在计算列的计算更改时涉及任何列,将更新计算列的值

    2013年2月28日 8:32
  • 请教!

    如果有表test (number int,price int,amout int),我现在需修改test中的amout=number*price,

    我将如何做呢?

    2013年2月28日 8:36

  •  alter table test add amout as number*price
    • 已建议为答案 TerryChuang 2013年3月1日 0:49
    • 取消建议作为答案 TerryChuang 2013年3月1日 0:52
    2013年2月28日 8:43
  • 新增栏位是可以的,

    但是修改栏位计算是不可以的。我现在在环境SQLSERVER 2008下执行。是不可以的。

    2013年2月28日 8:50
  • 新增栏位是可以的,

    但是修改栏位计算是不可以的。我现在在环境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!

    2013年2月28日 9:14
  • 或者你可以先从SSMS修改然后生成脚本执行,结果跟上面的是一样的。

    2013年2月28日 9:17
  • 新增栏位是可以的,

    但是修改栏位计算是不可以的。我现在在环境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


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    2013年3月1日 0:57
  • 我测试了一下

    --修改字段数据类型 如果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


    给我写信: QQ我:点击这里给我发消息

    2013年3月1日 1:59
  • 我执行Jackie shen大侠的脚本会出现语法错误

    消息 156,级别 15,状态 1,第 1 行
    关键字 'SET' 附近有语法错误。

    ALTER TABLE dbo.Tmp_testComputeColumn SET (LOCK_ESCALATION = TABLE)
    go

    Jackie shen大侠set 选项是不是写错了?

     SET (LOCK_ESCALATION = TABLE)


    给我写信: QQ我:点击这里给我发消息

    2013年3月1日 2:03
  • 我执行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!

    2013年3月4日 1:06
  • SET (LOCK_ESCALATION = TABLE)  的意思是锁定表。LOCK_ESCALATION 参数是说明你要操作的对象,一般有三种

    1.TABLE  锁定表结构

    2.AUTO 如果存在表分区,就升级为分区锁

    3.DISABLE 禁用锁升级

    注意: 2008上用过,2005版本应该不行。

    GoodLuck

    2013年3月5日 1:56
  • 我执行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!



    给我写信: QQ我:点击这里给我发消息

    2013年3月5日 12:33
  • 我的是2005 ,难怪难怪


    给我写信: QQ我:点击这里给我发消息

    2013年3月5日 12:35