存储过程中使用Text类型的输出参数(转)

本帖转载自 蝈蝈俊 的BLOG

今天在写一个程序的时候,用到了输出Text类型的的存储过程,但是调试了很久一直不行。在MSDN上查资料,MSDN上有如下信息:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_create_4hk5.asp

OUTPUT

Indicates that the parameter is a return parameter. The value of this option can be returned to EXEC[UTE]. Use OUTPUT parameters to return information to the calling procedure. Text, ntext, and image parameters can be used as OUTPUT parameters. An output parameter using the OUTPUT keyword can be a cursor placeholder.

后来在Google上查资料,同时咨询了很多人后,发现MSDN这个描述应该值得商量。理由如下:Text 类型是可以作为 OutPut 参数,但是没法给他赋值。一但赋值就会报错,等于OutPut一点用也没有。


比如下面不带赋值操作的存储过程,创建就没有问题。

create proc p_test @o text=null
out as
go

exec p_test
go

drop proc p_test

但是一旦其中有了赋值操作,问题就来了。比如如下的存储过程:

create proc p_test @o text=null
out as
select @o = 'x'
go

创建的时候就会报以下错误:

Server: Msg 409, Level 16, State 1, Procedure p_test, Line 3
The assignment operator operation cannot take a text data type as an argument.

 

Google 上与此有关的一些讨论:
http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=e%23BC093DBHA.1828%40tkmsftngp05&rnum=2&prev=/groups%3Fq%3DText,%2Bntext,%2Band%2Bimage%2Bparameters%2Bcan%2Bbe%2Bused%2Bas%2BOUTPUT%2Bparameters%26hl%3Den%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3De%2523BC093DBHA.1828%2540tkmsftngp05%26rnum%3D2

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&q=Text%2C+ntext%2C+and+image+parameters+can+be+used+as+OUTPUT+parameters&btnG=Google+Search

要读取Text类型变量的方法有很多,下面就罗列一些:

sqlserver不允许将BLOBs大数据类型赋值给本地变量,只能得到相应的指针,然后根据指针读取相关信息。

一般的做法都是使用SqlDataReader,详情请参考
http://www.microsoft.com/china/msdn/adonet.asp

如果您不想使用SqlDataReader,还是使用SqlHelper.ExecuteNonQuery,可以通过先取出数据的指针,然后根据指针再将数据读出来。详情请参考
【Conserving Resources When Writing BLOB Values to SQL Server】
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconconservingresourceswhenwritingblobvaluestosqlserver.asp

另外 IMAGE 作为输出参数就没有问题,比如下面的存储过程:

CREATE Procedure OutputCoverByISBN
(@ISBNWanted VarChar(20),
  @CoverOut IMAGE OUTPUT)

as
SELECT @CoverOut=COVER FROM Covers WHERE ISBN = @ISBNWanted
SELECT ISBN, Version, FileName, @CoverOut Cover FROM Covers WHERE ISBN =
@ISBNWanted

GO

posted @ 2005-04-01 12:30  三角猫  阅读(2227)  评论(0编辑  收藏  举报