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.
können Sie Ihre neuesten versucht SP Post –
ich es geschrieben, der einzige Unterschied mit dem Anfangs SP ist die kommentierte Teil in der WHERE-Klausel. – ppetyr