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类型(它们都具有.IsNull属性),因此如果您需要允许NULLs,请使用DateTime?.

为了帮助澄清,听起来好像假设 SQL Server 的数据类型在 .NETDATETIME中具有等效DateTime类型,因此 SQL Server 的DATETIME2数据类型也应该具有 .NET 等效类型,尤其是在DATETIME2具有更大范围和精度的情况下。不要被这两个环境名称DATETIME和之间的相似性所迷惑。DateTimeSQL Server 的DATETIME范围和精度低于 .NET DateTimeDATETIME2但范围和精度相同:

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

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


还:

  • 不过,我建议不要将输出字段命名为“时间”,因为它是一个 SQL Server 保留字,而且有点误导(因为TIMESQL Server 中也有一个数据类型)。
  • 您应该使用SqlString而不是string其他输入参数。
于 2015-07-10T00:11:59.660 回答