nvarchar(4000)长度不够?

时间:2022-09-16 06:23:40
create table aa (studentid nvarchar(8),teacherID nvarchar(8),MarkString nvarchar(32),评教所用标准编码 varchar(8))
insert into aa select 
N'0001',       N'0001',       N'ABCDEDDDCCCDEE',     N'S_T_1' union all select
N'0002',       N'0001',       N'ABCDEDDDCCCDEE',     N'S_T_1'
create table bb (评教所用标准编码 nvarchar(8),单项序号 int,单项权重 decimal(38,2))
insert into bb select 
N'S_T_1',                1,            1   union all select
N'S_T_1',                2,            2   union all select
N'S_T_1',                3,            2.5 union all select
N'S_T_1',                4,            3   union all select
N'S_T_1',                5,            4   union all select
N'S_T_1',                6,            5   union all select
N'S_T_1',                7,            6   union all select
N'S_T_1',                8,            7
declare @strSql nvarchar(4000),@i int 
set @strSql = N'select teacherID'
set @i=1
select @strSql=@strSql+
N',avg(case substring(MarkString,'+rtrim(@i)+',1) when ''A'' then 1 when ''B'' then 0.8 when ''C'' then 0.6 when ''D'' then 0.4 when ''E'' then 0.2 end)*(select 单项权重 from bb where 评教所用标准编码=A.评教所用标准编码 and 单项序号='+rtrim(@i)+')'
+' 单项'+rtrim(@i),
@i=@i+1
from (select top 1 * from aa) A inner join bb on 1=1
set @strSql =@strSql+N' from aa A group by teacherID,评教所用标准编码'
exec sp_executeSql @strSql

当bb单项序号增到17或更多时,无法计算,哪位高手给指点一下,多谢!

11 个解决方案

#1


那就用NTEXT

#2


sp_executesql过程对大于4000的字符的处理?\
sp_executesql只支持nvarchar类型
所以只能为4000,不能大于这个数
优化一下sql,让语句小于4000,
目标拆分成几个语句执行

#3


顶楼上

或换varchar(8000)试试

#4


过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。

优化一下sql,让语句小于4000,
目标拆分成几个语句执行

我不知道要达到要计算的功能,怎么拆分这个语句,麻烦哪位大侠相助一下!

#5


以前遇到过,这样就可以:
exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
只要每个都不超4K就可以,加起来可以超过的

#6


to : rsnm(撒手不管) 
我这样试着做,报错 '+' 附近有语法错误 ,exec  sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
中好像不能用 @strSql1+@strSql2...
有没有别的方法?

#7


把这段逻辑简化一下
case substring(MarkString,'+rtrim(@i)+',1) 
when 'A' then 1 
when 'B' then 0.8 
when 'C' then 0.6 
when 'D' then 0.4 
when 'E' then 0.2 
end

可以简化为
(70-ascii(substring(MarkString,'+rtrim(@i)+',1)))*0.2

#8


to: bugchen888(臭虫)
    谢谢你的赐教,不过,问题还是没有完全解决,字符串长度还是大!
    诸位大侠能不能帮忙把 
declare  @strSql  nvarchar(4000),@i  int    
set  @strSql  =  N'select  teacherID'  
set  @i=1  
select  @strSql=@strSql+  
N',avg(case  substring(MarkString,'+rtrim(@i)+',1)  when  ''A''  then  1  when  ''B''  then  0.8  when  ''C''  then  0.6  when  ''D''  then  0.4  when  ''E''  then  0.2  end)*(select  单项权重  from  bb  where  评教所用标准编码=A.评教所用标准编码  and  单项序号='+rtrim(@i)+')'  
+'  单项'+rtrim(@i),  
@i=@i+1  
from  (select  top  1  *  from  aa)  A  inner  join  bb  on  1=1  
set  @strSql  =@strSql+N'  from  aa  A  group  by  teacherID,评教所用标准编码'  
exec  sp_executeSql  @strSql  
这段东西简写或另辟蹊径?在下实在是菜鸟级的菜鸟 ,拜托大家了!

#9


我这样试着做,报错 '+' 附近有语法错误 ,exec  sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
中好像不能用 @strSql1+@strSql2...
有没有别的方法?


这样应该可以:EXEC(@strSql1+@strSql2+@strSql3+@strSql4+...)

#10


用2005吧,里面有nvarchar(max)

#11


好像答非所问了,嘿嘿。

#1


那就用NTEXT

#2


sp_executesql过程对大于4000的字符的处理?\
sp_executesql只支持nvarchar类型
所以只能为4000,不能大于这个数
优化一下sql,让语句小于4000,
目标拆分成几个语句执行

#3


顶楼上

或换varchar(8000)试试

#4


过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。

优化一下sql,让语句小于4000,
目标拆分成几个语句执行

我不知道要达到要计算的功能,怎么拆分这个语句,麻烦哪位大侠相助一下!

#5


以前遇到过,这样就可以:
exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
只要每个都不超4K就可以,加起来可以超过的

#6


to : rsnm(撒手不管) 
我这样试着做,报错 '+' 附近有语法错误 ,exec  sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
中好像不能用 @strSql1+@strSql2...
有没有别的方法?

#7


把这段逻辑简化一下
case substring(MarkString,'+rtrim(@i)+',1) 
when 'A' then 1 
when 'B' then 0.8 
when 'C' then 0.6 
when 'D' then 0.4 
when 'E' then 0.2 
end

可以简化为
(70-ascii(substring(MarkString,'+rtrim(@i)+',1)))*0.2

#8


to: bugchen888(臭虫)
    谢谢你的赐教,不过,问题还是没有完全解决,字符串长度还是大!
    诸位大侠能不能帮忙把 
declare  @strSql  nvarchar(4000),@i  int    
set  @strSql  =  N'select  teacherID'  
set  @i=1  
select  @strSql=@strSql+  
N',avg(case  substring(MarkString,'+rtrim(@i)+',1)  when  ''A''  then  1  when  ''B''  then  0.8  when  ''C''  then  0.6  when  ''D''  then  0.4  when  ''E''  then  0.2  end)*(select  单项权重  from  bb  where  评教所用标准编码=A.评教所用标准编码  and  单项序号='+rtrim(@i)+')'  
+'  单项'+rtrim(@i),  
@i=@i+1  
from  (select  top  1  *  from  aa)  A  inner  join  bb  on  1=1  
set  @strSql  =@strSql+N'  from  aa  A  group  by  teacherID,评教所用标准编码'  
exec  sp_executeSql  @strSql  
这段东西简写或另辟蹊径?在下实在是菜鸟级的菜鸟 ,拜托大家了!

#9


我这样试着做,报错 '+' 附近有语法错误 ,exec  sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
中好像不能用 @strSql1+@strSql2...
有没有别的方法?


这样应该可以:EXEC(@strSql1+@strSql2+@strSql3+@strSql4+...)

#10


用2005吧,里面有nvarchar(max)

#11


好像答非所问了,嘿嘿。