下面的查询试图获取驱动程序datable的数量,从c#解决方案调用时在此获取异常。
ALTER PROCEDURE [dbo].[USP_AtmosPurge_PersonalInfoPurgeCount]
(@cPurgeQueue VARCHAR,
@dStartDate VARCHAR,
@dEndDate VARCHAR,
@iClientID VARCHAR,
@TableName VARCHAR)
AS
BEGIN
DECLARE @sql NVARCHAR(512)
SET @sql = N'SELECT COUNT(1)
FROM
(SELECT
RANK() OVER(PARTITION BY D.cCitationNumber ORDER BY L.iPurgeLogId DESC) AS ROWNUM,
D.cCitationNumber,
D.vcFirstName, D.vcMiddleName, D.vcLastName,
D.vcNameSuffix, D.vcAddress1, D.vcAddress2,
D.vcCity, D.vcStateOrProvince, D.vcZipOrPostalCode,
D.cDriverLicenseNo, D.vcDriverLicenseState, D.vcTelephoneNo,
D.sdDateOfBirth, D.cGender, D.cEyeColor, D.cHairColor,
D.cWeight, D.cHeight, D.cRace, D.tNoOfPriorViolations,
D.cLicenseClass, D.sdLicIssue, D.sdLicExpire, D.iCountyID,
L.iPurgeLogId
FROM ' + QuoteName(@TableName) + ' D (NOLOCK)
INNER JOIN tblPurgeLog L (NOLOCK) ON L.cCitationNumber = D.cCitationNumber
WHERE L.dViolationDate BETWEEN ' + QuoteName(@dStartDate) + 'AND ' + QuoteName(@dEndDate) + '
AND L.iclientid ='+ QuoteName(@iClientID) +'
AND LTRIM(RTRIM(vcPurgeQueue)) = LTRIM(RTRIM(' + QuoteName(@cPurgeQueue) + ')) ) AS D
WHERE ROWNUM = 1 '
EXECUTE (@sql)
END
答案 0 :(得分:0)
您的@sql变量太小。将声明更改为
open System
open System.Diagnostics
open FSharp.Reflection
open MethodBoundaryAspect.Fody.Attributes
[<AllowNullLiteral>]
[<AttributeUsage(AttributeTargets.Method ||| AttributeTargets.Property, AllowMultiple = false)>]
type TraceAttribute () =
inherit OnMethodBoundaryAspect()
let traceEvent (args: MethodExecutionArgs) (timestamp: int64) =
// Capture metrics here
()
override __.OnEntry (args) =
Stopwatch.GetTimestamp() |> traceEvent args
override __.OnExit (args) =
let exit () = Stopwatch.GetTimestamp() |> traceEvent args
match args.ReturnValue with
| :? System.Threading.Tasks.Task as task ->
task.ContinueWith(fun _ -> exit()) |> ignore
| other -> // Here's where I could use some help
let clrType = other.GetType()
if clrType.IsGenericType && clrType.GetGenericTypeDefinition() = typedefof<Async<_>> then
// If the return type is an F# Async, replace it with a new Async that calls exit after the original return value is computed
let returnType = clrType.GetGenericArguments().[0]
let functionType = FSharpType.MakeFunctionType(returnType, typedefof<Async<_>>.MakeGenericType([| returnType |]))
let f = FSharpValue.MakeFunction(functionType, (fun _ -> exit(); other))
let result = typeof<AsyncBuilder>.GetMethod("Bind").MakeGenericMethod([|returnType; returnType|]).Invoke(async, [|other; f|])
args.ReturnValue <- result
else
exit()
,你会很好。您也可以尝试删除语句中空格的格式,如下所示:
DECLARE @sql NVARCHAR(4000)
但是在这种情况下,对于512个字符的变量,SQL仍然太长。在我点击FROM语句之前,它大约在 SET @sql = N'SELECT COUNT(1)
FROM
(SELECT
RANK() OVER(PARTITION BY D.cCitationNumber ORDER BY L.iPurgeLogId DESC) AS ROWNUM,
D.cCitationNumber,
D.vcFirstName, D.vcMiddleName, D.vcLastName,
D.vcNameSuffix, D.vcAddress1, D.vcAddress2,
D.vcCity, D.vcStateOrProvince, D.vcZipOrPostalCode,
D.cDriverLicenseNo, D.vcDriverLicenseState, D.vcTelephoneNo,
D.sdDateOfBirth, D.cGender, D.cEyeColor, D.cHairColor,
D.cWeight, D.cHeight, D.cRace, D.tNoOfPriorViolations,
D.cLicenseClass, D.sdLicIssue, D.sdLicExpire, D.iCountyID,
L.iPurgeLogId
FROM ' + QuoteName(@TableName) + ' D (NOLOCK)
INNER JOIN tblPurgeLog L (NOLOCK) ON L.cCitationNumber = D.cCitationNumber
WHERE L.dViolationDate BETWEEN ' + QuoteName(@dStartDate) + 'AND ' + QuoteName(@dEndDate) + '
AND L.iclientid ='+ QuoteName(@iClientID) +'
AND LTRIM(RTRIM(vcPurgeQueue)) = LTRIM(RTRIM(' + QuoteName(@cPurgeQueue) + ')) ) AS D
WHERE ROWNUM = 1 '