Sql server 传递给子字符串函数的长度参数无效

Sql server 传递给子字符串函数的长度参数无效,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,对SQL和事务有点磨合。。。希望你们中的一些人能对这个问题有所帮助。(甚至可能修复我的html!这个网站支持不同语言的格式吗?Perl、SQL、Java?)这个服务器运行在SQLServer2005上,最近从SQLServer2000升级。我会全天关注这篇文章。干杯 ALTER PROCEDURE [dbo].[sp_AddRequest] -- Add the parameters for the stored procedure here @Message TEXT,

对SQL和事务有点磨合。。。希望你们中的一些人能对这个问题有所帮助。(甚至可能修复我的html!这个网站支持不同语言的格式吗?Perl、SQL、Java?)这个服务器运行在SQLServer2005上,最近从SQLServer2000升级。我会全天关注这篇文章。干杯

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

您好,

您在这里缺少一个结束语(在WEBAPP之后):

(我在清单中修复了它),但我找不到任何子字符串的引用。。。。。。。。到底是什么问题


Marc

您的子字符串必须位于函数之一,例如fnGetValue或fnGetFirstChild

假设是,您可以通过将负数传递给length参数来生成相同的错误。传递NULL或'bob'或20亿或float:它要么有效,要么给出不同的错误

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

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

另一点:不要使用@标识。曾经使用SCOPE_IDENTITY()。

我在这里看不到任何
子字符串
函数。另一个问题-不要在存储过程前面加上“sp”:来自2005年在线丛书(类似于2000年):“我们建议您不要使用sp_uu作为前缀创建任何存储过程。SQL Server使用sp_uu前缀指定系统存储过程。您选择的名称可能与将来的某些系统过程冲突。如果应用程序使用非模式限定名称引用,并且您自己的过程名称与系统过程名称冲突,则应用程序将中断,因为该名称绑定到系统过程,而不是您自己的过程。”
SELECT SUBSTRING ('ffggg', 1, -1)

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