2016-10-14 57 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 

但后来我发现,我不得不做出一个过滤器不止一个“合作伙伴”(例如:合作伙伴1,合作伙伴2,...)。然后我写了一个函数,它将SP参数@Partners分割成不同的字符串。但是当我在“where”子句中注释了旧部分并提出新部分(调用函数wtrote)时,它给了我这个错误消息:“无法解决”Cyrillic_General_CI_AS“和”Cyrillic_General_CS_AS“之间的排序冲突等于操作“。当我试图执行SP。并且错误在第26行,即: SET @StPagePage =((@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语句前的结果OR之前设置默认排序规则。

试试你的WHERE条件如下:

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

OR

Set datatype to NVARCHAR of related column 
+0

我会尝试你的第一个建议,但我必须等到我有权查看什么是数据库默认排序规则,因为我现在不能。这可能需要一个小时或更多,如果有帮助,我会写信给你。 – ppetyr

+0

感谢您的帮助,我尝试了您的第一个建议,我的SP成功执行 – ppetyr