今天在写一个程序的时候,用到了输出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.
要读取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