首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

存储过程中的变量 nvarchar(4000) 不够大怎么处理

2012-06-02 
存储过程中的变量 nvarchar(4000) 不够大怎么办?存储过程中的变量 nvarchar(4000) 不够大怎么办?代码如下:

存储过程中的变量 nvarchar(4000) 不够大怎么办?
存储过程中的变量 nvarchar(4000) 不够大怎么办?

代码如下:
create proc Select_LoadServiceOrderByPlan(@PlanID int,@SubjectID int,@StartIndex int,@EndIndex int)
as
  declare @strSql ntext
  set @strSql='select * from (
select row_number() over(order by orders.OrderSubmitTime ) rownum, orders.OrderID,orders.OrderCode,orders.IsDelete,orders.IsTuiBao,plans.PlanName,
  orders.StudentType,orders.OrderSubjectState, case orders.SubjectCheckedTime when ''1/1/1753 12:00:00'' then null else orders.SubjectCheckedTime end SubjectCheckedTime,orders.ContractNo,
orders.RepeatOrderPrice,CASE orders.FXPayType WHEN 0 THEN ''按标准收费'' WHEN 1 THEN ''按级收费'' ELSE ''无'' END FXPayType,
  orders.OrderState,orders.OrderSubmitTime,(orders.CheckedUserID)UserID,Orders.ChannelID,
ISNULL(Orders.IsRepeatPay,0) IsRepeatPay,
  orders.StudentID,
CASE CH.LEVEL WHEN 1 THEN CH.SampleName ELSE PCH.SampleName END ParantName,
CASE CH.LEVEL WHEN 2 THEN CH.SampleName ELSE NULL END ChannelName, 
orders.PlanID,users.UserName,stu.IDCardName,sub.SubjectName,
case orders.CheckedTime when ''1/1/1753 12:00:00'' then null else orders.CheckedTime end CheckedTime,sub.SubjectID ,sbj.RetTime,
CASE WHEN (SELECT COUNT(1) FROM dbo.BASSbjForStudent AS yn WHERE yn.StudentID = orders.StudentID AND yn.SubjectID =5 AND yn.IsReapted=1) <> 0 THEN 1 ELSE 0 END IsSX,
CASE WHEN (SELECT COUNT(1) FROM dbo.BASSbjForStudent AS zj WHERE zj.StudentID = orders.StudentID AND zj.SubjectID =1 AND zj.IsReapted=1) <> 0 THEN 1 ELSE 0 END IsZJ
from dbo.BASOrders orders 
left join dbo.BASPlan plans on plans.PlanID = orders.PlanID 
left join BASSubject sub on sub.SubjectID = plans.SubjectID 
left join BASSbjForStudent sbj on sbj.SubjectID=plans.SubjectID and sbj.studentID=Orders.StudentID
left join dbo.BASStudent stu on stu.StudentID = orders.StudentID 
LEFT JOIN BASChannel CH ON CH.ChannelID=stu.ChannelID
LEFT JOIN BASChannel PCH ON PCH.ChannelID=CH.ParantID
left join Sys_User users on users.UserID = orders.CheckedUserID 
where orders.IsDelete = 0 
 and orders.OrderSubmitTime is not null and ISNULL(orders.TuiBaoCheckState,0)=0 and Orders.StudentType=0 AND ISNULL(Orders.IsReject,0)=0 ';
  if(@SubjectID != 0)
  set @strSql = @strSql + ' and plans.SubjectID =' + str(@SubjectID);
  if(@PlanID != 0)
  set @strSql = @strSql + ' and plans.planID =' + str(@PlanID);
  else if(@PlanID = 0)
  set @strSql = @strSql + ' AND (OrderSubjectState = 0 or OrderState = 0) and plans.EndTime>getdate() ';
  set @strSql = @strSql + ' )Ord where rownum between {0} and {1} ';
exec sp_executesql @strSql

[解决办法]
拼两个字符串!然后 exec(@sql_1 + @sql_2) 即可
[解决办法]
nvarchar(max)
[解决办法]
搞8K
[解决办法]

SQL code
----这样的就足够用了nvarchar(max)
[解决办法]
用text呢
[解决办法]
探讨
用text呢

[解决办法]
为什么要用变更。直接用
SQL code
EXE('')
[解决办法]
SQL code
create proc Select_LoadServiceOrderByPlan(@PlanID int,@SubjectID int,@StartIndex int,@EndIndex int)as  declare @strSql nvarchar(4000)  if(@SubjectID != 0)     set @strSql = @strSql + ' and plans.SubjectID =' + str(@SubjectID);  if(@PlanID != 0)    set @strSql = @strSql + ' and plans.planID =' + str(@PlanID);  else if(@PlanID = 0)    set @strSql = @strSql + ' AND (OrderSubjectState = 0 or OrderState = 0) and plans.EndTime>getdate() ';exec('select * from (select row_number() over(order by orders.OrderSubmitTime ) rownum, orders.OrderID,orders.OrderCode,orders.IsDelete,orders.IsTuiBao,plans.PlanName,  orders.StudentType,orders.OrderSubjectState, case orders.SubjectCheckedTime when ''1/1/1753 12:00:00'' then null else orders.SubjectCheckedTime end SubjectCheckedTime,orders.ContractNo,orders.RepeatOrderPrice,CASE orders.FXPayType WHEN 0 THEN ''按标准收费'' WHEN 1 THEN ''按级收费'' ELSE ''无'' END FXPayType,  orders.OrderState,orders.OrderSubmitTime,(orders.CheckedUserID)UserID,Orders.ChannelID,ISNULL(Orders.IsRepeatPay,0) IsRepeatPay,  orders.StudentID,CASE CH.LEVEL WHEN 1 THEN CH.SampleName ELSE PCH.SampleName END ParantName,CASE CH.LEVEL WHEN 2 THEN CH.SampleName ELSE NULL END ChannelName, orders.PlanID,users.UserName,stu.IDCardName,sub.SubjectName,case orders.CheckedTime when ''1/1/1753 12:00:00'' then null else orders.CheckedTime end CheckedTime,sub.SubjectID ,sbj.RetTime,CASE WHEN (SELECT COUNT(1) FROM dbo.BASSbjForStudent AS yn WHERE yn.StudentID = orders.StudentID AND yn.SubjectID =5 AND yn.IsReapted=1) <> 0 THEN 1 ELSE 0 END IsSX,CASE WHEN (SELECT COUNT(1) FROM dbo.BASSbjForStudent AS zj WHERE zj.StudentID = orders.StudentID AND zj.SubjectID =1 AND zj.IsReapted=1) <> 0 THEN 1 ELSE 0 END IsZJfrom dbo.BASOrders orders left join dbo.BASPlan plans on plans.PlanID = orders.PlanID left join BASSubject sub on sub.SubjectID = plans.SubjectID left join BASSbjForStudent sbj on sbj.SubjectID=plans.SubjectID and sbj.studentID=Orders.StudentIDleft join dbo.BASStudent stu on stu.StudentID = orders.StudentID LEFT JOIN BASChannel CH ON CH.ChannelID=stu.ChannelIDLEFT JOIN BASChannel PCH ON PCH.ChannelID=CH.ParantIDleft join Sys_User users on users.UserID = orders.CheckedUserID where orders.IsDelete = 0  and orders.OrderSubmitTime is not null and ISNULL(orders.TuiBaoCheckState,0)=0 and Orders.StudentType=0 AND ISNULL(Orders.IsReject,0)=0 ' +@strSql+ ' )Ord where rownum between 0 and 1 '); 

热点排行