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,
目标拆分成几个语句执行
sp_executesql只支持nvarchar类型
所以只能为4000,不能大于这个数
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
#3
顶楼上
或换varchar(8000)试试
或换varchar(8000)试试
#4
过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
我不知道要达到要计算的功能,怎么拆分这个语句,麻烦哪位大侠相助一下!
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
我不知道要达到要计算的功能,怎么拆分这个语句,麻烦哪位大侠相助一下!
#5
以前遇到过,这样就可以:
exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
只要每个都不超4K就可以,加起来可以超过的
exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
只要每个都不超4K就可以,加起来可以超过的
#6
to : rsnm(撒手不管)
我这样试着做,报错 '+' 附近有语法错误 ,exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
中好像不能用 @strSql1+@strSql2...
有没有别的方法?
我这样试着做,报错 '+' 附近有语法错误 ,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
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
这段东西简写或另辟蹊径?在下实在是菜鸟级的菜鸟 ,拜托大家了!
谢谢你的赐教,不过,问题还是没有完全解决,字符串长度还是大!
诸位大侠能不能帮忙把
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+...)
中好像不能用 @strSql1+@strSql2...
有没有别的方法?
这样应该可以:EXEC(@strSql1+@strSql2+@strSql3+@strSql4+...)
#10
用2005吧,里面有nvarchar(max)
#11
好像答非所问了,嘿嘿。
#1
那就用NTEXT
#2
sp_executesql过程对大于4000的字符的处理?\
sp_executesql只支持nvarchar类型
所以只能为4000,不能大于这个数
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
sp_executesql只支持nvarchar类型
所以只能为4000,不能大于这个数
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
#3
顶楼上
或换varchar(8000)试试
或换varchar(8000)试试
#4
过程需要参数 '@statement' 为 'ntext/nchar/nvarchar' 类型。
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
我不知道要达到要计算的功能,怎么拆分这个语句,麻烦哪位大侠相助一下!
优化一下sql,让语句小于4000,
目标拆分成几个语句执行
我不知道要达到要计算的功能,怎么拆分这个语句,麻烦哪位大侠相助一下!
#5
以前遇到过,这样就可以:
exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
只要每个都不超4K就可以,加起来可以超过的
exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
只要每个都不超4K就可以,加起来可以超过的
#6
to : rsnm(撒手不管)
我这样试着做,报错 '+' 附近有语法错误 ,exec sp_executeSql @strSql1+@strSql2+@strSql3+@strSql4+...
中好像不能用 @strSql1+@strSql2...
有没有别的方法?
我这样试着做,报错 '+' 附近有语法错误 ,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
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
这段东西简写或另辟蹊径?在下实在是菜鸟级的菜鸟 ,拜托大家了!
谢谢你的赐教,不过,问题还是没有完全解决,字符串长度还是大!
诸位大侠能不能帮忙把
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+...)
中好像不能用 @strSql1+@strSql2...
有没有别的方法?
这样应该可以:EXEC(@strSql1+@strSql2+@strSql3+@strSql4+...)
#10
用2005吧,里面有nvarchar(max)
#11
好像答非所问了,嘿嘿。