Có cách nào để tạo một hàm CLR do người dùng định nghĩa cho SQL Server trả về nhiều giá trị mà không sử dụng cú pháp hàm giá trị bảng? Ví dụ: giả sử tôi muốn thực hiện chuyển đổi tọa độ, chẳng hạn như:SQL Server CLR UDF với tham số ngoài - Có thể thực hiện được không?
[SqlFunction()]
public void ConvertCoordinates(SqlDouble x, SqlDouble y, SqlDouble z, out SqlDouble r, out SqlDouble t, out SqlDouble p)
{
r = new SqlDouble(Math.Sqrt((x.Value*x.Value)+(y.Value*y.Value)+(z.Value*z.Value)));
t = new SqlDouble(Math.Acos(r.Value/z.Value));
p = new SqlDouble(Math.Atan(y.Value/x.Value));
}
Điều này thậm chí còn có thể? Hàm bảng có giá trị trong trường hợp này có vẻ không phù hợp vì tính toán sẽ không bao giờ sinh ra nhiều hơn một hàng đầu ra. Sử dụng cú pháp hàm có giá trị vô hướng, tôi sẽ phải viết ba hàm khác nhau để thực hiện tính toán và gọi riêng từng hàm. Với trường hợp sử dụng thực tế của tôi, điều này là không thực tế.
Tôi nhận thấy rằng logic trên có thể được thực hiện bằng T-SQL thuần túy; trường hợp sử dụng thực tế của tôi phức tạp hơn nhưng vẫn chỉ dẫn đến một hàng có nhiều giá trị đầu ra phụ thuộc lẫn nhau.
Vì vậy, điểm mấu chốt, có khả thi không? Tôi không nghĩ đó là, nhưng người ta có thể hy vọng. Nếu tình cờ nó khả thi, thì T-SQL sẽ trông như thế nào khi gọi một hàm như vậy?
UDF (cho dù Scalar, hoặc Tabular, T-SQL hoặc CLR) không thể có tham số. Nếu có thể, bạn phải tạo ra cú pháp mới để cho phép một cú pháp được gọi trong mệnh đề 'SELECT', nếu bạn muốn tiêu thụ các đầu ra này. Và tôi không thấy lý do tại sao một hàm có giá trị trả về một hàng nên có vẻ lạ đối với bạn. –
@Damien Đây chỉ đơn giản là câu hỏi liệu có thể thực hiện được hay không.Đọc và thử nghiệm của riêng tôi đã chỉ ra rằng có lẽ không phải (như tôi cũng đã nói), nhưng vì tôi mới tham gia tích hợp CLR mà tôi muốn hỏi. TVFs không có vẻ "lạ với tôi" khi có nhiều hơn 1 hàng là một khả năng. Ví dụ ALWAYS trả về một hàng duy nhất, nhưng các giá trị trả lại tương quan chỉ có ý nghĩa như một tập hợp. Trong trường hợp sử dụng thực tế của tôi, tôi đang thực hiện một tính toán tương tự, nhưng lớn hơn cho hàng triệu hàng, vì vậy TVF dường như không hiệu quả nếu các tham số ngoài là một khả năng. Một 'không' đơn giản sẽ là đủ. – bporter
@bporter - rõ ràng là TVF sẽ là lựa chọn tốt nhất - bạn tự nói, "không có vẻ lạ khi có hơn 1 hàng là một khả năng" và sau đó nói rằng bạn có hàng triệu hàng. Ergo a (S) TVF là câu trả lời! Nó sẽ trở nên hiệu quả hơn việc lặp lại trên mỗi hàng như một tuyên bố foreach bắt buộc. – gbjbaanb