我有一个非常简单的查询,如下:
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网站。
任何帮助非常感谢。谢谢!
答案 0 :(得分:1)
转发评论作为回答:
是udfTimeSpanFromSeconds你定义的一个函数?我怀疑你有SUBSTRING或LEFT,并且它在SSMS中没有失败但是通过你的代码失败的原因是由于发送到查询的日期/时间格式的差异。