2015-09-14 41 views
3

Display_Info是一個SQL存儲過程,具有三個輸入參數和三個輸出參數。 info_Data(序列化的信息數據也可能包含unicode和null值)其中一個輸出參數的類型是NVARCHAR(1000)。由於info_Data的大小現在更改爲NVARCHAR(MAX)類型。當它與NVARCHAR(1000)類似時,在客戶端應用程序中執行存儲過程時沒有問題,但在將其更改爲NVARCHAR(MAX)後,客戶端應用程序拋出錯誤,如「至少一個參數包含不受支持的類型「。 SQL存儲過程設計如下所示。NVARCHAR(MAX) - 作爲SQL存儲過程輸出參數

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串行輸入:總長度

Ä(Á(¼(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值:總長度 -

Ä(Á(¼(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:總長度 -

Ä(Á(¼(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輸入 執行該命令後,

conncmd.Execute(); // after this statement 

它拋出一個錯誤

At least one parameter contained a type that was not supported. 

從錯誤可以理解的很清楚,這種類型將不再支持。同時在SQL Server Management Studio中顯式執行存儲過程。它工作正常,得到完整的infoData沒有任何截斷。

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(MAX)的列中的最大尺寸是存儲的2千兆字節」。但我不明白爲什麼在這種情況下它顯示NVARCHAR(MAX)爲類型不支持。我提到了我正在使用的SSMS版本,以便它可以幫助準確地修復錯誤。

SQL Server Management Studio 2008 R2。 V 10.50.2550.0: SQLAPI ++ - 3.8.3

幫助我獲得完整的info_Data,因爲它沒有任何損失或截斷。

在此先感謝。

+0

我不知道關於C++的語法,但你不應該執行命令之前,將宣佈你的輸出參數?除此之外,您可以將'nvarchar'參數的大小設置爲-1來表示'MAX'。 –

+0

嗨@MichaelMcMullin,謝謝你的回覆。我已經更改了申報單並進行了驗證。但控制再次傳遞給catch並拋出相同的異常。還有其他的可能嗎? –

+0

我快速瀏覽了SQLAPI ++文檔,它似乎使用了我不熟悉的方法。 'CreateParam'函數似乎最接近提供你需要的很多控件,包括參數類型,大小和方向,但它的使用似乎有點不鼓勵。可能值得一試,但?對不起,我不能有更多的幫助。 –

回答

2

事實是,你不能在2GB的信息查詢變量。

即使在SSMS查詢窗口中,查詢中NVARCHAR(MAX)類型列的最大大小爲4000個字符(1個LOB頁);-)。

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

不同的情況是,當您將表中的列作爲NVARCHAR(MAX)時。在這種情況下,您最多可以擁有2GB的信息,並保存在多個LOB頁面中。

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