2017-04-25 37 views
1

我已经创建了一个存储过程,该过程应根据所采取的操作返回字符串值。查询是所有工作正常,除了我得到@return_value(“将varchar值转换为int)的错误...我试着铸造两个值与查询,但它不工作...从存储过程返回字符串值不起作用

错误我收到:

Conversion failed when converting the varchar value 'Request ID: 454 captured on 2017-04-25 10:16:07' to data type int. 

这是我做什么我的SQL代码:

USE [VehicleManagement] 

    GO 
    /****** Object: StoredProcedure [dbo].[spSaveContractsCaptured]  
    Script Date: 2017/04/23 8:56:10 AM ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER PROCEDURE [dbo].[sp_SaveContractsCaptured] 
    @VehicleServiceRequestID int, 
    @InvoiceNo nvarchar(50), 
    @Amount decimal(18, 2), 
    @OdometerReading float, 
    @ExpiryDate datetime, 
    @ServiceDate datetime, 
    @CapturedBy nvarchar(50), 
    @CapturedDate datetime, 
    @ContractStartDate datetime, 
    @PeriodExpiry nvarchar(50), 
    @returnVal nvarchar(255) output 

    AS 
    BEGIN 
    SET NOCOUNT ON 

    IF NOT EXISTS (SELECT ID FROM [VehicleManagement].[dbo].[VehicleService_Captured] 
    WHERE VehicleServiceRequestID = @VehicleServiceRequestID) 
    BEGIN 
     INSERT INTO [VehicleService_Captured] (VehicleServiceRequestID, InvoiceNo, 
     Amount, OdometerReading, ExpiryDate, ServiceDate, CapturedBy, CapturedDate, ContractStartDate, PeriodExpiry) 
     VALUES (@VehicleServiceRequestID, @InvoiceNo, @Amount, @OdometerReading, @ExpiryDate, @ServiceDate, 
     @CapturedBy, @CapturedDate, @ContractStartDate, @PeriodExpiry) 

     set @returnVal = SCOPE_IDENTITY() 
     RETURN CAST(@returnVal AS VARCHAR(255)) 
    end 
else 
    SET @returnVal = (SELECT 'Request ID: ' + convert(varchar,ID) + ' captured on ' + convert(varchar,[CapturedDate],120) FROM [VehicleManagement].[dbo].[VehicleService_Captured] 
    WHERE VehicleServiceRequestID = @VehicleServiceRequestID) 

    RETURN CAST(@returnVal AS nvarchar(255)) 
END 

有我丢失的东西或我在做什么错

+4

这可以帮助您http://stackoverflow.com/questions/6450194/how-to-return-string-value-from-the-stored-procedure – TriV

回答

2

由于TRIV指出一世n个正确的方向,你应该只设置的输出变量的值,并移除RETURN

USE [VehicleManagement] 

    GO 
    /****** Object: StoredProcedure [dbo].[spSaveContractsCaptured]  
    Script Date: 2017/04/23 8:56:10 AM ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER PROCEDURE [dbo].[sp_SaveContractsCaptured] 
    @VehicleServiceRequestID int, 
    @InvoiceNo nvarchar(50), 
    @Amount decimal(18, 2), 
    @OdometerReading float, 
    @ExpiryDate datetime, 
    @ServiceDate datetime, 
    @CapturedBy nvarchar(50), 
    @CapturedDate datetime, 
    @ContractStartDate datetime, 
    @PeriodExpiry nvarchar(50), 
    @returnVal nvarchar(255) output 

    AS 
    BEGIN 
    SET NOCOUNT ON 

    IF NOT EXISTS (SELECT ID FROM [VehicleManagement].[dbo].[VehicleService_Captured] 
    WHERE VehicleServiceRequestID = @VehicleServiceRequestID) 
    BEGIN 
     INSERT INTO [VehicleService_Captured] (VehicleServiceRequestID, InvoiceNo, 
     Amount, OdometerReading, ExpiryDate, ServiceDate, CapturedBy, CapturedDate, ContractStartDate, PeriodExpiry) 
     VALUES (@VehicleServiceRequestID, @InvoiceNo, @Amount, @OdometerReading, @ExpiryDate, @ServiceDate, 
     @CapturedBy, @CapturedDate, @ContractStartDate, @PeriodExpiry) 

     set @returnVal = SCOPE_IDENTITY() 
    END 
ELSE 
    SET @returnVal = (SELECT 'Request ID: ' + convert(varchar,ID) + ' captured on ' + convert(varchar,[CapturedDate],120) FROM [VehicleManagement].[dbo].[VehicleService_Captured] 
    WHERE VehicleServiceRequestID = @VehicleServiceRequestID) 

END 

当你骂你的程序应该声明一个变量,并以“”这样使用它:

declare @message nvarchar(255) 
exec [dbo].[sp_SaveContractsCaptured] //list parameteres, @returnval = @message out 

另外请确保255是足够您的消息。 希望它有帮助,欢呼!