见鬼!运行时 "传递给 LEFT 或 SUBSTRING 函数的长度参数无效。 关键字 'FROM' 附近"

3tzjq 2014-06-04 09:31:52
我在SQL查询分析器里粘贴代码执行就没问题,但在前台调用就出现“传递给 LEFT 或 SUBSTRING 函数的长度参数无效。 关键字 'FROM' 附近"的错误。
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'GetForecastCalQueryForSimpleDataArea' AND type = 'P')
DROP PROCEDURE GetForecastCalQueryForSimpleDataArea
GO

CREATE PROCEDURE GetForecastCalQueryForSimpleDataArea
(
@ForecastId varchar(25), --Forecast运算编号
@PartNumberCustomer varchar(50) --客户料号
)
AS
IF (dbo.IsOverdue() = 1) Return -1;

DECLARE @sql varchar(5000);
DECLARE @area varchar(100);
SELECT @sql = '
WITH t AS
(
SELECT
a.ForecastId,
a.CustomerId,
a.PartNumberCustomer,
a.PartNumberTRIT,
a.BOM,
dbo.GetSubProducts(a.BOM) AS ChildProducts,
dbo.GetSubProductBOMs(a.BOM) AS ChildBOMs,
b.[Text],
SUM(ISNULL(a.QtyCurrent,0)) as QtyCurrent
FROM ForecastData a
INNER JOIN ForecastDataArea b ON a.ForecastId = b.ForecastId AND a.BeginDate = b.BeginDate AND a.PartNumberCustomer = ' + char(39) + @PartNumberCustomer + char(39) +
' WHERE b.ForecastId = ' + char(39) + @ForecastId + char(39) +
' GROUP BY
a.ForecastId,
a.CustomerId,
a.PartNumberCustomer,
a.PartNumberTRIT,
a.BOM,
b.[Text]
)
SELECT
[ForecastId],
[CustomerId],
[PartNumberCustomer],
[PartNumberTRIT],
[BOM],
[ChildProducts],
[ChildBOMs],';
SELECT @area = '';
SELECT @area = @area + '['+ [Text] + '],' FROM dbo.ForecastDataArea Where ForecastId = @ForecastId;
DECLARE @LEN int;
SELECT @LEN =LEN(ISNULL(@area,''));
IF(@LEN > 1) SELECT @area = LEFT(@area,@LEN - 1);
SELECT @sql = @sql + @area + ' FROM t PIVOT(SUM([QtyCurrent]) FOR [Text] IN(' + @area + ')) as pvt';

--Execute WriteSystemHistory @sql
EXEC (@sql);

Return @@RowCount;
GO





下面是在前台执行的代码:
public const string PROC_NAME_GetForecastCalQueryForSimpleDataArea = "GetForecastCalQueryForSimpleDataArea";
public static System.Data.SqlClient.SqlCommand CreateForecastCalQueryForSimpleDataAreaCommand(string forecastId, string partNumberCustomer)
{
System.Data.SqlClient.SqlCommand cmd = SqlHelper.DataCommandProvider.CreateCommand(PROC_NAME_GetForecastCalQueryForSimpleDataArea, CommandType.StoredProcedure);
cmd.Parameters.Add("@" + ForecastCalOptions.Col_ForecastId, SqlDbType.VarChar, 25).Value = forecastId;
cmd.Parameters.Add("@" + ForecastCalOptions.Col_PartNumberCustomer, SqlDbType.VarChar, 50).Value = partNumberCustomer;

return cmd;
}
...
SqlCommand cmd = ForecastCalUtils.CreateForecastCalQueryForSimpleDataAreaCommand(forecastId, partNumberCustomer);
SqlDataAdapter sda = new SqlDataAdapter(cmd);

DataTable dt = new DataTable("ForecastData");
dt.BeginLoadData();
sda.Fill(dt); //出错
sda.FillSchema(dt, SchemaType.Mapped);
dt.EndLoadData();


怎么回事呢?
...全文
573 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
3tzjq 2014-06-06
  • 打赏
  • 举报
回复
已经找到原因,是前台定义引起的。
3tzjq 2014-06-06
  • 打赏
  • 举报
回复
引用 4 楼 xxzxwsx 的回复:
楼主程序有漏洞: 当 @LEN > 1 时,没有问题。否则,拼出的 sql 语句有语法错误。
嗯,是的。但出现这种情况的机率为0,因为前台限止死的,@area至少会有1个字段。
唐诗三百首 2014-06-04
  • 打赏
  • 举报
回复
建议用SQL Profiler工具跟踪出具体执行的TSQL语句为何. 然后手工执行一下,就知道详细的错误位置了.
Stone19840824 2014-06-04
  • 打赏
  • 举报
回复
这个你在数据库里面执行是成功的 但是在前台调用就失败了 估计是传值什么的出问题了 LZ还是一步步的仔细跟跟代码吧
3tzjq 2014-06-04
  • 打赏
  • 举报
回复
引用 1 楼 fredrickhu 的回复:
DECLARE @area varchar(100);修改为 DECLARE @area varchar(Max);试试 当然你在数据库端调用没问题的话 就应该是你程序调用的问题了。
没理由啊!@area 只得出了不到15个字符的长度。
--小F-- 2014-06-04
  • 打赏
  • 举报
回复
DECLARE @area varchar(100);修改为 DECLARE @area varchar(Max);试试 当然你在数据库端调用没问题的话 就应该是你程序调用的问题了。
在路上_- 2014-06-04
  • 打赏
  • 举报
回复
楼主程序有漏洞: 当 @LEN > 1 时,没有问题。否则,拼出的 sql 语句有语法错误。
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。

22,296

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧