首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NVARCHAR(MAX) -作为SQL存储过程输出参数

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

Stack Overflow用户
提问于 2015-09-14 12:31:26
回答 1查看 10.3K关注 0票数 3

Display_Info是一个SQL存储过程,有三个输入参数和三个输出参数。Info_Data(序列化信息数据也可能包含unicode和null值),其中一个输出参数以前是NVARCHAR(1000)类型。由于现在info_Data的尺寸越大,它的类型就会改变(最大)。当与NVARCHAR(1000)类似时,在客户端应用程序中执行存储过程没有问题,但是在将存储过程更改为NVARCHAR(MAX)之后,客户端应用程序将抛出错误,类似于“至少有一个包含不支持的类型的参数”。SQL存储过程设计如下所示。

代码语言:javascript
复制
Create Display_Info @channel NVARCHAR(100)
    ,@infoType INT
    ,@locationId NVARCHAR(50)
    ,@Id BIGINT OUTPUT
    ,@infoData NVARCHAR(MAX) OUTPUT
    ,@infoStatus TINYINT OUTPUT
AS
...

客户端应用程序执行存储过程的方式是,

代码语言:javascript
复制
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

代码语言:javascript
复制
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 
* Ä(Á(¼(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

代码语言:javascript
复制
Ä(Á(¼(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

时间NVARCHAR(4000),infoData :总长度- 4084

代码语言:javascript
复制
Ä(Á(¼(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

NVARCHAR(MAX) :在执行命令后具有相同的infoData输入时,

代码语言:javascript
复制
conncmd.Execute(); // after this statement 

它抛出一个错误,如

代码语言:javascript
复制
At least one parameter contained a type that was not supported.

从错误中可以很清楚地理解,这种类型将不再受支持。同时,在中显式执行存储过程。它工作得很好,得到了完整的infoData,没有任何截断。

代码语言:javascript
复制
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

我还注意到,What is the maximum characters for the NVARCHAR(MAX)?的意思是,“类型为NVARCHAR(最大)的列的最大大小是存储的2 GByte”。但我不明白,为什么在这种情况下,它显示的NVARCHAR(最大)作为类型不支持。我已经提到了我正在使用的SSMS版本,这样可以帮助准确地修复错误。

2008 R2。V 10.50.2550.0: SQLAPI++ - 3.8.3

帮助我获得完整的info_Data,因为它是没有任何损失或截断。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-26 12:09:14

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

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

所以,你根本不需要使用这个(最大的)。

不同的情况是,当表中的列为NVARCHAR(MAX)时。在这种情况下,您可以在其中包含多达2GB的信息,这些信息保存在多个LOB页面中。

更多信息https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d5e0c6e5-8e44-4ad5-9591-20dc0ac7a870/nvarcharmax?forum=transactsql

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32564899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档