我有以下表值函数:
[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
作为输入参数?
答案 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
具有更大的范围和精度。不要被两个环境之间DATETIME2
和DATETIME2
名称的相似性所迷惑。 SQL Server DATETIME
的范围和精确度低于.NET DateTime
,而DATETIME
具有相同的范围和精度:
DateTime
欲了解更多信息,请参阅:
此外:
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
作为其他输入参数。