2013-05-06 25 views
7

Zastanawiam się, czy istnieje sposób na dodanie nazw kolumn do moich funkcji skalarnych CLR w Sql Server. Mam na myśli to, że po uruchomieniu zapytania, chciałbym zobaczyć kolumnę z wynikiem tej funkcji o nazwie z czymś niestandardowym, zamiast z (No column name).funkcja skalarna CLR serwera SQL z domyślną nazwą kolumny

Wiem, że często funkcje są ze sobą łączone, inaczej musiałbym je nazwać inaczej z innych powodów, ale nadal - gdy piszesz zapytanie z 30 kolumnami, nie musisz uderzać w alias dla 20 z nich byłoby miło.

Czy ktoś zna hack, który by to umożliwił?

Byłoby także słodkie mieć tę funkcję przez dodanie jakiegoś dodatku w SSMS (np. Budowanie fałszywych aliasów z funkcji i kolumn używanych w obliczeniach, takich jak "datediff_startdate_enddate"). Próbowałem znaleźć na to rozwiązanie, ale bezskutecznie. Jakieś wskazówki?

Edytuj: Niektórzy ludzie pytali mnie o przykład kodu. Nie sądzę, że to pomoże dużo, ale tutaj jest:

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 

I to jest moje życzenie-to-be-możliwe wywołanie tej funkcji w T-SQL i oczekiwany wynik:

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 

wynik ma już nazwę kolumny, bez konieczności dodawania aliasu w T-SQL: enter image description here

+2

Być może konkretny przykład może pomóc w uzyskaniu odpowiedzi: czy możesz pokazać minimalny przykład kodu? [Przykłady] (http://msdn.microsoft.com/en-us/library/ms131103.aspx) w MSDN sugerują, że funkcje CLR mogą (lub mogą) podawać nazwy kolumn w zestawach wyników. – Pondlife

+0

Można dodawać nazwy kolumn dla funkcji o wartościach tabelarycznych, ale nie o to mi chodzi. Chcę podać nazwę kolumny dla funkcji skalarnych. Ale dziękuję za komentarz. –

+0

OK, ponieważ nigdy nie używałeś słowa "skalar", które nie było oczywiste, chociaż o ile wiem, funkcje skalarne nigdy nie mają aliasów kolumn w SQL Server. W końcu nie zwracają kolumn. Ale zredagowałem twój tytuł pytania i tagi, aby mieć nadzieję, że pytanie będzie jaśniejsze i uzyskać lepsze odpowiedzi. – Pondlife

Odpowiedz

2

Zakładam gdzieś masz wezwanie do mniej więcej tak:

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

spróbować

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

Nie wiem, co masz na myśli przez 20 lub 30 funkcji?

Mówisz, że w Sql-Server istnieje procedura składowana lub funkcja wywołująca 20 lub 30 różnych funkcji skalarnych?

A może tę samą funkcję nazywa się 20 lub 30 razy?

Czy łączysz wyniki w zwrotny wiersz lub kolumnę danych?

Potrzebuję przykładów kodu.

+0

Dziękuję za odpowiedź - dodałem próbki kodu, mam nadzieję, że to oczyść trochę drążki. Przez "20 lub 30 funkcji" mam na myśli to, że jeśli muszę napisać zapytanie, które używa funkcji klr (jedna funkcja - jedna kolumna), to chciałbym zaoszczędzić czas, nie musząc wymieniać każdej kolumny, aby je wprowadzić tabela tymczasowa (wybierz * do #temp), ponieważ nazwy już tam będą. –

3

Odpowiedź brzmi: "Nie" Funkcja skalarna (CLR lub nie) po prostu zwraca wartość.

"Zdefiniowane przez użytkownika funkcje skalarne zwracają pojedynczą wartość danych typu zdefiniowanego w klauzuli RETURNS." na MSDN

Zgodnie z sugestią, właściwym rozwiązaniem jest dodanie aliasu, w którym używa się tej funkcji.

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

I to nie zmienia się, czy funkcja jest wbudowana, czy funkcja zdefiniowana przez użytkownika, czy funkcja CLR.

+0

Tak mówią dokumenty. Po prostu myślę, że używanie C# może otworzyć nowe możliwości hackowania;). Dziękuję za odpowiedź. –