Cảnh báo là có vì chức năng XML value()
. Tham số thứ hai value()
là những gì bạn muốn giá trị được lưu trữ trong XML được chuyển đổi thành. Bạn có thể lập luận rằng trên thực tế đây không phải là một chuyển đổi ngầm mà là một chuyển đổi rất rõ ràng vì bạn đang yêu cầu nó xảy ra. Có lẽ một cái gì đó cho một mục kết nối để đề xuất với Microsoft.
Cách đơn giản nhất để tái tạo những gì bạn nhìn thấy.
declare @X xml;
select @X.value('text()[1]', 'int');
Đưa ra hai cảnh báo.
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[lvalue],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[value],0)" />
</Warnings>
Như bạn có thể thấy bạn cũng nhận được nó với int và bạn nhận được hai trong số chúng cho mỗi lần gọi value()
.
declare @X xml;
select @X.value('text()[1]', 'int'),
@X.value('text()[1]', 'bit');
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[lvalue],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(int,XML Reader with XPath filter.[value],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(bit,XML Reader with XPath filter.[lvalue],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(bit,XML Reader with XPath filter.[value],0)" />
</Warnings>
Việc chuyển đổi được thực hiện trong toán tử Stream Aggregate tính toán giá trị như thế này.
MIN(CASE WHEN [@X] IS NULL
THEN NULL
ELSE
CASE WHEN datalength(XML Reader with XPath filter.[value])>=(128)
THEN CONVERT_IMPLICIT(int,XML Reader with XPath filter.[lvalue],0)
ELSE CONVERT_IMPLICIT(int,XML Reader with XPath filter.[value],0)
END
END)
Kết quả từ hàm Giá trị bảng được trả về trong cột lvalue
hoặc value
. Biểu thức kiểm tra bằng cách sử dụng datalength
để tìm ra nó nên được tìm nạp từ đâu và sau đó chuyển đổi nó thành kiểu dữ liệu mong muốn của bạn.
Có cách nào để loại bỏ cảnh báo này?
Có, có. Bạn loại bỏ lệnh TYPE
này khỏi FOR XML PATH
câu lệnh và bạn loại bỏ cuộc gọi đến value()
hàm. Một tác dụng phụ của việc đó là các giá trị mà bạn ghép có chứa các ký tự cần được mã hóa trong XML giống như &<>
sẽ được mã hóa trong kết quả của bạn.