2016-10-14 2 views
1

Ich werde versuchen, das Problem im Detail zu erklären. Ich habe einen SP geschrieben und es erfolgreich ausgeführt. Hier ist sie:SQL Server 2008 Stored Procedure Ausführungsproblem

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 

Aber dann fand ich, dass ich einen Filter machen musste um mehr als ein „Partner“ (zum Beispiel: Partner1, Partner2, ...). Dann habe ich eine Funktion geschrieben, die den SP-Parameter @Partners in separate Strings aufteilte. Aber als ich den alten Teil in der "where" -Klausel kommentierte und den neuen eingab (indem ich die Funktion iwtrote anrief), gab es mir folgende Fehlermeldung: "Kann den Kollationskonflikt zwischen" Cyrillic_General_CI_AS "und" Cyrillic_General_CS_AS "nicht lösen Betrieb." wenn ich versuchte, den SP auszuführen. Und der Fehler ist in Zeile 26, nämlich: SET @StartPage = ((@ PageNumber-1) * @PageSize) + 1; und ich habe dort nichts geändert. Ich lese einige Materialien, die ich hier über Kollation gefunden habe, aber ich kann immer noch nicht das Problem für mich selbst herausfinden. Die Funktion, die ich schrieb, ist:

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 

Jede Hilfe wird geschätzt.

+0

können Sie Ihre neuesten versucht SP Post –

+0

ich es geschrieben, der einzige Unterschied mit dem Anfangs SP ist die kommentierte Teil in der WHERE-Klausel. – ppetyr

Antwort

0

Sie müssen die Standardsortierung festlegen, bevor Sie das Ergebnis ODER vor der IN-Anweisung vergleichen.

Ihr versuchen, in dem die Bedingung wie folgt:

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

ODER

Set datatype to NVARCHAR of related column 
+0

Ich werde Ihren ersten Vorschlag versuchen, aber ich muss warten, bis ich die Rechte bekomme, um zu sehen, was Standard-Kollatierung der Datenbank ist, weil ich jetzt nicht kann. Dies kann eine Stunde oder länger dauern, ich werde Ihnen schreiben, wenn es hilft. – ppetyr

+0

Danke für die Hilfe, ich habe deinen ersten Vorschlag ausprobiert und mein SP erfolgreich ausgeführt – ppetyr

Verwandte Themen