2011-03-18 44 views
8

Tôi đã nhập cơ sở dữ liệu máy chủ sql 2005 vào dự án cơ sở dữ liệu VS2010. Một trong những thủ tục được lưu trữ của tôi chứa một tuyên bố tương tự nhưDự án Cơ sở dữ liệu Visual Studio - Tham chiếu chưa được giải quyết tới bảng tạm thời

INSERT INTO #myTemp ...

và Visual Studio mang lại cho tôi một cảnh báo như

SQL04151: Thủ tục: [dbo ]. [mySproc] có một tham chiếu chưa được giải quyết đối tượng [#myTemp].

Có cách nào để giải quyết tham chiếu này không? Tôi muốn xóa càng nhiều cảnh báo dự án càng tốt.

+0

Bảng tạm thời được tạo trong quy trình được lưu trữ phải không? – Thomas

+0

Không, trong trường hợp này bảng tạm thời được tạo ra bởi một "cha mẹ" được lưu trữ proc mà sau đó gọi này nhiều lần trong một vòng lặp: ( – Nick

Trả lời

0

Nếu bạn biết rằng không có vấn đề với mã của bạn, bạn có thể ngăn chặn các cảnh báo xây dựng. Chuyển đến cài đặt của dự án và bạn sẽ tìm thấy tab có tên là Xây dựng. Có một trường ở đó để thêm các mã bạn muốn chặn. Tôi googled và tìm thấy this page, mô tả các bước.

+4

Tôi không nghĩ rằng tất cả các lỗi SQL04151 là một ý tưởng tuyệt vời. sẽ loại bỏ các thông điệp bảng tạm thời, nhưng bạn cũng sẽ chặn mọi cảnh báo tham chiếu db khác ... – GordonB

+0

Sau đó sử dụng: '#pragma warning disable 4151 /* MỘT SỐ MÃ */ #pragma warning restore 4151' Be Hãy chắc chắn để thêm ý kiến ​​về lý do tại sao bạn đang vô hiệu hóa cảnh báo – slimburrok

+3

#pragma không hoạt động trong các tệp .sql. –

0

Rõ ràng, VS không biết rằng proc được lưu trữ này chỉ được thực hiện từ bên trong một proc được lưu trữ khác để tạo bảng tạm thời này. Một giải pháp là thêm mã vào quy trình tạo bảng tạm thời nếu cần

If object_id('tempdb..#MyTemp') Is Null 
    Create Table #MyTemp 
     (
     ... 
     ) 

Nếu luôn được gọi từ phụ huynh, theo lý thuyết mã trên không bao giờ nên chạy.

8

Tôi đã có cùng một điều, nơi cha mẹ tạo ra nó. Thay vì thoát khỏi cảnh báo bằng cách tạo bảng nếu nó không tồn tại, tôi muốn có thể ném một ngoại lệ nếu không. Đặt câu lệnh CREATE sau câu lệnh return đảm bảo rằng nó sẽ không bao giờ chạy nhưng cũng xóa cảnh báo.

IF (OBJECT_ID('tempdb..#Foo') is null) 
BEGIN 
    Raiserror('#Foo doesn''t exist.', 16, 1) 
    RETURN 
    CREATE TABLE #Foo (foo int) --Here just to get rid of compile warning 
END 
Các vấn đề liên quan