Lỗi chuyển đổi trên paramater nhưng không thay đổi


7

Tôi đã có một thủ tục được lưu trữ chấp nhận một tham số;

CREATE PROCEDURE [dbo].[Stored_Proc_Name] (@ParamID NVARCHAR(255) = NULL)

Tôi gọi thủ tục được lưu trữ này và chuyển qua một định danh duy nhất, đại loại như thế này;

EXEC [Stored_Proc_Name] 'a6ed99c1-29c8-43f4-9e3a-0065e6dc7fc1'

Quy trình được lưu trữ thực hiện một chút xử lý XML và trả về một tập kết quả, nó khá đơn giản.

Đối với một vài thông số được thông qua, tôi gặp lỗi chuyển đổi loại;

Msg 8114, Level 16, State 5, Procedure Stored_Proc_Name, Line 0
Error converting data type nvarchar to int.

Ban đầu tôi nghĩ rằng đây là một vấn đề với dữ liệu nhưng vấn đề sẽ tự giải quyết nếu tôi khai báo một biến cục bộ trong thủ tục được lưu trữ, như thế này và sau đó sử dụng biến cục bộ đó thay cho tham số. Những nơi duy nhất mà tham số này được sử dụng là trong WHEREcác mệnh đề trong kho lưu trữ của tôi.

CREATE PROCEDURE [dbo].[Stored_Proc_Name] (@ParamID NVARCHAR(255) = NULL)
AS
DECLARE @localID nvarchar(255)
SET @localID = @ParamID

Vấn đề được giải quyết và thủ tục chạy tốt.

Có ý tưởng nào về bước tiếp theo của cuộc điều tra hoặc điều gì đó rõ ràng mà tôi đã bỏ lỡ không?

Cập nhật:

Sau khi điều tra thêm, đây là một vấn đề với thuộc tính XML thiếu [1] nên có vẻ như đã cố gắng chuyển đổi nhiều thuộc tính gây ra lỗi. Tôi hiện đang điều tra làm thế nào nó được sửa với biến và sẽ cập nhật một khi tôi có câu trả lời hợp lý. Tôi sẽ đánh dấu câu trả lời là được chấp nhận để ai đó nhận được tiền thưởng.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


5

Tôi tự hỏi nếu tình huống tham số / biến thực sự chỉ che giấu một chuyển đổi ngầm không liên quan trong truy vấn của bạn. Đây là một sự kéo dài và ai đó tốt hơn với các phần bên trong của SQL Server có thể có thể làm rõ nếu tôi hoàn toàn sai ở đây, nhưng tôi nghi ngờ bạn đang nhận các kế hoạch thực hiện khác nhau khi chuyển đổi giữa cách tiếp cận tham số và biến. Sự khác biệt trong các kế hoạch có thể đủ mạnh trong đó một lỗi chuyển đổi ngầm định varcharintchỉ xảy ra với cách tiếp cận được tham số hóa dựa trên thứ tự tham gia trái ngược với cách tiếp cận biến vì biến không được đánh hơi đúng và sử dụng thứ tự tham gia hoàn toàn khác kết quả là

Để kiểm tra lý thuyết của tôi, hãy ném một OPTION (RECOMPILE)câu lệnh vào cuối truy vấn của bạn khi bạn chuyển đổi thủ tục được lưu trữ của mình để sử dụng một biến và xem điều gì xảy ra. Nếu lỗi xảy ra lần nữa, có lẽ bạn đang chạy vào một chuyển đổi ngầm định khác trong truy vấn của mình chỉ xảy ra với một kế hoạch thực hiện cụ thể, nghĩa là lỗi bạn thấy không liên quan đến đầu vào, mà là dữ liệu đã có trong hệ thống và Làm thế nào bạn tham gia các bảng trong tuyên bố của bạn.

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.