2009-07-21 3 views
0

Ein bisschen in SQL und Transactions ... in der Hoffnung, dass einige von Ihnen das Problem beleuchten können. (und vielleicht sogar reparieren meine Schraube HTML! Unterstützt diese Seite Formatierung für verschiedene Sprachen? Perl, SQL, Java?) Dieser Server läuft auf SQL Server 2005 und wurde vor kurzem von SQL Server 2000 aktualisiert. Ich werde ein Auge auf diese Post den ganzen Tag. ProstUngültiger Längenparameter an SUBSTRING-Funktion übergeben

ALTER PROCEDURE [dbo].[sp_AddRequest] 
    -- Add the parameters for the stored procedure here 
    @Message TEXT, 
    @RequestId VARCHAR(20), 
    @StatusCode CHAR(1), 
    @StatusText VARCHAR(255), 
    @AddedDate DATETIME, 
    @MessageTimestamp DATETIME 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Direction is incoming (i.e. Client -> WEBAPP) 
    DECLARE @Direction VARCHAR(50) 
    SET @Direction = 'Client -> WEBAPP' 

    -- Type is derived from: 
    -- a) MessageType Element value OR 
    -- b) Data Element first child OR 
    -- c) Root Element name 
    DECLARE @Type VARCHAR(50) 
    SELECT @Type = dbo.fnGetValue('MessageType', @Message) 
    IF @Type IS NULL SELECT @Type = dbo.fnGetFirstChild('Data', @Message) 
    IF @Type IS NULL SELECT @Type = dbo.fnGetFirstChild(NULL, @Message) 

    -- MessageStatus is retrieved from the lookup table 
    DECLARE @Status VARCHAR(50) 
    SELECT @Status = Description FROM MessageStatus WHERE MessageStatusCode = @StatusCode 

    -- Examine the Message root element 
    IF dbo.fnGetFirstChild(NULL, @Message) = 'RequestMessage' 
    BEGIN 
     -- Insert values into the Transaction table 
     INSERT INTO tblTransaction (RequestID, Direction, [Type], Status, StatusText, Sent, Received, Body) 
     VALUES (@RequestId, @Direction, @Type, @Status, @StatusText, @MessageTimestamp, @AddedDate, @Message) 
     RETURN @@IDENTITY 
    END 
    ELSE 
    BEGIN 
     -- Transaction is linked using the RequestId 
     DECLARE @TransactionID INT 
     SELECT @TransactionID = dbo.fnFindTransaction(@RequestId) 

     -- Insert values into the RelatedMessage table 
     INSERT INTO tblRelatedMessage (TransactionID, RequestID, Direction, [Type], Status, StatusText, Sent, Received, Body) 
     VALUES (@TransactionID, @RequestId, @Direction, @Type, @Status, @StatusText, @MessageTimestamp, @AddedDate, @Message) 
     RETURN @@IDENTITY 
    END 
END 

Grüße,

+0

Ich sehe hier keine 'SUBSTRING'-Funktion. – Quassnoi

Antwort

0

Sie haben ein fehlendes Ende Zitat hier (nach WEBAPP):

SET @Direction = 'Client -> WEBAPP' 

(die ich in der Auflistung festgelegt), aber ich konnte jeden Hinweis nicht finden ein SUBSTRING ..... was ist das Problem, wirklich?

Marc

1

Ihre Teilzeichenfolge in sein müssen die Funktionen zB fnGetValue oder fnGetFirstChild

Angenommen, es ist, können Sie den gleichen Fehler erzeugen, indem sie eine negative Zahl auf die Länge Parameter. Passing NULL oder "Bob" oder 2 Milliarden oder float: es funktioniert entweder oder gibt einen anderen Fehler.

SELECT SUBSTRING ('ffggg', 1, -1) 

Msg 536, Level 16, State 1, Line 1 
Invalid length parameter passed to the substring function. 

Ein weiterer Punkt: Verwenden Sie nicht @@ IDENTITY. Je. Verwenden Sie SCOPE_IDENTITY().

+1

Ein weiterer Haken - Präfix Ihrer gespeicherten Prozeduren nicht mit 'sp_': aus der Onlinedokumentation für 2005 (gilt auch für 2000): "Es wird empfohlen, keine gespeicherten Prozeduren mit sp_ als Präfix zu erstellen. SQL Server verwendet sp_ Präfix zur Bezeichnung gespeicherter Systemprozeduren Der von Ihnen gewählte Name kann mit einer zukünftigen Systemprozedur kollidieren Wenn Ihre Anwendung nicht-schemafähige Namensreferenzen verwendet und Ihr eigener Prozedurname mit einem Systemprozedurnamen kollidiert, wird Ihre Anwendung unterbrochen, da der Name an das System bindet Verfahren, nicht dein eigenes. " –

Verwandte Themen