Недопустимый параметр длины, переданный в функцию SUBSTRING - PullRequest
0 голосов
/ 21 июля 2009

Немного разберись с SQL и транзакциями ... надеясь, что некоторые из вас смогут пролить свет на проблему. (и, может быть, даже исправить мой испорченный html! Поддерживает ли этот сайт форматирование для разных языков? Perl, SQL, Java?) Этот сервер работает на SQL Server 2005 и совсем недавно был обновлен с SQL Server 2000. Я буду следить за этим пост в течение дня. Приветствия

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

С уважением,

Ответы [ 2 ]

1 голос
/ 21 июля 2009

Ваша подстрока должна быть в одной функции, например, fnGetValue или fnGetFirstChild

Предполагая, что это так, вы можете сгенерировать ту же ошибку, передав отрицательное число параметру длины. Передача NULL или 'bob' или 2 миллиардов или float: он либо работает, либо выдает другую ошибку.

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

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

Еще один момент: не используйте @@ IDENTITY. Когда-либо. Используйте SCOPE_IDENTITY ().

0 голосов
/ 21 июля 2009

Здесь у вас отсутствующая конечная цитата (после WEBAPP):

 SET @Direction = 'Client -> WEBAPP'

(который я исправил в листинге), но я не смог найти никаких ссылок на SUBSTRING ........ в чем проблема, на самом деле?

Марк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...