Làm cách nào để viết CẬP NHẬT SQL với bí danh Bảng trong SQL Server 2008?


212

Tôi có một điều rất cơ bản UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

Truy vấn này chạy tốt trong Oracle, Derby, MySQL- nhưng nó bị lỗi trong SQL server 2008 với lỗi sau:

"Msg 102, Cấp 15, Trạng thái 1, Dòng 1 Cú pháp không chính xác gần 'Q'."

Nếu tôi loại bỏ tất cả các lần xuất hiện của bí danh, "Q" khỏi SQL thì nó hoạt động.

Nhưng tôi cần sử dụng bí danh.


5
Tại sao bạn cần sử dụng một bí danh? Có vẻ như bạn không cần nó.
Mark Byers

5
Có - từ góc độ lập trình tôi không cần nó. Nhưng tôi có một thư viện cũ / cũ tạo ra tất cả các loại SQL DML với các bí danh bảng. Thư viện có rất nhiều lớp với một loại logic phức tạp. Bây giờ việc loại bỏ các bí danh bảng trong thư viện là công việc nhiều hơn là điều chỉnh logic hiện có để làm việc cho MSSQL. Ngoài ra khi nhiều bảng có liên quan, tôi cần phải có bí danh bảng.
javauser71

Câu trả lời:


421

Cú pháp sử dụng bí danh trong câu lệnh cập nhật trên SQL Server như sau:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

Các bí danh không cần thiết ở đây mặc dù.


2
Đúng !!! Nó hoạt động. Cảm ơn đã phản ứng nhanh chóng. Bạn có biết tại sao máy chủ MSSQL hỗ trợ cú pháp độc đáo như vậy để cập nhật không?
javauser71

3
Mark Byers - Câu trả lời tuyệt vời !! Cú pháp này cho phép tôi thêm một câu lệnh Chọn nhận xét, cho phép tôi kiểm tra bản cập nhật bằng cách thực hiện chọn trước (tô sáng từ chọn xuống và thực thi):SET Q.TITLE = 'TEST' -- SELECT *

2
Đẹp. Điều này làm cho nó dễ dàng hơn để sử dụng intellisense trong mệnh đề where.
Magnus

Đó không phải là bí danh. Đó chỉ là tên 'bảng.column' đủ điều kiện: - /
ScottWelker

17

Bạn luôn có thể thực hiện phương pháp CTE , (Biểu thức dạng bảng chung).

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';

Vâng - nó cũng hoạt động. Nhưng đối với chương trình JDBC / Java thì đây là một loại cú pháp phức tạp. Cám ơn phản hồi của bạn.
javauser71

-1

Trường hợp đặc biệt cho Postgres

Một danh sách các giải pháp trên sẽ không làm việc cho tôi. Vì vậy, đây là giải pháp cho Postgres

Khi tôi là một đám cháy truy vấn của tôi

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

Kết quả: LRI: cột "q" của "bảng" quan hệ không tồn tại

Giải pháp sẽ là bạn không cần sử dụng allis trên giá trị dữ liệu SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';

Xin chào Ronak, bỏ qua câu trả lời của bạn vì nó dành cho Postgres và đã có một giải pháp hoạt động cho T-SQL ở trên.
Alpi Murányi

hii @ AlpiMurányi bạn có thể gợi ý cho tôi giải pháp nào hiệu quả trong trường hợp của tôi không. để tôi có thể thực hiện, Đã đề cập đến Lỗi trong câu trả lời của tôi
Ronak Patel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.