2010-02-16 32 views
13

Tôi đang làm việc với SQL Server 2008. Có thể thay đổi cột được tính toán mà không thực sự bỏ cột và sau đó thêm lại (mà tôi có thể làm việc) không? Ví dụ, tôi có bảng này:SQL - Làm thế nào để ALTER COLUMN trên cột được tính

CREATE TABLE [dbo].[Prices](
[Price] [numeric](8,3) NOT NULL, 
[AdjPrice] AS [Price]/[AdjFactor], 
[AdjFactor] [numeric](8,3) NOT NULL) 

Sau đó nhận ra rằng tôi có một chia tiềm năng bằng cách không lỗi tôi muốn thay đổi [Adjprice] cột để xử lý này, nhưng nếu tôi chỉ cần thả cột và thêm nó một lần nữa , Tôi mất thứ tự cột.

tôi muốn làm một cái gì đó như:

ALTER TABLE dbo.[Prices] 
ALTER COLUMN [AdjPrice] AS (CASE WHEN [AdjFactor] = 0 THEN 0 ELSE [Price]/[AdjFactor] END) 

Nhưng điều này là không đúng. Nếu điều này là có thể, hoặc có một giải pháp khác, tôi sẽ đánh giá cao sự giúp đỡ.

+1

Thứ tự cột nào? – MartW

+2

thứ tự cột là hoàn toàn không có liên quan trong SQL Server anyway - tại sao bận tâm bảo quản nó ?? Thả và tái tạo là cách duy nhất để đi. –

+1

Nếu bạn đang viết các truy vấn của mình sao cho chúng phụ thuộc vào thứ tự cột, vui lòng dừng lại. –

Trả lời

19

Thật không may, bạn không thể làm điều này mà không bỏ cột trước tiên.

From MSDN:

ALTER COLUMN
Chỉ định rằng cột có tên là phải được thay đổi hoặc thay đổi. ALTER COLUMN không được phép nếu mức độ tương thích là 65 hoặc thấp hơn. Để biết thêm thông tin, xem sp_dbcmptlevel (Transact-SQL).

  • Cột biến đổi không thể có bất kỳ một trong các cách sau:

    • Một cột tính toán hoặc được sử dụng trong một cột tính.
+0

Tuy nhiên, bạn có thể duy trì dữ liệu cột tính toán bằng cách sử dụng bảng tạm thời [như được minh họa trong câu trả lời ở đây] (http://stackoverflow.com/a/23134891/1193596). – Amicable

+0

@Amicable không phải là cột * được tính toán nữa, do đó, đó là trường hợp hoàn toàn khác và tập hợp các hạn chế. –

0

NO

nếu nó được tính toán, là những gì to tát thả nó và thêm nó một lần nữa? là nó ĐÃ ĐẠT ĐƯỢC và có hàng triệu hàng?

0

Tôi không nghĩ rằng bạn có thể thay đổi cột này khi không tham gia. Vì vậy hãy thả colum rồi thêm cột mới.

Nếu bạn tìm ra bất kỳ cách nào khác để thực hiện việc này, vui lòng cho tôi biết.

-4

nó dễ dàng để vượt qua chia cho số không lỗi

sử dụng

SELECT 
(100/NULLIF(0, 0)) AS value 

nó sẽ trả về một null, nếu 0 là trong cột đó,

thay vì ALTER đi ​​cho bản cập nhật bằng cách sử dụng các ở trên ví dụ

Cũng đọc chuẩn hóa thứ 3 cho cột được tính

0

nếu bạn phải duy trì trật tự, sao chép dữ liệu vào bảng trùng lặp, sau đó xây dựng lại bảng để giữ thứ tự cột của bạn, sau đó sao chép dữ liệu từ bảng trùng lặp trở lại.

Chỉ cần chắc chắn làm điều này khi không có hoạt động đang diễn ra.

Các vấn đề liên quan