2013-05-06 2 views
7

Мне было интересно, есть ли способ добавить имена столбцов в мои скалярные функции CLR на Sql Server. Я имею в виду, что после выполнения моего запроса я хотел бы увидеть столбец с результатом этой функции, уже названной с чем-то обычным, а не (No column name).sql server CLR скалярная функция с именем столбца по умолчанию

Я знаю, что часто функции объединены вместе, или я бы назвал их чем-то другим по другой причине, но все же - когда вы пишете запрос с 30 столбцами, не имея возможности пробивать псевдоним для 20 из них было бы здорово.

Значит, кто-нибудь знает хак, который позволит это?

Также было бы хорошо иметь эту функцию через некоторую добавку в SSMS (например, строить псевдонимы фиктивных элементов из функций и столбцов, используемых в расчете, например, «датированный_стартдайт_ендат»). Я попытался найти готовое решение для этого, но без эффекта. Любые намеки?

Редактировать: Некоторые люди спрашивали меня о примере кода. Я не думаю, что это помогло бы много, но здесь это:

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 

И это мое желание, чтобы быть-возможно вызов этой функции в T-SQL и ожидаемый результат:

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 

результат уже есть имя столбца, без необходимости добавления псевдонима в T-SQL: enter image description here

+2

Возможно, конкретный пример поможет получить некоторые ответы: можете ли вы показать минимальный пример кода? [Примеры] (http://msdn.microsoft.com/en-us/library/ms131103.aspx) в MSDN предполагают, что функции CLR (или могут) предоставлять имена столбцов в своих наборах результатов. – Pondlife

+0

Вы можете добавить имена столбцов для табличных функций, но это не то, что я имею в виду. Я хочу предоставить имя столбца для скалярных функций. Но спасибо за ваш комментарий. –

+0

ОК, так как вы никогда не использовали слово «скаляр», что не было очевидно, хотя, насколько я знаю, скалярные функции никогда не имеют псевдонимов столбцов в SQL Server. В конце концов, они не возвращают столбцы. Но я редактировал заголовок и теги вопросов, чтобы надеяться сделать вопрос более ясным и получить несколько лучших ответов. – Pondlife

ответ

2

Я предполагаю, что где-то есть призыв к чему-то вроде этого:

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

попробовать это

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

Не уверен, что вы имеете в виду 20 или 30 функций?

Вы говорите, что в Sql-сервере есть некоторая хранимая процедура или функция, вызывающая 20 или 30 различных скалярных функций?

Возможно, эта функция называется 20 или 30 раз?

И вы комбинируете результаты в возвращаемую строку или столбец данных?

Нужны примеры кода, пожалуйста.

+0

Спасибо за ваш ответ - я добавил образцы кода, надеюсь, что это будет немного очистить. Под «20 или 30 функциями» я подразумеваю, что если мне нужно написать запрос, который использует функции clr (одна функция - один столбец), то я хотел бы сэкономить время, не указывая каждый столбец, чтобы поместить их в временную таблицу (выберите * в #temp), потому что имена уже будут там. –

3

Ответ: «Нет». Скалярная функция (CLR или нет) просто возвращает значение.

«Пользовательские скалярные функции возвращают одно значение данных типа, определенного в предложении RETURNS». за MSDN

Как вы сказали, правильным решением является добавление псевдонима, в котором вы используете эту функцию.

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

И это не меняет функцию, является ли встроенный, или определенная пользователем функция, или функция CLR.

+0

Вот что говорится в документах. Я просто думаю, что использование C# может открыть новые возможности для взлома;). Спасибо за ответ. –