2016-10-14 62 views
1

Я попытаюсь объяснить проблему в деталях. Я написал SP и успешно выполнил его. Вот оно:Ошибка выполнения хранимой процедуры SQL Server 2008

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[InvoiceReference] 

@StartDate DateTime = NULL, 
@EndDate DateTime = NULL, 
@DocumentType nvarchar(50) = NULL, 
@Partners nvarchar(MAX) = NULL, 
@PriceFrom numeric(19,6) = NULL, 
@PriceTo numeric(19,6) = NULL, 
@VATFrom numeric(19,6) = NULL, 
@VATTo numeric(19,6) = NULL, 

@PageNumber INT, 
@PageSize INT 

AS 
BEGIN SET NOCOUNT ON; 

    DECLARE @StartPage as int 
    DECLARE @EndPage as int 

    SET @StartPage = ((@PageNumber-1) * @PageSize) + 1; 
    SET @EndPage = @StartPage + (@PageSize) - 1; 


    WITH ResultSet As (select 

    ROW_NUMBER() OVER (order by d.DocumentID) AS 'RowNumber', 
    d.DocNumber, dt.Name as DocumentTypesName, d.Date, p.Name as PartnersName, dd.SalePrice, dd.VAT, (dd.SalePrice + dd.VAT) as TotalSum 

    from [dbo].[Documents] d join [dbo].[DocumentTypes] dt on d.TypeID = dt.TypeID 
          join [dbo].[Partners] p on d.PartnerID = p.PartnerID 
          join [dbo].[DocumentDetails] dd on d.DocumentID = dd.DocumentID 


    where ((@StartDate is null) or (d.Date >= @StartDate)) 
    and ((@EndDate is null) or (d.Date <= @EndDate)) 
    and ((@DocumentType is null) or (dt.Name = @DocumentType)) 
    --and ((@Partners is null) or (p.Name = @Partners)) 
    and ((@Partners is null) or (p.Name in (select * from dbo.fnSplitString(@Partners, ',')))) 
    and ((@PriceFrom is null) or (dd.SalePrice >= @PriceFrom)) 
    and ((@PriceTo is null) or (dd.SalePrice <= @PriceTo)) 
    and ((@VATFrom is null) or (dd.VAT >= @VATFrom)) 
    and ((@VATTo is null) or (dd.VAT <= @VATTo)) 

    ) 

    Select * from ResultSet rs WHERE RowNumber between @StartPage and @EndPage 

    ORDER BY rs.Date ASC 

END 

Но тогда я обнаружил, что я должен был сделать фильтр более чем один «Партнер» (например: Partner1, партнер 2, ...). Затем я написал функцию, которая разделила параметр SP @Partners в отдельных строках. Но когда я прокомментировал старую часть в предложении «где» и поместил новую (вызвав функцию, которую я написал), он дал мне это сообщение об ошибке: «Не удается разрешить конфликт сортировки между« Cyrillic_General_CI_AS »и« Cyrillic_General_CS_AS »в равном операция «. когда я пытался выполнить SP. И ошибка находится в строке 26, которая равна: SET @StartPage = ((@ PageNumber-1) * @PageSize) + 1; и я ничего там не изменил. Я прочитал некоторые matirials, которые я нашел здесь о сортировке, но я все еще не могу понять проблему самостоятельно. Функция, которую я написал:

ALTER FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(200) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

Любая помощь будет оценена по достоинству.

+0

Вы можете разместить свой последний попытался SP –

+0

я отправил это, единственная разница с первоначальной SP является комментировал часть в предложении WHERE. – ppetyr

ответ

0

Перед сопоставлением результата ИЛИ перед заявлением IN вы должны установить сопоставление по умолчанию.

попробовать свои, где состояние, как показано ниже:

and ((@Partners is null) or (p.Name COLLATE DATABASE_DEFAULT in (select * from dbo.fnSplitString(@Partners, ',')))) 

ИЛИ

Set datatype to NVARCHAR of related column 
+0

Я попробую ваше первое предложение, но мне нужно подождать, пока я получу права, чтобы узнать, что такое настройка базы данных по умолчанию, потому что теперь я не могу. Это может занять час или больше, я напишу вам, если это поможет. – ppetyr

+0

Спасибо за помощь, я попробовал ваше первое предложение, и мой SP успешно выполнен – ppetyr

Смежные вопросы