下面的方法調用失敗,並顯示消息「將varchar數據類型轉換爲日期時間數據類型導致超出範圍值「。:當查詢結果有超過1000條記錄時,由Dapper拋出的System.Data.SqlClient.SqlException
public IEnumerable<SomeResult> GetResults(SqlConnection connection, string attribute)
{
var sql = string.Format(@"
SELECT TOP 2000
r.Id
,r.LastName
,r.FirstName
,r.Ssn
,r.CurrentId
,BeginDate = case when isdate(rli.BeginDate) = 1 then convert(datetime, rli.BeginDate) else NULL end
,EndDate = case when isdate(rli.EndDate) = 1 then convert(datetime, rli.EndDate) else NULL end
,rli.LcknTyCd
,rli.ProvId
FROM
[dbo].[Span] rli
INNER JOIN [dbo].Recipient r
ON rli.SysId = r.SysId
INNER JOIN [dbo].ValidRecipient lc
ON r.SysId = lc.SysId
WHERE
BeginDate <= GETDATE()
AND EndDate >= GETDATE()
AND rli.LcknTyCd = @LcknTyCd);
return connection.Query<SomeResult>(sql, new { LcknTyCd = attribute}).ToList();
}
public struct SomeResult
{
public string Id{ get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Ssn { get; set; }
public string CurrentId{ get; set; }
public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; }
public string LcknTyCd{ get; set; }
public string ProvId{ get; set; }
}
如果結果集包含1000個(或更少)記錄,則代碼將正常工作。當我在SQL Server Management Studio(2014版)中執行查詢時,我也不會收到錯誤。即使我從選擇中刪除TOP並在SSMS中執行它,也不會發生錯誤(如預期的那樣返回了12,000多條記錄)。
我應該做些什麼而不是上面的實現來成功檢索超過1000行的結果集?在這種情況下,存儲過程會更合適嗎?
BeginDate和EndDate的數據類型是什麼?它包含什麼格式的數據?也沒有一個訂單,不保證你會得到2000行。 – 2015-03-24 21:49:43
我嚴重懷疑這與Dapper有什麼關係。這個例外是完全無關的。 – mxmissile 2015-03-24 21:51:59
我已經更新了我的問題,以反映我已經在SQL Server Management Studio中嘗試過所有這些查詢的變體,並且所有工作都正常。 BeginDate和EndDate(不幸的是我)varchar(8)。我會嘗試添加一個ORDER BY子句來查看/如何改變我的結果。 – 2015-03-25 11:11:21