Получение "Неверный синтаксис вблизи исключения" cR "при выполнении динамического SQL - PullRequest
0 голосов
/ 21 марта 2019

Приведенный ниже запрос пытается получить количество данных, доступных для драйвера, где я получаю исключение при вызове из решения 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  

1 Ответ

0 голосов
/ 21 марта 2019

Ваша переменная @sql слишком мала.Измените свою декларацию на

DECLARE @sql NVARCHAR(4000)

, и все будет хорошо.Вы также можете попробовать удалить форматирование пробелами в выражении, чтобы оно выглядело следующим образом:

    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 '

Но в этом случае SQL-код все еще слишком длинный для 512-символьной переменной.Он обрывается до того, как я нажимаю на оператор FROM, примерно на D.cLicenseClass, D.sdLicIssue, D.sdLicExpire,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...