Tôi có một UDT CLR rằng sẽ có lợi rất nhiều từ phương pháp bảng giá trị, ala xml.nodes()
:Có thể tạo các phương thức * có giá trị * trong một kiểu SQL CLR do người dùng định nghĩa không?
-- nodes() example, for reference:
declare @xml xml = '<id>1</id><id>2</id><id>5</id><id>10</id>'
select c.value('.','int') as id from @xml.nodes('/id') t (c)
Tôi muốn một cái gì đó tương tự cho UDT của tôi:
-- would return tuples (1, 4), (1, 5), (1, 6)....(1, 20)
declare @udt dbo.FancyType = '1.4:20'
select * from @udt.AsTable() t (c)
Có ai có bất kỳ kinh nghiệm w/điều này? Mọi sự trợ giúp sẽ rất được trân trọng. Tôi đã thử một vài điều và tất cả đều thất bại. Tôi đã tìm tài liệu và ví dụ và không tìm thấy. Có, tôi biết tôi có thể tạo UDF bảng có giá trị mà lấy UDT của tôi như là một tham số, nhưng tôi đã hy vọng để bó tất cả mọi thứ bên trong một loại duy nhất, phong cách OO.
EDIT
Russell Hart tìm thấy the documentation states that table-valued methods are not supported, và cố định cú pháp của tôi để tạo ra lỗi runtime dự kiến (xem dưới đây).
Trong VS2010, sau khi tạo một UDT mới, tôi đã thêm này vào cuối của định nghĩa struct:
[SqlMethod(FillRowMethodName = "GetTable_FillRow", TableDefinition = "Id INT")]
public IEnumerable GetTable()
{
ArrayList resultCollection = new ArrayList();
resultCollection.Add(1);
resultCollection.Add(2);
resultCollection.Add(3);
return resultCollection;
}
public static void GetTable_FillRow(object tableResultObj, out SqlInt32 Id)
{
Id = (int)tableResultObj;
}
này được xây dựng và triển khai thành công. Nhưng sau đó trong SSMS, chúng tôi nhận được lỗi thời gian chạy như mong đợi (nếu không phải từng từ):
-- needed to alias the column in the SELECT clause, rather than after the table alias.
declare @this dbo.tvm_example = ''
select t.[Id] as [ID] from @this.GetTable() as [t]
Msg 2715, Level 16, State 3, Line 2
Column, parameter, or variable #1: Cannot find data type dbo.tvm_example.
Parameter or variable '@this' has an invalid data type.
Vì vậy, có vẻ như sau cùng thì không thể. Và thậm chí nếu có thể, nó có thể sẽ không được khôn ngoan, với những hạn chế về việc thay đổi các đối tượng CLR trong SQL Server.
Điều đó nói rằng, nếu có ai biết hack để vượt qua giới hạn cụ thể này, tôi sẽ tăng một khoản tiền thưởng mới cho phù hợp.
Cảm ơn Russ, vâng, điều đó có ích. –