Chúng ta đều biết rằng các kiểu bảng giá trị bảng do người dùng định nghĩa SQL (UDT) không thể bị loại bỏ nếu chúng có phụ thuộc/phụ thuộc. Đúng.Các loại bảng do người dùng định nghĩa SQL: Tại sao chúng ta có thể thả chúng nếu không được sử dụng làm tham số?
Nhưng, hôm nay tôi đã giảm ngay cả khi họ có người phụ thuộc. Chỉ tiêu chí là chúng không nên được sử dụng làm tham số của các đối tượng DB như proc hoặc func.
CREATE TYPE FooUDT AS TABLE
(
ID int NOT NULL
)
phụ thuộc
CREATE PROCEDURE Bar
as
BEGIN
DECLARE @Identifier FooUDT
--Some operations on @Identifier
END
GO
Các FooUDT
có thể được giảm vì nó được sử dụng bên trong một proc và không phải là một tham số. Nhưng theo cách nó không thể bị vứt bỏ.
CREATE PROCEDURE Bar
@Identifier FooUDT readonly
as
BEGIN
--Some operations on @Identifier
END
GO
Điều thú vị hơn là trong cả hai trường hợp, nếu chúng tôi kiểm tra phụ thuộc, cả hai sẽ hiển thị tên khác. Tuy nhiên, các trường hợp trước đây có thể được giảm xuống nhưng không phải là sau này. Tại sao lại như vậy? Hay tôi đang thiếu một cái gì đó?
Khả năng xảy ra lỗi lớn của T-SQL được gọi là [độ phân giải tên trì hoãn] (https : //technet.microsoft.com/library/ms190686). –
@JeroenMostert: Với UDT khác biệt của nó. Nếu thiếu UDT và cú pháp đúng, thì proc thậm chí không được tạo ra. –
Tôi biết tôi không nên thay đổi "biên dịch trì hoãn" thành "độ phân giải tên trì hoãn". Nhưng ý tưởng là như nhau: đối với bất cứ thứ gì không phải là bảng, cú pháp được phân tích cú pháp và quy trình không được tạo trừ khi tất cả các đối tượng tồn tại. Nhưng sau đó bạn vẫn được tự do thả các đối tượng đó mà không có T-SQL phàn nàn, bởi vì việc biên dịch vẫn được trì hoãn. Việc biên dịch trì hoãn không áp dụng cho siêu dữ liệu của thủ tục đã lưu trữ, chỉ với các phát biểu của nó, đó là lý do tại sao bạn không thể bỏ UDT nếu nó được sử dụng như một tham số. –