令人困惑的“传递给LEFT或SUBSTRING函数的长度参数无效”

时间:2013-12-19 08:56:27

标签: tsql exception sql-server-2008-r2

我有一个非常简单的查询,如下:

SELECT * FROM production.LINE_JOB_QUEUE WHERE L_ROWID = 33 ORDER BY SEQNO

当我尝试使用ADO.NET运行它时,出现以下错误:

System.Data.SqlClient.SqlException (0x80131904): Invalid length parameter passed to the LEFT or SUBSTRING function.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.HasMoreRows()
   at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout)
   at System.Data.SqlClient.SqlDataReader.Read()
   at System.Data.Common.DataAdapter.FillLoadDataRow(SchemaMapping mapping)
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.Common.LoadAdapter.FillFromReader(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
   at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption)
   at Temporal.DBO.Definitions.DBBroker`3.ExecuteDT(String SQL, Int32 TimeoutSeconds) in C:\Users\Aaron\Documents\Development\Framework v.4\Temporal Libraries\Temporal.DBO\Definitions\DbBroker.vb:line 81

正如您在上面所看到的那样,我的查询既不包含LEFT也不包含SUBSTRING。正在查询的视图(production.LINE_JOB_QUEUE)也不包含它们,并且仅包含表(没有其他视图),并且这些表都没有使用这些函数中的任何一个计算列。

视图的代码如下:

ALTER VIEW [production].[LINE_JOB_QUEUE] AS 
SELECT
   l.ROWID as L_ROWID, l.code, q.rowid Q_ROWID, r.rowid as R_ROWID,
   L.NAME AS QUEUENAME, P.SKU AS ITEMNO, P.NAME AS DESCR,
   Q.lotno, q.orderqty, q.SEQNO,q.ONEOFF,l.IsUp, l.IsLocked,l.IsPortOpen,r.IsHeld,
   case 
     when isnull(q.ACTIVE,0) = 1 then 'ACTIVE'   -- active: 0=inactive; 1=active
     when r.canceldate IS not null then 'CANCELLED'
     when r.enddate IS not null then 'COMPLETED'
     else 'PENDING'
   end as STATUS, q.proddate, qa.itemno as cur_itemno,qa.name as cur_descr,
   isnull(ra.lineisactive,0)lineisactive, isnull(q.ACTIVE,0) q_active,
   r.startdate, r.enddate,
   case  
     when r.startdate is null then null
     else system.udfTimeSpanFromSeconds(DATEDIFF(SECOND, R.STARTDATE, ISNULL(R.ENDDATE, GETDATE()))) 
   end AS ELAPSED   
FROM catalog.PRODUCTS P, production.Queue Q
        left join production.RUN r on q.rowid = r.rowid,   
     production.LINES L  
        left join
          (select q.lineid, q.itemno, p.name 
            from production.queue q, catalog.products p
            where p.sku = q.itemno and q.active = 1 ) QA on qa.lineid = L.rowid   
        left join (select lineid,max( cast(active as integer) ) as lineisactive 
                      from production.RUN group by lineid ) RA on ra.lineid = l.rowid    
where l.rowid = q.lineid and 
      P.SKU = q.ITEMNO

虽然在ADO.NET中运行查询时遇到上述错误,但我可以在SSMS中运行相同的查询,并且每次都运行完全正常,没有例外。

我在网上看到一个帖子,其中有人遇到同样的问题,因为日志文件位置空间不足,释放空间解决了他们的问题。但是在我们的例子中,日志文件位置有133 GB的可用空间,所以这不是问题。但为了彻底,我缩小了数据库和日志。没有帮助。我试过重新启动Sql Server实例,没有运气。我也试过重启服务器,一切都没有运气。

数据库服务器是Sql Server 2008 R2,在Windows Server 2008 SP2计算机上运行。 该应用程序是在Windows Server 2003 R2计算机上的IIS6中运行的.NET 4网站。

任何帮助非常感谢。谢谢!

1 个答案:

答案 0 :(得分:1)

转发评论作为回答:

是udfTimeSpanFromSeconds你定义的一个函数?我怀疑你有SUBSTRING或LEFT,并且它在SSMS中没有失败但是通过你的代码失败的原因是由于发送到查询的日期/时间格式的差异。