SQL 设置变量数据类型为VARCHAR超过8000个字符会怎样?

CREATE   PROCEDURE   PR_SelectOnLoneHuman
@Title   VARCHAR(200)= ' ',
@IDS   VARCHAR,
@Error   VARCHAR(500)= ' '   OUTPUT

AS
SET   @IDS= '1,2 '
IF   @Title <> ' '
EXEC   ( 'SELECT   *   FROM   webflow..USERS   WHERE   [USERID]   IN( '+@IDS+ ')   AND   ([NAME]   LIKE   ' '% '+@Title+ '% ' '   OR   LOGONID= '+@Title+ ') ')
ELSE
EXEC   ( 'SELECT   *   FROM   webflow..USERS   WHERE   [USERID]   IN( '+@IDS+ ') ')
RETURN   @@ROWCOUNT
IF(@@ERROR <> 0)
SET   @Error=@@ERROR

GO


如上代码中,我设置@IDS   变量为不指定长度VARCHAR类型,VARCHAR类型最大长度是8000,如果变量值超过8000个字符将会怎样?它会把超过8000后的字符串截取,保留前8000个字符的内容吗?   还有,   假如我把它设置为text类型,又提示说text不能用+进行连接..这种情况应如何解决?请赐教

作者: hzdtf   发布时间: 2007-06-21

超过的话应该会截取,如果不够用,可以设一个ntext,

ntext=varchar+varchar+...

没有实验过,理论上应该成立

作者: sky3324   发布时间: 2007-06-21

对于给变量赋值来说超过8000的时候会截取前8000个字符,如果是插入表字段的话就会插入失败

作者: echiynn   发布时间: 2007-06-21

变量是不能设置成ntext类型的

超过8000会截断,也会有提示,看不同开发工具而定

作者: jwt1982   发布时间: 2007-06-21

如果参数中varchar类型变量不指明长度,则长度默认为1,参数值中超过长度的部分会被截断.
如果变量超过8000个字符,通常是设计存储过程时多创建几个冗余的varchar(8000)类型的参数,
客户端调用存储过程时判断一下参数内容长度是否超过8000,若超过则拆开赋予其它冗余参数.
存储过程内对冗余参数进行判断,如果冗余参数不为空则连接该参数,例如:

作者: hellowork   发布时间: 2007-06-21

CREATE   PROCEDURE   PR_SelectOnLoneHuman
                @Title   VARCHAR(200)= ' ',
                @IDS   VARCHAR(8000),           /*指明长度,否则为1*/
                @Error   VARCHAR(500)= ' '   OUTPUT
                @IDS_1   varchar(8000)   ' ',     /*指定冗余参数,并设置默认值为 ' '*/
                @IDS_2   varchar(8000)   ' '       /*指定冗余参数,并设置默认值为 ' '*/
AS
----连接冗余参数
SET   @IDS=   @IDS   +  
case   when   @IDS_1   <>   ' '   then   @IDS_1   else   ' '   end   +  
case   when   @IDS_2   <>   ' '   then   @IDS_2   else   ' '   end

IF   @Title <> ' '
EXEC   ( 'SELECT   *   FROM   webflow..USERS   WHERE   [USERID]   IN( '+@IDS+ ')   AND   ([NAME]   LIKE   ' '% '+@Title+ '% ' '   OR   LOGONID= '+@Title+ ') ')
ELSE
EXEC   ( 'SELECT   *   FROM   webflow..USERS   WHERE   [USERID]   IN( '+@IDS+ ') ')
IF(@@ERROR <> 0)
SET   @Error=@@ERROR
RETURN   @@ROWCOUNT             /*return应该放到最后,否则IF(@@ERROR <> 0)就永远不会被执行*/
GO

作者: hellowork   发布时间: 2007-06-21

抱歉,上面的回复中冗余参数默认值写法错误,更正一下:
CREATE   PROCEDURE   PR_SelectOnLoneHuman
                @Title   VARCHAR(200)= ' ',
                @IDS   VARCHAR(8000),           /*指明长度,否则为1*/
                @Error   VARCHAR(500)= ' '   OUTPUT
                @IDS_1   varchar(8000)=   ' ',     /*指定冗余参数,并设置默认值为 ' '*/
                @IDS_2   varchar(8000)=   ' '       /*指定冗余参数,并设置默认值为 ' '*/
AS
......

作者: hellowork   发布时间: 2007-06-21

sky3324(Lorn)  
      超过的话应该会截取,如果不够用,可以设一个ntext,

ntext=varchar+varchar+...

没有实验过,理论上应该成立
===========================================================
真幽默.    
 

作者: lang8134   发布时间: 2007-06-21

'SELECT   *   FROM   webflow..USERS   ,请问这有几个表的啊?

作者: penty125111   发布时间: 2007-06-21

过长会截断

作者: hui_hui_2007   发布时间: 2007-06-21

截断

作者: sp4   发布时间: 2007-06-22

截断,你用varchar(max)試一下。

作者: LOVEJAVA2008   发布时间: 2011-01-31

切断!

作者: jinfengyiye   发布时间: 2011-01-31