Mã định danh nhiều phần trong Microsoft SQL Server


7

Tôi đang di chuyển cơ sở dữ liệu SQL Server 6.5 sang SQL Server 2012. Quá trình di chuyển diễn ra tốt đẹp nhưng một trong những phần mềm sử dụng cơ sở dữ liệu này thực hiện một truy vấn lạ:

UPDATE myTable SET Field1='',Field2=0, a.Field3=14 WHERE Field10=1

Tất nhiên, vấn đề nằm ở định danh ('a') trước Field3. Không có chế độ xem, bí danh hoặc tham gia với tên đó nhưng đối với SQL Server 6.5, đó là một truy vấn hợp lệ.

Vì tôi không quen với SQL Server 6.5, có ai trong số các bạn còn nhớ ý nghĩa của cú pháp này không?

Phần mềm sử dụng truy vấn này là một phần mềm cũ mà tôi không có bất kỳ nguồn nào (và công ty đã đóng nó bây giờ ...), vì vậy thay đổi truy vấn không phải là một tùy chọn.

Truy vấn đầy đủ là

UPDATE SituazioneMacchina 
SET DatiSetPointSpediti=''
,   SpedMappa=0
,   NrRichMappa=0
,   DatiSetPoint=''
,   a.IDProduzione=14
WHERE NumMacchina=1 

Nếu tôi thay đổi "a.IDProduzione" bằng một cái gì đó như "fasdffas.IDProduzione", truy vấn vẫn hoạt động trong SQL Server 6.5


Truy vấn đầy đủ như sau: CẬP NHẬT SituazioneMacchina SET DatiSetPointSpediti = '', SpedMappa = 0, NrRichMappa = 0, DatiSetPoint = '', a.IDProduzione = 14 WHERE NumMacchina = 1 Nếu tôi thay đổi .IDProduzione ", truy vấn vẫn hoạt động trong SQL 6.5
Nicola Cassolato

Nếu truy vấn trở UPDATE a SET ... FROM myTable AS a WHERE ...nên hợp lệ, có?
billinkc

Có vẻ như điều này đã được sửa bởi 7.0. Tôi không thể chấp nhận cú pháp này. 4.21 là tốt với nó, mặc dù, về cơ bản bỏ qua bí danh bảng.
db2

@ db2 - Bạn vẫn còn chạy 4.21?
Martin Smith

1
@MartinSmith Không phải ai cũng có máy ảo 4.21 ngồi xung quanh sao? :)
db2

Câu trả lời:


8

Như bạn nói truy vấn không có ý nghĩa gì.

Có lẽ chỉ là một lỗi trình phân tích cú pháp trong 6.5. Đã có một vài vấn đề tương tự khác ORDER BY nonsensealias.somecolumnhoạt động cho đến năm 2005 với hành vi SQL Server 2000

Tên cột trong mệnh đề ORDER BY được phân giải thành các cột được liệt kê trong danh sách chọn, bất kể chúng có đủ điều kiện hay không. Ví dụ: truy vấn sau đây thực thi không có lỗi:

USE pubs
SELECT au_fname AS 'FName',
  au_lname AS 'LName'
FROM authors a
ORDER BY a.LName

SQL Server bỏ qua vòng loại a trong mệnh đề ORDER BY và giải quyết tên cột LName vào danh sách chọn.

và vẫn còn một vấn đề tương tự cho các INSERTcâu lệnh trong đó cú pháp sau được chấp nhận.

CREATE TABLE nisse(hult int NOT NULL)
go
INSERT nisse(ab.xx.hult)
VALUES(12)
go
DROP TABLE nisse

Cảm ơn Martin. Tôi đã thử cùng một truy vấn trong SQL 2008 với mức độ tương thích SQL 2000 và nó không hoạt động. Có thể lỗi đã được giải quyết trong SQL 2000. Tôi sẽ điều tra thêm một ngày nữa và sau đó tôi sẽ đánh dấu câu trả lời của bạn là được chấp nhận.
Nicola Cassolato

@Nicola query in SQL 2008 with SQL 2000 compatibility levelĐiều này thay đổi một số thứ xung quanh việc phân tích cú pháp và mã thông báo, nhưng vẫn chỉ có MỘT công cụ cơ bản, tức là nó không chạy một cách kỳ diệu công cụ SQL Server 2000!
孔夫子

Vâng Richard, tôi biết điều đó, tôi chỉ hy vọng :)
Nicola Cassolato

@Martin: bạn đã đúng. Đó là một lỗi SQL 6.5, đã được giải quyết trong SQL Server 7.0. Tôi có thể làm cho truy vấn đó hoạt động trên SQL 2000 với mức độ tương thích lên tới 65.
Nicola Cassolato
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.