2013-05-06 3 views
7

Ich frage mich, ob es eine Möglichkeit gibt, meinen CLR-Skalarfunktionen in Sql Server Spaltennamen hinzuzufügen. Ich meine, dass nachdem ich meine Abfrage ausgeführt habe, würde ich gerne eine Spalte mit einem Ergebnis dieser Funktion bereits mit etwas benutzerdefinierten anstelle von (No column name) benannt sehen.sql server CLR-Skalarfunktion mit Standardspaltenname

Ich weiß, dass Funktionen oft kombiniert werden, oder ich müsste sie aus anderen Gründen etwas anders benennen, aber immer noch - wenn Sie eine Abfrage mit 30 Spalten schreiben, müssen Sie nicht für 20 von ihnen einen Alias ​​eingeben wäre nett.

Also weiß jemand einen Hack, der dies ermöglichen würde?

Es wäre auch schön, diese Funktion über ein Add-In in SSMS zu haben (z. B. Erstellen von Dummy-Aliasen aus Funktionen und Spalten, die bei der Berechnung verwendet werden, wie "datediff_startdate_enddate"). Ich habe versucht, dafür eine fertige Lösung zu finden, aber ohne Erfolg. Irgendwelche Hinweise?

Bearbeiten: Einige Leute fragte mich nach Codebeispiel. Ich glaube nicht, das viel helfen würde, aber hier ist es:

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 

Und das ist mein Wunsch-to-be-möglich Aufruf dieser Funktion in T-SQL und erwartetes Ergebnis:

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 

Ergebnis hat bereits einen Spaltennamen, ohne die Notwendigkeit, alias in T-SQL hinzuzufügen: enter image description here

+2

Vielleicht würde ein bestimmtes Beispiel helfen, einige Antworten zu bekommen: Können Sie ein minimales Beispiel für Code zeigen? Die [Beispiele] (http://msdn.microsoft.com/en-us/library/ms131103.aspx) in MSDN schlagen vor, dass CLR-Funktionen Spaltennamen in ihren Resultsets bereitstellen (oder können). – Pondlife

+0

Sie können Spaltennamen für Tabellenfunktionen hinzufügen, aber das ist nicht was ich meine. Ich möchte den Spaltennamen für Skalarfunktionen angeben. Aber danke für deinen Kommentar. –

+0

OK, da Sie nie das Wort "Skalar" verwendet haben, das nicht offensichtlich war, obwohl, soweit ich weiß, skalare Funktionen niemals Spaltenaliase in SQL Server haben. Sie geben schließlich keine Spalten zurück. Aber ich habe Ihren Fragetitel und die Tags bearbeitet, um die Frage hoffentlich klarer zu machen und bessere Antworten zu erhalten. – Pondlife

Antwort

2

Ich gehe davon aus, irgendwo haben Sie einen Anruf etwas wie folgt aus:

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

versuchen diese

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

nicht sicher, was Sie von 20 oder 30 Funktionen bedeuten?

Sie sagen, dass in Sql-Server gibt es eine gespeicherte Prozedur oder Funktion, die 20 oder 30 verschiedene Skalarfunktionen aufrufen?

Oder vielleicht die gleiche Funktion wird 20 oder 30 mal aufgerufen?

Und kombinieren Sie die Ergebnisse in eine Mehrwegzeile oder -spalte?

Brauchen Sie bitte Codebeispiele.

+0

Vielen Dank für Ihre Antwort - Ich habe Code-Beispiele hinzugefügt, hoffe, dies wird klar thigs ein wenig. Mit "20 oder 30 Funktionen" meine ich, dass ich, wenn ich eine Abfrage schreiben muss, die clr-Funktionen verwendet (eine Funktion - eine Spalte), Zeit sparen möchte, indem ich nicht jede Spalte benennen muss, um sie einzufügen Temporäre Tabelle (wählen Sie * in #temp), da die Namen bereits vorhanden sind. –

3

Die Antwort ist, "Nein." Eine Skalarfunktion (CLR oder nicht) gibt nur einen Wert zurück.

"Benutzerdefinierte Skalarfunktionen geben einen einzelnen Datenwert des in der RETURNS-Klausel definierten Typs zurück." per MSDN

Wie Sie vorgeschlagen haben, ist die richtige Lösung ein Alias ​​hinzufügen, wo Sie die Funktion verwenden.

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

Und das ändert sich nicht, ob die Funktion eine eingebaut ist, oder eine benutzerdefinierte Funktion oder eine CLR-Funktion.

+0

Das sagen die Dokumentationen. Ich denke nur, dass die Verwendung von C# neue Möglichkeiten für einen Hack eröffnen kann;). Danke für die Antwort. –