2011-08-11 27 views
10

Tôi đã tham gia cuộc họp nhóm người dùng ngày hôm qua và họ đã chỉ ra rằng việc sử dụng các truy vấn được tham số hóa tốt hơn là truy vấn harcoding. Mà tôi đã suy nghĩ, điều này không làm bất cứ điều gì có lợi (rõ ràng trên một quy mô lớn hơn nhiều so với mặc dù điều này):Thực tiễn tốt nhất giữa hai truy vấn này

DECLARE @Client1 UNIQUEIDENTIFIER, 
@Client2 UNIQUEIDENTIFIER 
SET @ClientId1 ='41234532-2342-3456-3456-123434543212'; 
SET @ClientId2 = '12323454-3432-3234-5334-265456787654'; 

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN (@Client1,@Client2) 

Trái ngược với:

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN ('41234532-2342-3456-3456-123434543212','12323454-3432-3234-5334-265456787654') 
+2

. Tôi quen thuộc với [khai thác của mẹ] (http://xkcd.com/327/) nhưng tôi hơi nghi ngờ về những tuyên bố khác. –

Trả lời

4

Các truy vấn được tham chiếu và mệnh đề IN thực sự không được thực hiện một cách trivially nếu IN liệt kê các thay đổi theo thời gian.

đã đọc câu hỏi này SO và câu trả lời: Parameterize an SQL IN clause

Parameters, do thiết kế, là một giá trị duy nhất. Mọi thứ khác phải được thực hiện theo cách thủ công, có các vấn đề về bảo mật, chẳng hạn như SQL Injection.

Từ quan điểm hiệu suất, bạn sẽ có hiệu suất tốt hơn cho các truy vấn được tham số, đặc biệt nếu cùng một truy vấn được chạy nhiều lần, nhưng với các giá trị tham số khác nhau. Tuy nhiên, nếu bạn có danh sách IN động (đôi khi 2 mục, đôi khi 3), bạn có thể không nhận được lợi thế của việc sử dụng truy vấn được tham số.

Đừng mất hy vọng. Một số người đã có thể thực hiện điều đó (truy vấn Parametrized và mệnh đề IN). Nó, một lần nữa, không tầm thường, mặc dù.

1

Nó không nên tổn thương, nhưng bạn' sẽ nhận được hiệu quả nhất từ ​​các câu lệnh đã chuẩn bị khi bạn sử dụng các truy vấn được tạo bởi đầu vào của người dùng. Nếu họ nhấp vào một nút để "hiển thị tất cả", nó không phải là một việc lớn; tuy nhiên, nếu bạn đang nhắc người dùng nhập tên của họ, bạn nghiêm túc cần phải tham số hóa đầu vào trước khi chèn/cập nhật/chọn/etc.

Ví dụ: nếu tôi nhập tên của tôi là "Mike DROP TABLE MASTER);" hoặc bất cứ tên bảng lớn nào trong DB của bạn, nó có thể rất tệ cho bạn. An toàn hơn là xin lỗi, đúng không?

EDIT: OP đã nhận xét ở đây và đặt câu hỏi. Cập nhật với một ví dụ mã.

public int myNum; 
SqlParameter spNum=new SqlParameter("@myNum", SqlDbType.Int); 
//you can also check for null here (but not really relevant in this case) 
command.Parameters.Add(spNum); 
string sql="INSERT INTO Table(myNum)"; 
sql+=" VALUES(@myNum)"; 
command.CommandText = sql; 
int resultsCt = command.ExecuteNonQuery(); 

Xem cách mã đang buộc đầu vào là số nguyên TRƯỚC KHI làm việc với cơ sở dữ liệu? Bằng cách đó, nếu bất cứ ai cố gắng bất kỳ shenanigans nó bị từ chối trước khi nó có thể làm hại cho DB.

+0

Tôi nghĩ rằng anh ấy hỏi từ góc nhìn hiệu suất hơn là một nguy cơ SQL Injection. – JNK

+0

Ah. Nếu đó là trường hợp sau đó tôi sẽ loại bỏ. Cảm ơn bạn đã làm rõ. – rownage

+0

Tính đến OP, trung thực. Chỉ là những gì tôi nhận được từ câu hỏi. – JNK

1

Trên cơ sở dữ liệu khổng lồ và truy vấn phức tạp với nhiều lần tham gia cơ sở dữ liệu có thể sử dụng thời gian xây dựng kế hoạch thực thi. Khi sử dụng các truy vấn tham số, kế hoạch thực hiện nằm trong bộ đệm cơ sở dữ liệu trong một thời gian khi gọi truy vấn nhiều lần với các tham số khác nhau

Các vấn đề liên quan