0

次のテーブル値関数があります。

[Microsoft.SqlServer.Server.SqlFunction(SystemDataAccess = SystemDataAccessKind.Read,
                          FillRowMethodName ="XXX",  TableDefinition = "time DateTime2"]  

public static IEnumerable ValueAtTime(string somestring, DateTime inputTime)
{
...
}

テーブル定義でわかるようDateTime2に、列のデータ型として定義できます。入力パラメータ「InputTime」についても同じことをしたいのですが、このパラメータは.NET型なのでできません。DateTime2入力パラメーターとして SQL 定義を取得する方法はありますか?

4

2 に答える 2

0

なぜだめですか?以下は、作業コードからの抜粋です。SQL Server 2008 で問題なく動作します。

[SqlFunction(
    FillRowMethodName = "FillRow",
    DataAccess = DataAccessKind.None,
    IsDeterministic = true,
    IsPrecise = true)]
public static IEnumerable ParsePacket(
    byte[] packet)
{ ... }

public static void FillRow(
    object rowdata,
    out DateTime? time,
    out short peer,
    out int addr,
    out byte quality,
    out bool? state,
    out float? value)
{ ... }

CREATE FUNCTION [split_packet] (@data [varbinary](300))
RETURNS  TABLE (
    [time] [datetimems] NULL,
    [peer] [smallint] NULL,
    [n] [int] NULL,
    [quality] [tinyint] NULL,
    [state] [bit] NULL,
    [value] [real] NULL
)
AS 
EXTERNAL NAME [Iec104Parser].[UDF].[ParsePacket]

2005年にはあまり良くありません... :-(

これは出力ですが、なぜ入力に問題があるのか​​ わかりません(マイクロソフトはそれを区別していないようです)。

于 2012-08-28T03:49:36.303 に答える
0

実際、.NETDateTime、値をやり取りするために使用する正しい型DATETIME2です。また、これは .NET 型であり、SqlTypes(すべてプロパティを持つ) 型の 1 つではないため、 s.IsNullを許可する必要がある場合は、.NULLDateTime?

明確にするために、SQL Server のデータ型は .NET でDATETIME同等の型を持っていると仮定しているように聞こえるので、特に範囲と精度が大きい場合は、SQL Server のデータ型も同様に .NET と同等である必要があります。2 つの環境の名前と環境間の類似性によって混乱しないでください。SQL Serverは .NET よりも範囲と精度が低くなりますが、範囲と精度は同じです。DateTimeDATETIME2DATETIME2DATETIMEDateTimeDATETIMEDateTimeDATETIME2

Type         Environment    Min Date      Max Date      Precision
----         -----------    ----------    ----------    ---------
DATETIME     SQL Server     1753-01-01    9999-12-31    .000, .003, and .007 seconds
DATETIME2    SQL Server     0001-01-01    9999-12-31    .0000001 seconds
DateTime     .NET           0001-01-01    9999-12-31    .0000001 seconds

詳細については、次を参照してください。


また:

  • ただし、出力フィールドに「time」という名前を付けることはお勧めしません。これは、少し誤解を招くだけでなく、SQL Server の予約語であるためです ( TIMESQL Server にもデータ型があるため)。
  • 他の入力パラメーターのSqlString代わりに使用する必要があります。string
于 2015-07-10T00:11:59.660 に答える