Ошибка SQL при преобразовании VARCHAR в INT, пока в моем коде нет параметра INT - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь написать sp для вставки данных в мою таблицу.В моем sp у меня есть поле tracingno, что большая часть моего реализованного кода связана с этим.но я сталкиваюсь с этой ошибкой:

Преобразование не удалось при преобразовании значения varchar 'SRFCHE-600-R-1000000' в тип данных int.тип tracingno varchar, но я не могу понять, почему я столкнулся с этой ошибкой.

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[spInsertRecieptTracing_tblRecieptTracing]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[spInsertRecieptTracing_tblRecieptTracing]
GO

create procedure spInsertRecieptTracing_tblRecieptTracing (
    @RecieptTracingID UniqueIdentifier,
    @RecieptItemRef UniqueIdentifier,
    @TracingNo varchar(4000),
    @ExecuteID UniqueIdentifier, 
    @Quantity Decimal(25,5),
    @ExpireDateStr varchar(4000),
    @ExpireDate datetime,
    @ManufacturingDateStr varchar(4000),
    @LotNo varchar(4000),
    @IsBarCode Bit,
    @ManufacturingDate DateTime,
    @PartOptionName varchar(1000) = null,
    @partcode varchar (100)
)
with Encryption
as 

declare @_tracingno varchar (1000)
if  exists ( 
    select * 
    from ims.tblsettings where IsPartInTracingno = 1
)
begin
    if exists (
        select top 1 TracingNo 
        from ims.tblRecieptTracing 
        where TracingNo like '%-%')
    begin

    set @_tracingno = (
        select max( right(TracingNo, charindex('-', reverse(TracingNo) + '-') - 1)) 
        from ims.tblRecieptTracing
    )

    end
    else
    begin
        set @_tracingno = 1000000
    end
end
else
begin 
    set @_tracingno=''
end

if(@IsBarCode is null)
    set @IsBarCode =0;

if(@IsBarCode =0)
    begin
        SET @TracingNo = NULL;
    end


IF(EXISTS(
    SELECT * 
    FROM IMS.tblRecieptTracing 
    WHERE RecieptItemRef = @RecieptItemRef 
 ) and @IsBarCode = 0)
    update IMS.tblRecieptTracing 
    set ExecuteID=@ExecuteID, 
        Quantity = @Quantity, 
        ExpireDateStr = @ExpireDateStr, 
        ExpireDate = @ExpireDate, 
        PartOptionName = @PartOptionName
    Where RecieptItemRef = @RecieptItemRef

ELSE 
    BEGIN
    if(@TracingNo is null)
    begin
        if exists(select * from ims.tblsettings where IsPartInTracingno=1)
        begin
            SELECT @TracingNo = @partcode + '-' + cast(@_tracingno as varchar) 
            FROM IMS.tblRecieptTracing ;
            IF(@TracingNo IS NULL ) 
            begin
                SET @TracingNo = 1000000;
                SET @TracingNo = @TracingNo +1 ;
            end
            SET @TracingNo=cast (@TracingNo as varchar)
        end
        else
                --select 
            SELECT @TracingNo = cast (max( right(TracingNo, charindex('-', reverse(TracingNo) + '-') - 1))as varchar) 
            from ims.tblRecieptTracing;
            IF(@TracingNo IS NULL ) 
                SET @TracingNo = 1000000;

            SET @TracingNo = @TracingNo + 1 ;
        end

            insert into IMS.tblRecieptTracing ( 
                RecieptTracingID , 
                RecieptItemRef , 
                TracingNo  ,  
                ExecuteID ,  
                Quantity ,
                ExpireDateStr ,
                ExpireDate,
                ManufacturingDateStr,
                LotNo,
                ManufacturingDate,
                PartOptionName)
            values( 
                @RecieptTracingID, 
                @RecieptItemRef, 
                @TracingNo , 
                @ExecuteID , 
                @Quantity ,
                @ExpireDateStr ,
                @ExpireDate,
                @ManufacturingDateStr,
                @LotNo,
                @ManufacturingDate,
                @PartOptionName);
        END

Я думаю, что основная часть здесь:

SELECT @TracingNo=cast (max( right(TracingNo, charindex('-', reverse(TracingNo) + '-') - 1))as varchar) from ims.tblRecieptTracing;

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

99 раз из 100 эта ошибка вызвана тем, что SQL Server пытается неявно преобразовать символьное выражение в int.

TL; DR;
Где-тов вашем коде вы пытаетесь либо сравнить, объединить или заполнить значение типа int значением символа 'SRFCHE-600-R-1000000'.

Из преобразования типов данных (компонент Database Engine) документация:

Типы данных могут быть преобразованы в следующих сценариях:

  • Когда данные из одного объекта перемещаются, сравниваются или объединяются с данными из другого объекта, может потребоваться преобразование данных из типа данных одного объекта в тип данных другого.
  • Когдаданные из столбца результатов Transact-SQL, кода возврата или выходного параметра перемещаются в программную переменную, данные должны быть преобразованы из системного типа данных SQL Server в тип данных переменной.

И далее по той же странице:

Типы данных могут быть преобразованы неявно или явно.

Неявные преобразования не видны пользователю.SQL Server автоматически преобразует данные из одного типа данных в другой.Например, когда smallint сравнивается с int, smallint неявно преобразуется в int до начала сравнения.

Какой тип данных будет неявно преобразован вкакой другой тип задокументирован в приоритет типа данных (Transact-SQL) :

SQL Server использует следующий порядок приоритета для типов данных:

1 user-определенные типы данных (самые высокие)
2 sql_variant
3 xml
4 datetimeoffset
5 datetime2
6 datetime
7 smalldatetime
8 date
9 time
10float
11 вещественных
12 десятичных
13 денег
14 smallmoney
15 bigint
16 int
17 smallint
18 tinyint
19 bit
20ntext
21 текст
22 изображение
23 метка времени
24 uniqueidentifier
25 nvarchar (включая nvarchar (max))
26 nchar
27 varchar (включая varchar (max))
28 символов
29 varbinary (включая varbinary (макс.))
30 двоичных (макс.)

0 голосов
/ 17 марта 2019

Ошибка связана с этой строкой:

SET @TracingNo = @TracingNo + 1 ;

Вы должны изменить это значение на

SET @TracingNo = @TracingNo + '1' ;

Проверьте отличный ответ Зохара Пеледа: nvarchar имеет более низкий приоритет (25) than int (16).

Таким образом, когда вы вычисляете

@TracingNo + 1

, движок примет значения nvarchar @TracingNo и целое число 1. Чтобы добавить их, он будетпопытайтесь преобразовать термин типа данных с более низким приоритетом в более высокий.Таким образом, он попытается преобразовать @TracingNo в int.Именно об этом и говорится в сообщении об ошибке: одно из ваших значений @TracingNo нельзя преобразовать в int.

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