日期:2014-05-18  浏览次数:20703 次

存储过程:Exec(@s1+@s2+@s3...),因字符数大于8000而被截取了,该如何处理呢?急等
@s1,@s2,@s3都被定义varchar(8000)
(@s1+@s2+@s3...)的字符数大于8000,此时执行Exec的操作,那么sql语句会被截取至小等于8000的状态,那么执行时就会出错。我该怎么做才能让这个SQL语句正常的执行呢
看到有说用Text类型的,我declare   @s1   text,确又提示错误,迷茫了

------解决方案--------------------
(@s1+@s2+@s3...)的字符数大于8000,此时执行Exec的操作,那么sql语句会被截取至小等于8000的状态,那么执行时就会出错

-----

EXEC(@S1 + @S2 + @S3)應該不會出錯啊。

邹老大講的“化解字符串不能超过8000的方法”中第一個就是這個方法。


/*--化解字符串不能超过8000的方法

经常有人提到,用动态生成SQL语句的方法处理数据时,处理语句超长,无法处理的问题
下面就讨论这个问题:
--邹建 2003.9(引用请保留此信息)--*/


--方法1. 多个变量处理

--根据查询结果定义变量(实际处理中,应该是估计需要多少个变量,定义足够多的变量个数,多定义变量并不影响处理,下面就多定义了一个)
--生成数据处理临时表
SELECT id=IDENTITY(int,0,1),
g=0,
a=CAST(N ', '+QUOTENAME([name])
+N '=SUM(CASE [name] WHEN N '+QUOTENAME(name,N ' ' ' ')
+N ' THEN [colid] ELSE 0 END) '
as nvarchar(4000))
INTO # FROM syscolumns
WHERE name> N ' '
GROUP BY name

--分组临时表
UPDATE a SET G=id/i
FROM # a,(SELECT i=3800/MAX(LEN(a)) FROM #)b
SELECT MAX(g)+1 as N '需要的变量个数 ' FROM #

DECLARE @0 nvarchar(4000),@1 nvarchar(4000),@2 nvarchar(4000),@3 nvarchar(4000),@4 nvarchar(4000)
SELECT @0=N ' ',@1=N ' ',@2=N ' ',@3=N ' ',@4=N ' '
SELECT
@0=CASE g WHEN 0 THEN @0+a ELSE @0 END,
@1=CASE g WHEN 1 THEN @1+a ELSE @1 END,
@2=CASE g WHEN 2 THEN @2+a ELSE @2 END,
@3=CASE g WHEN 3 THEN @3+a ELSE @3 END,
@4=CASE g WHEN 4 THEN @4+a ELSE @4 END
FROM #
EXEC(N 'SELECT xtype '+@0+@1+@2+@3+@4+N ' FROM syscolumns GROUP BY xtype ')
DROP TABLE #

/*--方法说明

优点:比较灵活,数据量大时只需要增加变量就行了.不用改动其他部分
缺点:要自行估计处理的数据,估计不足就会出错
--*/

------解决方案--------------------
大于8000 我还没有碰到过,不过先收下,以后可以用老大的方法看看.
老大真牛人一个,什么都想过,方法也都有.
多多学习
------解决方案--------------------
估計是你其中某个@s1超過8000了...

exec(@s1+@s2+@s3..)
改成
select len(@s1)
select len(@s2)
select len(@s3)
...看看,是不是有問題
------解决方案--------------------
楼主纯数字ID,是个老人了。
------解决方案--------------------
如果單個沒有超過8000,EXEC(@S1 + @S2 + @S3)不會出錯。
------解决方案--------------------
558047(三个代表万睡!八荣八耻万睡!) ( ) 信誉:86 Blog 加为好友 2007-04-10 09:31:59 得分: 0


select len(@s7),len(@s8),len(@s1),len(@s2),len(@s3),len(@s4),len(@s5),len(@s6)
----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
3948 3520 4010 4010 4010 4010 4010 4010

(所影响的行数为 1 行)


---------
實際上你定義的變量已經超出范圍了

Declare @S7 varchar(8000), @S8 varchar(8000),@S1 varchar(8000), @S2 varchar(8000), @S3 varchar(8000),@S4 varchar(8000), @S5 varchar(8000), @S6 varchar(8000)

雖然你定義的變量類型為varchar,長度為8000

但是你的ProduceNo的類型是nvarchar,而varchar+nvarchar=nvarchar,nvarchar()最多字符串长度是4000。

這就表明實際上@s1, @s2,@s3,@s4,@s5,@s6已經超出長度了,所以在最好執行EXEC的時候會報錯。


------解决方案--------------------
這就表明實際上@s1, @s2,@s3,@s4,@s5,@s6已經超出長度了,所以在最後執行EXEC的時候會報錯。
------解决方案--------------------
你如果要用varchar;

首先:把所有的 " N '...... ' " 前面的 "N "去除.

然后:把跟nvarchar变量相加的地方.cast(Your_Nvarchar_Var as varchar(NUM))