8

Sql Server の CLR スカラー関数に列名を追加する方法があるかどうか疑問に思っていました。つまり、クエリを実行した後、この関数の結果を含む列を表示したいということです(No column name)

多くの場合、関数は一緒に組み合わされたり、他の理由で別の名前を付けたりする必要があることは知っていますが、それでも、30 列のクエリを作成するときに、20 列のエイリアスを入力する必要がないのはいいことです。

それで、これを可能にするハックを知っている人はいますか?

また、SSMS のアドインを使用してこの機能を使用することもできます (たとえば、「datediff_startdate_enddate」のように、計算で使用される関数と列からダミーのエイリアスを作成します)。これに対するすぐれた解決策を見つけようとしましたが、効果はありませんでした。ヒントはありますか?

編集: コード例について尋ねられた人もいました。あまり参考にならないと思いますが、以下です。

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 でエイリアスを追加する必要なく、既に列名があります。 ここに画像の説明を入力

4

3 に答える 3

4

答えはノーだ。" スカラー関数 (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 関数のいずれであっても、それは変わりません。

于 2013-05-15T22:50:57.023 に答える
2

どこかで次のような呼び出しがあると思います:

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

これを試して

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

20 個または 30 個の関数が何を意味するのかわかりませんか?

Sql-Server 内に、20 または 30 の異なるスカラー関数を呼び出すストアド プロシージャまたは関数があると言っていますか?

それとも、同じ関数が 20 回または 30 回呼び出されているのでしょうか。

結果を結合して、返されるデータの行または列にしますか?

コード例が必要です。

于 2013-05-15T19:55:36.870 に答える
-1

スカラー関数は式に相当するものと見なすことができ、SQL は式の結果として返される列の名前を要求しません。SQL で列名を含む式を返す場合は、次の 2 つの方法のいずれかで別名を付ける必要があります。

Select MyCol=Substring('123',2,1)

また

Select Substring('123',2,1) as MyCol

また、クエリの他の場所でエイリアスを再利用して別の式を作成する場合 (私は Alias=Expression を好みます)

Select MyExp2=MyExp+'2', MyExp3=MyExp+3, MyExp4
From 
  SomeTable
  CROSS APPLY (Select MyExp=Substring(SomeTable.SomeCol, 2, 1)) as MyExp
  -- below an example of reusing MyExp in another apply
  CROSS APPLY (Select MyExp4= MyExp + Substring(SomeTable.SomeCol, 4, 1)) as MyExp
于 2022-01-21T22:16:15.600 に答える