以下のメソッド呼び出しは、「varchar データ型から datetime データ型への変換により、範囲外の値が発生しました。」というメッセージが表示されて失敗します。
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 edition) でクエリを実行しても、エラーは発生しません。選択から TOP を削除して SSMS で実行しても、エラーは発生しません (予想どおり、12,000 件以上のレコードが返されます)。
1000 行を超える結果セットを正常に取得するには、上記の実装の代わりに何をすべきですか? この場合、ストアド プロシージャの方が適切でしょうか?