2013-05-06 34 views
7

Tôi đã tự hỏi, nếu có cách nào để thêm một tên cột vào các hàm vô hướng CLR của tôi trong Sql Server. Tôi có nghĩa là sau khi tôi chạy truy vấn của mình, tôi muốn xem một cột có kết quả của hàm này đã được đặt tên với một cái gì đó tùy chỉnh thay vì (No column name).sql server CLR chức năng vô hướng CLAR với tên cột mặc định

Tôi biết rằng các chức năng thường được kết hợp với nhau, hoặc tôi phải đặt tên cho chúng một cái gì đó khác vì lý do khác, nhưng vẫn - khi bạn viết truy vấn với 30 cột, không phải bấm vào bí danh cho 20 cột sẽ tốt.

Vì vậy, có ai biết một hack có thể kích hoạt tính năng này không? Cũng cần có tính năng này thông qua một số addin trong SSMS (ví dụ: xây dựng bí danh giả từ các hàm và cột được sử dụng để tính toán, chẳng hạn như "dateiff_startdate_enddate"). Tôi đã cố gắng tìm một giải pháp sẵn sàng cho điều này, nhưng không có hiệu lực. Bất kỳ gợi ý nào?

Chỉnh sửa: Một số người đã hỏi tôi về ví dụ về mã. Tôi không nghĩ rằng điều này sẽ giúp nhiều, nhưng ở đây nó là:

C#:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.Data.SqlTypes; 
using System.Text.RegularExpressions; 

namespace ClrFunctions 
{ 
    public class RegexFunctions 
    { 

     public static SqlBoolean clrIsMatch(SqlString strInput, SqlString strPattern) 
     { 
      if (strPattern.IsNull || strInput.IsNull) 
      { 
       return SqlBoolean.False; 
      } 
      return (SqlBoolean)Regex.IsMatch(strInput.Value, strPattern.Value, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); 
     } 
    } 
} 

T-SQL:

Create Assembly ClrFunctions From 'C:\CLR\ClrFunctions.dll' 
GO 

Create Function dbo.clrIsMatch(
    @strInput As nvarchar(4000), 
    @strPattern As nvarchar(255) 
) 
Returns Bit 
As External Name [ClrFunctions].[ClrFunctions.RegexFunctions].[clrIsMatch] 
GO 

Và đây là tôi mong muốn-to-be-thể tiếng gọi của chức năng này trong T-SQL và dự kiến ​​kết quả:

select 
    txt, dbo.clrIsMatch(txt,'[0-9]+') 
from (
    select 'some 123 text' as txt union all 
    select 'no numbers here' union all 
    select 'numbers 456 again' 
) x 

kết quả đã có một tên cột, mà không cần phải thêm bí danh trong T-SQL: enter image description here

+2

Có lẽ một ví dụ cụ thể sẽ giúp bạn nhận được một số câu trả lời: bạn có thể hiển thị ví dụ về mã tối thiểu không? [Ví dụ] (http://msdn.microsoft.com/en-us/library/ms131103.aspx) trong MSDN gợi ý rằng các hàm CLR làm (hoặc có thể) cung cấp các tên cột trong các tập kết quả của chúng. – Pondlife

+0

Bạn có thể thêm tên cột cho các hàm có giá trị bảng, nhưng đó không phải là ý của tôi. Tôi muốn cung cấp tên cột cho các hàm vô hướng. Nhưng cảm ơn bạn đã bình luận của bạn. –

+0

OK, vì bạn không bao giờ sử dụng từ "vô hướng" không rõ ràng, mặc dù theo tôi biết các hàm vô hướng không bao giờ có các bí danh cột trong SQL Server. Họ không trả lại cột, sau khi tất cả. Nhưng tôi đã chỉnh sửa tiêu đề câu hỏi và thẻ của bạn để hy vọng làm cho câu hỏi rõ ràng hơn và nhận được một số phản hồi tốt hơn. – Pondlife

Trả lời

2

tôi giả ở đâu đó bạn có một cuộc gọi đến một cái gì đó như thế này:

command.CommandText = "SELECT SomeFunction();"; 

thử này

command.CommandText = "SELECT SomeFunction() 'AliasForColumnNameYouWant';"; 

Không chắc chắn những gì bạn có nghĩa là 20 hoặc 30 chức năng?

Bạn có nói rằng trong Sql-Server có một số thủ tục hoặc hàm được lưu trữ gọi 20 hoặc 30 hàm vô hướng khác nhau không?

Hoặc có thể chức năng tương tự được gọi là 20 hoặc 30 lần?

Và bạn có đang kết hợp các kết quả vào hàng hoặc cột dữ liệu có thể trả về không?

Vui lòng ví dụ về mã.

+0

Cảm ơn bạn đã trả lời - Tôi đã thêm mẫu mã, hy vọng điều này sẽ rõ ràng thigs lên một chút. Bởi "20 hoặc 30 chức năng" tôi có nghĩa là nếu tôi cần phải viết một truy vấn có sử dụng chức năng clr (một chức năng - một cột), sau đó tôi muốn tiết kiệm thời gian bằng cách không phải đặt tên mỗi cột để đưa chúng vào bảng tạm thời (chọn * thành #temp), bởi vì các tên sẽ ở đó. –

3

Câu trả lời là "Không." Hàm vô hướng (CLR hoặc không) chỉ trả về một giá trị.

"Các hàm vô hướng do người dùng xác định trả lại một giá trị dữ liệu duy nhất của loại được xác định trong mệnh đề RETURNS". mỗi MSDN

Như bạn đã đề xuất, giải pháp đúng là thêm bí danh nơi bạn sử dụng hàm.

SELECT ABS(a.Position - b.Position) AS Distance 
    FROM sch.Tbl a 
     INNER JOIN sch.Tbl b 
      ON a.Key <= b.Key 
; 

Và đó không thay đổi cho dù chức năng là một, hoặc một chức năng người dùng định nghĩa được xây dựng-in, hoặc một chức năng CLR.

+0

Đó là những gì các tài liệu nói. Tôi chỉ nghĩ rằng việc sử dụng C# có thể mở ra các khả năng mới cho một hack;). Cảm ơn câu trả lời. –

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