2009-05-08 34 views
7

Tôi đang cố gắng tìm ra phương pháp tốt nhất để truyền một số lượng lớn tham số vào một thủ tục được lưu trữ là gì.Phương pháp tốt nhất trong việc truyền một số lượng lớn tham số trong SQL Server

Một số phương pháp tôi đang nghĩ đến;

  1. Tạo các đối tượng cơ sở dữ liệu có liên quan, trong đó có một đối tượng tham số cho từng hạng mục và gọi các đối tượng lệnh

  2. đèo trong một tài liệu XML và có thủ tục lưu trữ giải nén nó. (Ứng dụng sẽ đã chúng ở định dạng XML)

Nếu ai có bất kỳ ý tưởng tốt hơn, tôi mở cửa cho nghe họ

Cảm ơn.

Trả lời

3

Xử lý XML rất tiện lợi để xử lý số lớn số tham số. Bạn có thể dễ dàng chuyển các tham số của bạn vào XML và sau đó xử lý xml để lấy các giá trị của bạn. Nó thậm chí còn tốt hơn nếu dữ liệu của bạn đã được .Net.

ví dụ:

DECLARE @WidgetsIds xml 
SET @WidgetsIds ='<Widgets><id>3</id><id>6</id><id>15</id></Widgets >' 

SELECT 
ParamValues.ID.value('.','VARCHAR(20)') 
FROM @Widgets.nodes('/widgets/id') as ParamValues(ID) 

Điều này sẽ trả lại 3 hàng: 3, 6, 15. Dễ dàng mở này để kéo các giá trị bạn cần và thao tác chúng.

+0

Cảm ơn vì điều đó, một số câu hỏi tôi sẽ có; làm thế nào để bạn kéo ra một số lĩnh vực ví dụ ProductID, ProductName, SKWNumber và xử lý các loại khác nhau. – GrumpyMonkey

+0

không thực sự đủ dung lượng để ví dụ này có thể tốt hơn http://www.raihaniqbal.org/blog/perform-batch-insertsupdates-in-sql-server-2005-using-xml/ – u07ch

+0

liên kết dường như đã di chuyển - http : //www.raihaniqbal.net/blog/2009/04/perform-batch-insertsupdates-in-sql-server-2005-using-xml/ –

2

Có bao nhiêu thông số mà bạn cho là "một số lượng lớn"? Ngoài ra, tại sao các thủ tục lưu trữ có rất nhiều tham số? Âm thanh như nó sẽ rất thú vị để kiểm tra.

Mã sẽ gọi thủ tục được lưu trữ sẽ đưa ra dữ liệu cần thiết để truyền vào các tham số như thế nào? Nếu dữ liệu đã có sẵn trong XML, thì XML có thể là một cách tốt để truyền chúng. Nếu dữ liệu đã có sẵn trong các biến riêng biệt, thì các đối tượng Tham số có thể tốt hơn.

Cũng lưu ý rằng với SQL Server 2008, bạn có tùy chọn gửi một DataTable làm giá trị của tham số của loại TABLE.


EDIT: Cách dễ dàng để Thiết lập thông số

Mặc dù tôi tin rằng DataSets được dùng quá nhiều và lạm dụng, sau đây là một thủ tục mà sẽ thiết lập đối tượng tham số thủ tục lưu trữ và làm cho nó nhiều dễ dàng hơn để gọi các thủ tục được lưu trữ với nhiều tham số:

  1. Tạo một Số liệu mới bằng cách sử dụng "Thêm mục mới" và chọn Tập dữ liệu. Đặt tên cho DataSet bất cứ điều gì bạn thích.
  2. Xem Server Explorer nếu bạn đã chưa xem nó
  3. Thêm một kết nối đến cơ sở dữ liệu của bạn nếu nó không phải là đã có
  4. Mở rộng kết nối cho đến khi bạn tìm thấy thủ tục lưu trữ của bạn
  5. Kéo Stored Procedure vào việc thiết kế bề mặt

Điều này sẽ tạo ra một TableAdapter với một phương thức để gọi thủ tục lưu trữ của bạn.Phương thức này phụ thuộc vào các đối tượng SqlParameter mà cơ sở hạ tầng đã tạo ra. Phương thức sẽ lấy các tham số SP được truyền vào như các tham số của lời gọi phương thức, và sẽ sử dụng các tham số cuộc gọi để điền vào các tham số SP. Đây là tất cả được thực hiện cho bạn, và được thực hiện một cách hợp lý hiệu quả.

+0

Ví dụ về số lượng lớn là 20 đến 30. Phần lớn thủ tục lưu trữ là thực hiện một số xác nhận/chuyển đổi trước khi chèn/cập nhật dữ liệu. Một điểm khác tôi đã không đề cập đến là đây là cho SQL Server bây giờ nhưng có thể được chuyển đến Oracle 11g, nhưng đây là một lo lắng trong tương lai mà tôi sẽ xem xét nếu nó bao giờ xảy ra. – GrumpyMonkey

+0

Tôi không biết, có lẽ chỉ là tôi, nhưng tôi không nghĩ rằng 20-30 là quá lớn mà bạn nên tìm kiếm các phương pháp phi tiêu chuẩn đi qua chúng. Trừ khi số lượng tham số là biến hoặc cái gì đó. –

+0

Câu trả lời đơn giản là mã kế thừa, đó là một ứng dụng hiện có đang được sửa đổi. Chúng tôi đang thay đổi lớp truy cập dữ liệu nhưng do thời gian chặt chẽ, nó không thể được tái cấu trúc đúng cách trong một thời gian. – GrumpyMonkey

2

Nếu bạn có thể nâng cấp lên SQL Server 2008, có một tính năng mới được gọi là Tham số Bảng giá trị chính xác cho mục đích này. Xem phần Books Online về nó.

Về cơ bản, nó cho phép bạn tạo loại do người dùng định nghĩa do người dùng định nghĩa, sau đó có thể được sử dụng làm thông số đầu vào chỉ đọc vào bất kỳ thủ tục được lưu trữ nào.

Từ .NET, bạn có thể sử dụng đơn giản ví dụ DataTable và chuyển số lượng tùy ý các hàng bên trong bảng dữ liệu đó.

Marc

+0

Đáng buồn thay, chúng ta phải làm điều này trên SQL Server 2005. – GrumpyMonkey

+0

Vâng, sau đó bạn chắc chắn nên nhìn vào "lừa" XML của u07ch - đó có lẽ là đặt cược tốt nhất của bạn trong năm 2005. –

2

Được rồi, điều này có thể sẽ bị bỏ qua, nhưng ... Chỉ cần không chuyển quá nhiều tham số. Thay vì cố gắng tìm cách để làm điều gì đó vốn dĩ khó khăn trong ngôn ngữ, có thể nhận ra rằng đó là cách nói của ngôn ngữ bạn rằng bạn cần phải thiết kế lại những gì bạn đang làm. Cũng giống như nhiều loài côn trùng sử dụng màu sắc để chỉ ra "không ăn", khi bạn thấy mình làm một cái gì đó cơ bản đòi hỏi nhiều hoops để thực thi, có thể bạn cần phải suy nghĩ lại những gì bạn đang làm.

Đặc biệt, tôi nghĩ có thể bạn nên cố gắng tìm ra lý do tại sao quy trình được lưu trữ cần nhiều tham số; bạn có thể phân tách điều này thành một tập hợp các quy trình được lưu trữ nhỏ hơn, đơn giản hơn không? Có lẽ nếu bạn có họ giao tiếp thông qua các bảng tạm thời, bạn có thể nhận được hiệu ứng tương tự, nhưng với ít hơn ... ick.

0

Số tháng 2 năm 2009 của tạp chí SQL Server có bài viết tuyệt vời để sử dụng mảng (Tùy chọn khác để xử lý mảng dưới dạng đầu vào). Bài viết mô tả bằng cách sử dụng một UDF phân tách CLR. Điều này làm việc với SQL 2005 vì nó có tích hợp CLR. Mã quá nhiều để tôi đăng bài ở đây và giải thích, nhưng nếu bạn có quyền truy cập vào trang web của tạp chí, tôi khuyên bạn nên tải xuống chức năng của họ để thực hiện việc này. Của nó nhanh chóng và thanh lịch.

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