具有NULL字段值的Sql Server ODBC TVP过程

问题描述:

摘要: 如何使用odbc全限制多行缓冲区技术在表值参数的行/列索引中指定可为空的字段值?具有NULL字段值的Sql Server ODBC TVP过程

详情: 我已经定义了一个表类型如下:

CREATE TYPE tp_Transition AS TABLE 
(
    [Timestamp] [datetimeoffset](7) NOT NULL, 
    [Value] [float] NULL, 
); 
GO 

所以时间戳不能为空,但值可以。

现在我创建使用此新定义的类型作为表值参数的新的存储过程:

CREATE PROCEDURE [dbo].[sp_InsertTransition] 
    @TransitionBatch AS [tp_Transition] READONLY 
AS 
BEGIN 
    SET NOCOUNT ON 
    INSERT INTO [dbo].[Transition] ([Timestamp], [Value]) 
     SELECT [Timestamp], [Value] FROM @TransitionBatch; 
END; 

为了测试这种新的程序,我写下面的代码,请注意,对于第2行的[数值]字段为空:

DECLARE @BatchTVP AS [tp_Transition];

/* Add data to the table variable. */ 
INSERT INTO @BatchTVP ([Timestamp], [Value]) 
    VALUES 
    ('2014-05-14 13:05:00.000', 130500.009), 
    ('2014-05-14 13:05:01.000', NULL); 

/* Pass the table variable data to a stored procedure. */ 
EXEC [dbo].[sp_InsertTransition] @BatchTVP; 

上述代码工作正常,值按预期插入到表中。

现在我想从C++使用ODBC,并完全绑定多排缓冲器(发送数据作为TVP与内存的值),因为这TechNet文章中描述 表值参数复制这个SQL代码: http://technet.microsoft.com/en-us/library/ff878030.aspx

我已经阅读了规范的大部分内容,但无法找到实现这一目标的方法。

感谢您的任何提示。

弗雷德里克

,你所要做的是把SQL_NULL_DATA在你的长度缓冲,当您绑定到列参数。这意味着您不能使用方便的SQL_NTS进行空终止strings。所以你必须把你的长度在缓冲区中。价值在哪里将是空的? - 使用SQL_NULL_DATA而不是实际长度或SQL_NTS - 在缓冲区中也可以使用。