2009-06-29 29 views
6

Xin lỗi vì chiều dài của điều này, tôi đang cố gắng để cung cấp cho rất nhiều thông tin để tránh các giải pháp phi có liên quan.SQL cập nhật từ lựa chọn công bố

Mục tiêu của tôi là nhúng ít nhất 1 câu lệnh UPDATE vào câu lệnh SELECT để tôi có thể cập nhật một số giá trị được tính ngay trước khi câu lệnh chọn chạy (nghĩ về nó giống như TRIGGER on SELECT). VIEW không có giải pháp ngay lập tức vì tôi bị hạn chế bởi hệ thống tôi đang sử dụng (xem bên dưới).

Tôi đang tùy chỉnh hệ thống ERP thương mại bên thứ ba yếu về các tính năng (hệ thống sẽ không có tên!) - bạn chưa từng nghe về nó, nhưng không phải nhà của nó cũng phát triển). Nó có một cơ sở truy vấn đóng hộp nơi tôi có thể sử dụng một text/GUI để xây dựng một truy vấn SELECT. Khi tôi lưu truy vấn, người dùng có thể nhấp vào truy vấn để thực hiện truy vấn và xem kết quả. ERP chạy trên đỉnh MS SQL Server 2000; nâng cấp phiên bản KHÔNG có trong thẻ ngay bây giờ. Tôi có thể viết bất kỳ bộ tính năng nào tôi cần bên ngoài ERP bằng bất kỳ ngôn ngữ nào tôi muốn, tôi đã làm điều này trong quá khứ, nếu các tính năng đảm bảo nó. Nhưng cộng đồng người dùng của tôi thấy dễ dàng hơn khi các tùy chỉnh của tôi có thể được thực hiện trong hệ thống ERP.

Truy vấn có thể tùy tiện phức tạp, nhưng các gói ERP xây dựng các SQL Select tuyên bố riêng của mình. Nội bộ để các hệ thống ERP biên soạn là một cái gì đó như thế này (đây chỉ là một phỏng đoán!):

"SELECT " + fieldList + " FROM " + tableListAndJoins + " WHERE " + whereCond 

Các builder GUI giúp người dùng mới làm quen xây dựng fieldList và vân vân nhưng bạn có thể bỏ qua nó và viết các điều khoản trong văn bản miễn khi SQL hợp lệ khi kết hợp như trên. Tôi không thể tìm thấy một câu thần chú để chạy một thủ tục được lưu trữ như là một tác dụng phụ của một câu lệnh SELECT, cho dù đó là trong mệnh đề select, where khoản, vv Tôi thực sự không quan tâm làm thế nào tôi jailbreak hệ thống - một cuộc tấn công SQL injection ổn định sẽ ổn, miễn là nó không có nghĩa là tôi phải sửa đổi bảo mật của máy chủ sql bên dưới. Tôi đã nhìn UDFs, nhưng bạn không thể đặt một lệnh UPDATE thành một UDF vô hướng, và nó không có ý nghĩa để cố gắng sửa đổi sự trở lại của một UDF bảng (hoặc hiện nó?). Nếu bạn có thể CẬP NHẬT từ trong một VIEW thì tôi muốn xem một ví dụ, nhưng tôi nhận ra tôi có thể sử dụng một VIEW để tính toán các cột và đó không phải là giải pháp tôi đang tìm kiếm. Tôi đọc một tuyên bố gợi ý trực tuyến về việc có thể sử dụng một số loại XP_ để thực hiện điều này, nhưng như XP_ hoặc làm thế nào để làm điều đó, tôi không biết.

câu hỏi này không phải là một giải pháp, trong và của chính nó: Updating a table within a select statement

+0

Nghiên cứu bổ sung FYI cho thấy chức năng CLR có thể đưa tôi đến đó nhưng chức năng CLR không có sẵn trong SQL 2000. – user130582

Trả lời

1

Tôi không thể nghĩ ra cách nào để kết hợp một lệnh SELECT với UPDATE trong SQL 2000 (mặc dù vào năm 2005 trở lên, mệnh đề OUTPUT có sẵn). Tuy nhiên, có vẻ như bạn nhận được ba giá trị chuỗi (fieldList, tableListAndJoins, whereCond) được ghép nối với "SELECT", "FROM" và "WHERE" và giả sử chúng không thực hiện một số phát hiện mã nghiêm trọng như mã lệnh SQL, bạn có thể có thể kludge cùng một cái gì đó như thế này:

fileList = "NULL where 1 = 0; UPDATE MyTable set MyColumn = 'Whatever' where SomeColumn = 'Criteria'; SELECT MyColumn" 

tableListAndJoins = "MyTable" 

whereCond = "SomeColumn = 'Criteria'" 

[các dấu chấm phẩy là thực sự không bắt buộc, và có thể thậm chí không làm việc trong SQL 2000 - họ chỉ cần làm cho nó rõ ràng nơi một lệnh kết thúc và bắt đầu tiếp theo.]

Nhược điểm của việc này là bạn sẽ lấy lại hai tập dữ liệu. Đầu tiên sẽ là một tập hợp một cột trống (bí danh là NULL nếu bạn muốn một tên cho cột), và dữ liệu bạn muốn sẽ nằm trong tập thứ hai. Các công việc khác xung quanh có thể là có thể, tùy thuộc vào cách ba giá trị này được sử dụng và các lỗi bị bắt như thế nào. (Hãy để truy vấn đầu tiên tạo ra và lỗi, và hy vọng cập nhật và truy vấn thứ hai đi qua?)

+0

cảm ơn đọc những gì tôi đã viết đầy đủ – user130582

0

Hãy thử sử dụng sql năng động trong thủ tục lưu trữ như stated on the last reply here

liên kết để các tác giả ban đầu có thể nhận được các khoản tín dụng anh/cô ấy xứng đáng, và hy vọng sẽ hữu ích cho bạn.

Và kể từ khi bạn muốn CHỌN trước khi cập nhật, bạn có thể thay đổi sql năng động như trong liên kết tôi được đăng, để làm SELECT đầu tiên.

0

Tôi không chắc là tôi hiểu những hạn chế của tình hình của bạn, nhưng có thể bạn không chỉ cần chạy hai câu lệnh cùng một lúc, chẳng hạn như:

string sql = "update MyTable set x=y;select x from MyTable;"; 
0

một chức năng lưu trữ sẽ là một lựa chọn? Bạn có thể gọi những người đó liền mạch hơn (ít nhất trong MySQL) so với các thủ tục được lưu trữ - thay vì "gọi PROCEDURE_NAME (x)", bạn chỉ có thể sử dụng "CHỌN FUNCTION_NAME (x)".

0

tôi đoán với XP là bạn sẽ viết XP của riêng bạn để làm các bản cập nhật và bao gồm nó trong các truy vấn bằng cách nào đó. Có hay không mà sẽ làm việc và nơi trong truy vấn nó nên đi như vậy là để được chạy trước khi SQL nhìn vào dữ liệu của bạn là hoàn toàn vượt ra ngoài tôi.

Có vẻ như bạn đã thử mọi thứ tôi sẽ thử. Tôi cảm thấy cho bạn bởi vì nó có lẽ là khá dễ dàng để cập nhật trạng thái sau khi bạn chạy lựa chọn.

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