DateTime2作为表值函数中的输入参数数据类型

时间:2012-08-07 20:34:01

标签: sql-server sqlclr

我有以下表值函数:

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

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

正如您在表定义中所看到的,我可以将DateTime2定义为列数据类型。我也想对输入参数“InputTime”做同样的事情,但由于这个参数是.NET类型,我无法做到。是否有办法将SQL定义中的DateTime2作为输入参数?

2 个答案:

答案 0 :(得分: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年不太好......: - (

虽然这是输出,但我不明白为什么输入可能存在问题(microsoft似乎无法区分输入。)

答案 1 :(得分:0)

实际上,.NET DateTime类型用来传递DATETIME2值的正确值。并且,由于它是.NET类型而不是SqlTypes类型之一(都具有.IsNull属性),如果您需要允许NULL s,则使用{{ 1}}。

为了帮助澄清,听起来假设SQL Server的DateTime?数据类型在.NET中具有等效的DATETIME类型,因此SQL Server的{{1}数据类型同样应该具有.NET等价物,特别是如果DateTime具有更大的范围和精度。不要被两个环境之间DATETIME2DATETIME2名称的相似性所迷惑。 SQL Server DATETIME的范围和精确度低于.NET DateTime,而DATETIME具有相同的范围和精度:

DateTime

欲了解更多信息,请参阅:

此外:

  • 我建议不要命名输出字段" time"但是,因为它是一个SQL Server保留字,除了有点误导之外(因为还有一个DATETIME2数据类型SQL Server)。
  • 您应该使用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作为其他输入参数。