【问题标题】:Error converting data type varchar to int error in stored procedure在存储过程中将数据类型 varchar 转换为 int 错误
【发布时间】:2016-08-07 04:40:59
【问题描述】:

我的存储过程是

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Customer_Registrations]
    @type varchar(50) = null,
    @Customer_ID int = null,
    @Customer_Name varchar(50) = null,
    @Email varchar(50) = null,
    @Password varchar(50) = null,
    @Mobile varchar(50) = null
AS
BEGIN
    SET NOCOUNT ON;

    IF @type = 'select'
    BEGIN
        SELECT * 
        FROM ssshub..Customer_Master
    END 

    IF @type = 'specific'
    BEGIN
        SELECT * 
        FROM ssshub..Customer_Master 
        WHERE Customer_ID = @Customer_ID
    END

    IF @type = 'insert'
    BEGIN
        INSERT INTO [dbo].[Customer_Master]([Customer_Name], [Email],[Password], [Mobile], [SDate])
        VALUES ('@Customer_Name', '@Email', '@Password', '@Mobile', CURRENT_TIMESTAMP)
    END
END

还有我的桌子

一切正常

这个查询工作正常,但是当我尝试使用存储过程插入它时,它会引发错误。

我对@9​​87654323@ 有一个identity 规范,因此无需插入它

INSERT INTO [dbo].[Customer_Master] ([Customer_Name], [Email], [Password], [Mobile], [SDate])
VALUES('ewcewc', 'dewdw@dwc.com', 'dewdwd', '9999999999', CURRENT_TIMESTAMP)

现在当我尝试使用以下语句执行我的存储过程时

 exec customer_registrations 'insert', 'dsad', 'test@test.com', 'pass', '9999900000'

我明白了:

将数据类型 varchar 转换为 int 时出错

【问题讨论】:

  • 问题出在 Customer_name 列

标签: sql sql-server stored-procedures


【解决方案1】:

参数排列你的参数

'insert'          -> @type varchar(50)
'dsad'            -> @Customer_ID int    
'test@test.com'   -> @Customer_Name varchar(50)
'pass'            -> @Email varchar(50)
'9999900000'      -> @Password varchar(50)
                  -> @Mobile varchar(50) = null

...您可以看到'dsad' 无法被理解为int。也许其他地方也有问题,但至少,存储过程没有被正确调用。

更新

如果您的意图是省略在特定情况下不相关的 一些 参数,则必须使用命名参数;否则,参数只能按照参数出现的顺序应用:

exec customer_registrations 
  'insert', 
  @Customer_Name = 'dsad', 
  @Email         = 'test@test.com', 
  @Password      = 'pass', 
  @Mobile        = '9999900000';

【讨论】:

  • 在您的插入查询中,您没有按其工作方式指定“Customer_ID”。据我所知,您不能将 nvarchar 值传递给 int 类型的过程。看到您将“dsad”作为字符串传递,其中过程中该位置的参数具有 int 数据类型
  • 在存储过程中,即使我没有指定 customer_id
  • @DhavalBulsara,这不相关。存储过程调用中的参数简单地分配给存储过程的参数,然后在插入语句中使用这些参数。一个与另一个无关。如果您尝试跳过某些参数,SQL Server 将不知道您指的是哪些参数,除非您使用命名参数语法(稍后添加)
  • @Jacob 也有效!
【解决方案2】:

当您在表中插入数据时,请在过程中传递空值。在表中插入数据时运行以下过程。你应该让我管理程序的所有参数。你没有传递Customer_ID的值,所以会发生错误。

EXEC [dbo].[Customer_Registrations] 'insert',null,'ewcewc', 'dewdw@dwc.com', 'dewdwd', '9999999999'

【讨论】:

    【解决方案3】:
    Create Database Test
    
    Create Table Employee
    (
    EmpId int identity(1,1) not null primary Key,
    EmpName varchar(50),
    Address varchar(50),
    MobileNo int
    )
    
    Select * From [dbo].[Employee]
    
    Alter Table [dbo].[Employee] Alter Column MobileNo Bigint
    
    Insert into [dbo].[Employee] values('Harsh Kumar','Banglore','9748342075')
    
    Create Proc MyProc
    As
    Select * From [dbo].[Employee]
    
    EXEC MyProc
    
    Create Proc SP_GetEmp
    @EmpId int,
    @EmpName varchar(50),
    @Address varchar(50),
    @MobileNo int
    As
    Insert into [dbo].[Employee](EmpId, EmpName, Address, MobileNo) Values(@EmpId, @EmpName, @Address, @MobileNo)
    
    EXEC SP_GetEmp 'Rahul Kr','Pune', 8250707544
    
    EXEC MyProc
    
    Error:- Error converting data type varchar to int.
    

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2014-10-04
      • 2023-03-04
      • 2020-06-17
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多