当前位置: 首页 > 知识库问答 >
问题:

NVARCHAR(MAX)-作为SQL存储过程输出参数

谭凯
2023-03-14
Create Display_Info @channel NVARCHAR(100)
    ,@infoType INT
    ,@locationId NVARCHAR(50)
    ,@Id BIGINT OUTPUT
    ,@infoData NVARCHAR(MAX) OUTPUT
    ,@infoStatus TINYINT OUTPUT
AS
...
try
{
SACommand conncmd;
CheckConnection();
conncmd.setConnection(&mConn);
std::wstring cmdText = COMMAND_TEXT("ReadMessage");
conncmd.setCommandText(cmdText.c_str());
conncmd.Param("channel").setAsString() = SAString(channel.c_str(), (int)channel.length());
conncmd.Param("infoType").setAsNumeric() = SANumeric((sa_int64_t)type);
conncmd.Param("locationId").setAsString() = SAString(locationId.c_str(), (int)locationId.length());
conncmd.Execute(); 
std::wstring Id = conncmd.Param(COMMAND_TEXT("Id")).asString();
infodata = conncmd.Param(COMMAND_TEXT("info_Data")).asString();
}
catch (SAException &e)
{
std::string errorMessage = (mb_twine)e.ErrText();
std::cout << "\n" <<errorMessage;
}

输入/输出示例:

infoData序列化输入:总长度5191

Ä(Á(¼(Protocol Buffers is a method of serializing structured data. It is useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data.Google developed Protocol Buffers for use internally and has made protocol compilers for C++, Java and Python available to the public under a free software, open source license. Various other language implementations are also available, including C#, JavaScript, Go, Perl, PHP, Ruby, and Scala.[1]The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be smaller and faster than XML.[2] Third parties have reported that Protocol Buffers outperforms the standardized Abstract Syntax Notation One with respect to both message size and decoding performance.[3]Protocol Buffers is widely used at Google for storing and interchanging all kinds of structured information. The method serves as a basis for a custom remote procedure call (RPC) system that is used for nearly all inter-machine communication at Google.[4]Protocol Buffers is very similar to the Apache Thrift protocol (used by Facebook for example), except that the public Protocol Buffers implementation does not include a concrete RPC protocol stack to use for defined services.A software developer defines data structures (called messages) and services in a proto definition file (.proto) and compiles it with protoc. This compilation generates code that can be invoked by a sender or recipient of these data structures. For example, example.proto will produce example.pb.cc and example.pb.h, which will define C++ classes for each message and service that example.proto defines.Canonically, messages are serialized into a binary wire format which is compact, forwards-compatible, and backwards-compatible, but not self-describing (that is, there is no way to tell the names, meaning, or full datatypes of fields without an external specification). There is no defined way to include or refer to such an external specification (schema) within a Protocol Buffers file. The officially supported implementation includes an ASCII serialization format,[5] but this format â though self-describing â loses the forwards-and-backwards-compatibility behavior, and is thus not a good choice for applications other than debugging.Though the primary purpose of Protocol Buffers is to facilitate network communication, its simplicity and speed make Protocol Buffers an alternative to data-centric C++ classes and structs, especially where interoperability with other languages or systems might be needed in the future.A schema for a particular use of protocol buffers associates data types with field names, using integers to identify each field. (The protocol buffer data contains only the numbers, not the field names, providing some bandwidth / storage savings compared with systems that include the field names in the data.)//polyline.protomessage Point {  required int32 x = 1;    required int32 y = 2;   optional string label = 3;   }      message Line {     required Point start = 1;    required Point end = 2;      optional string label = 3;   }      message Polyline {     repeated Point point = 1;       optional string label = 2;    }    The "Point" message defines two mandatory data items, x and y. The data item label is optional. Each data item has a tag. The tag is defined after the equal sign. For example, x has the tag 1.        The Line and "Polyline" messages, which both use Point, demonstrate how composition works in Protocol Buffers. Polyline has a repeated field, which behaves like a vector.        This schema can subsequently be compiled for use by one or more programming languages. Google provides a compiler called protoc which can produce output for C++, Java or Python. Other schema compilers are available from other sources to create language-dependent output for over 20 other languages.[6]        For example, after a C++ version of the protocol buffer schema above is produced, a C++ source code file, polyline.cpp, can use the message objects as follows:        // polyline.cpp#include polyline.pb.h  // generated by calling protoc polyline.proto        Line* createNewLine(const std::string& name) {      // create a line from (10, 20) to (30, 40)        Line* line = new Line;       line->mutable_start()->set_x(10);         line->mutable_start()->set_y(20);        line->mutable_end()->set_x(30);          line->mutable_end()->set_y(40);         line->set_label(name);           return line;        }                Polyline* createNewPolyline() {          // create a polyline with points at (10,10) and (20,20)            Polyline* polyline = new Polyline;           Point* point1 = polyline->add_point();             point1->set_x(10);            point1->set_y(10);              Point* point2 = polyline->add_point();             point2->set_x(20);               point2->set_y(20);              return polyline;              }

当,NVARCHAR(1000),infoData值:总长度-1003

Ä(Á(¼(Protocol Buffers is a method of serializing structured data. It is useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data.Google developed Protocol Buffers for use internally and has made protocol compilers for C++, Java and Python available to the public under a free software, open source license. Various other language implementations are also available, including C#, JavaScript, Go, Perl, PHP, Ruby, and Scala.[1]The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be smaller and faster than XML.[2] Third parties have reported that Protocol Buffers outperforms the standardized Abstract Syntax Notation One with respect to both message size and dec
Ä(Á(¼(Protocol Buffers is a method of serializing structured data. It is useful in developing programs to communicate with each other over a wire or for storing data. The method involves an interface description language that describes the structure of some data and a program that generates source code from that description for generating or parsing a stream of bytes that represents the structured data.Google developed Protocol Buffers for use internally and has made protocol compilers for C++, Java and Python available to the public under a free software, open source license. Various other language implementations are also available, including C#, JavaScript, Go, Perl, PHP, Ruby, and Scala.[1]The design goals for Protocol Buffers emphasized simplicity and performance. In particular, it was designed to be smaller and faster than XML.[2] Third parties have reported that Protocol Buffers outperforms the standardized Abstract Syntax Notation One with respect to both message size and decoding performance.[3]Protocol Buffers is widely used at Google for storing and interchanging all kinds of structured information. The method serves as a basis for a custom remote procedure call (RPC) system that is used for nearly all inter-machine communication at Google.[4]Protocol Buffers is very similar to the Apache Thrift protocol (used by Facebook for example), except that the public Protocol Buffers implementation does not include a concrete RPC protocol stack to use for defined services.A software developer defines data structures (called messages) and services in a proto definition file (.proto) and compiles it with protoc. This compilation generates code that can be invoked by a sender or recipient of these data structures. For example, example.proto will produce example.pb.cc and example.pb.h, which will define C++ classes for each message and service that example.proto defines.Canonically, messages are serialized into a binary wire format which is compact, forwards-compatible, and backwards-compatible, but not self-describing (that is, there is no way to tell the names, meaning, or full datatypes of fields without an external specification). There is no defined way to include or refer to such an external specification (schema) within a Protocol Buffers file. The officially supported implementation includes an ASCII serialization format,[5] but this format â though self-describing â loses the forwards-and-backwards-compatibility behavior, and is thus not a good choice for applications other than debugging.Though the primary purpose of Protocol Buffers is to facilitate network communication, its simplicity and speed make Protocol Buffers an alternative to data-centric C++ classes and structs, especially where interoperability with other languages or systems might be needed in the future.A schema for a particular use of protocol buffers associates data types with field names, using integers to identify each field. (The protocol buffer data contains only the numbers, not the field names, providing some bandwidth / storage savings compared with systems that include the field names in the data.)//polyline.protomessage Point {  required int32 x = 1;    required int32 y = 2;   optional string label = 3;   }      message Line {     required Point start = 1;    required Point end = 2;      optional string label = 3;   }      message Polyline {     repeated Point point = 1;       optional string label = 2;    }    The "Point" message defines two mandatory data items, x and y. The data item label is optional. Each data item has a tag. The tag is defined af
conncmd.Execute(); // after this statement 
At least one parameter contained a type that was not supported.
USE [TestDB]
GO

DECLARE @return_value int,
        @Id bigint,
        @infoData nvarchar(max),
        @infoStatus tinyint

EXEC    @return_value = "DisplayInfo"
        @channel = N'telephoneMessage',
        @infoType = 1,
        @locationId = N'F6C8B935',
        @Id = @Id OUTPUT,
        @infoData = @infoData OUTPUT,
        @infoStatus = @infoStatus OUTPUT

SELECT  @Id as N'@PayloadId',
        @infoData as N'@MessageData',
        @infoStatus as N'@Status'

SELECT  'Return Value' = @return_value

GO

帮助我获得完整的info_Data原样,没有任何丢失或截断。

提前道谢。

共有1个答案

吕峰
2023-03-14

事实是,您不能在一个包含2GB信息的查询变量中。

查询中NVARCHAR(max)类型的列的最大大小为4000个字符(1 LOB页),即使在SSMS查询窗口中也是如此;-)。

所以,你根本不需要使用那个(MAX)。

 类似资料:
  • 本文向大家介绍Sql Server 存储过程调用存储过程接收输出参数返回值,包括了Sql Server 存储过程调用存储过程接收输出参数返回值的使用技巧和注意事项,需要的朋友参考一下 创建存储过程: 接收输出参数: 2,带返回值 创建存储过程: 接收返回值: 以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小

  • 问题内容: 我有一个来自此(google book )的mysql存储过程,一个例子是这样的: 该程序编译正常。(我在ubuntu中使用MySQL查询浏览器)。 但是,当我调用该过程时: (也在查询浏览器中) 它返回一个错误: 为什么这个例子不起作用? 问题答案: 无法复制。对我来说效果很好: 也许您应该粘贴整个错误消息,而不是对其进行汇总。

  • 存储过程以完整的响应(>4000个字符)回答,但我无法从Java打开它。我尝试过jTDS和微软的JDBC驱动程序6.0。下面是我的代码: 这适用于Sybase中的存储过程。

  • 我正在开发一个框架,其中我是一个使用动态创建的参数调用存储过程。我正在运行时构建参数集合。 当我将参数传递给存储过程时,会出现此问题,但存储过程不接受此类参数。 例如,我的存储过程是: 调用存储过程: 这会引发以下错误: 这在 Sybase ASE 中工作正常,它只是忽略任何其他参数。这可以通过MSSQL服务器2008实现吗?任何帮助,非常感谢。谢谢

  • 问题内容: 我在SQL Server 2008 R2中有一个Oracle链接服务器。我需要执行Oracle存储过程(在第一个过程中使用输出参数,在第二个过程中使用输入参数): 我没有找到有关此问题的完整文档,只有带有无参数选择/非选择过程的简单示例,并且想知道如何调用这些过程,具有内部select的过程以及具有基本参数类型的多参数过程。 问题答案: 它应该像这样工作: 如果您有几个参数,则可能如下

  • 问题内容: 我已经编写了一个VBScript函数来调用存储过程。过去,我编写了许多函数,这些函数使用输入参数调用存储过程,但是在这种情况下,我需要使用Output参数。 在另一个应用程序中,我使用实体框架调用完全相同的存储过程,因此该存储过程很好。 这是我的代码: adParamInput, 50, userId)) cmd.Parameters.Append(cmd.CreateParamete