Ошибка преобразования типа данных nvarchar в числовой.при вызове функции внутри процедуры - PullRequest
0 голосов
/ 13 сентября 2018

Вот моя процедура, созданная в SQL Server 2016.

CREATE PROCEDURE [dbo].[sp_getProductInfo] 
    @CompanyId VARCHAR(50) = '',
    @ProductIds VARCHAR(max) = '',
    @IsChange VARCHAR(100) = '0',
    @PaymentOptionId VARCHAR(100) = '0',
    @MetalTypeId VARCHAR(100) = '0',
    @MetalGradeId VARCHAR(100) = '0',
    @FullCutClarityId_P1 VARCHAR(100) = '0',
    @SingleCutClarityId_P1 VARCHAR(100) = '0',
    @IsconvertedToFullCut_P1 VARCHAR(100) = '0',
    @FullCutClarityId_P2 VARCHAR(100) = '0',
    @SingleCutClarityId_P2 VARCHAR(100) = '0',
    @IsconvertedToFullCut_P2 VARCHAR(100) = '0'
AS
    DECLARE @SQL VARCHAR(8000) = ''
BEGIN
    SET NOCOUNT ON  
    SET @SQL = 'SELECT dbo.Product.Id, dbo.Product.ItemSku, dbo.Product.ProductName, dbo.Product.ParentSku, dbo.Product.Quantity,
                       (SELECT TotalProductPrice FROM dbo.fn_returnChangedB2BCost(dbo.Product.Id,'+@CompanyId+','+@IsChange+','+@PaymentOptionId+','+@MetalTypeId+','+@MetalGradeId+','+@FullCutClarityId_P1+','+@SingleCutClarityId_P1+','+@IsconvertedToFullCut_P1+','+@FullCutClarityId_P2+','+@SingleCutClarityId_P2+','+@IsconvertedToFullCut_P2+')) AS StandardPrice, dbo.Product.SalePrice
                FROM dbo.Product 
                WHERE dbo.Product.CompanyId = '+@CompanyId+' AND dbo.Product.Id in(' + @ProductIds +')'

    EXEC (@SQL)
END

и функция

CREATE FUNCTION [dbo].[fn_returnChangedB2BCost] 
    (@ProductId BIGINT = 0,
     @CompanyId INT = 0,
     @IsChangeByCritariya BIT = 0,
     @PaymentOptionId INT = 0,
     @MetalTypeId BIGINT = 0,
     @MetalGradeId BIGINT = 0,
     @FullCutClarityId_P1 BIGINT = 0,
     @SingleCutClarityId_P1 BIGINT = 0,
     @IsConvertedToFullCut_P1 BIT = 0,
     @FullCutClarityId_P2 BIGINT = 0,
     @SingleCutClarityId_P2 BIGINT = 0,
     @IsConvertedToFullCut_P2 BIT = 0)
RETURNS @ReturnTable TABLE (TotalProductPrice DECIMAL(18, 4))
AS
BEGIN
    INSERT INTO @ReturnTable (TotalProductPrice) 
        SELECT 120
    RETURN 
END

Теперь моя проблема в том, что когда я вызываю процедуру, возвращается ошибка, которая ..

Ошибка преобразования типа данных nvarchar в числовой.

Но вместо того, чтобы вводить "dbo.Product.Id" в функцию, когда я передаю прямой идентификатор продукта как ..

(SELECT TotalProductPrice FROM dbo.fn_returnChangedB2BCost(3596,'+@CompanyId+','+@IsChange+','+@PaymentOptionId+','+@MetalTypeId+','+@MetalGradeId+','+@FullCutClarityId_P1+','+@SingleCutClarityId_P1+','+@IsconvertedToFullCut_P1+','+@FullCutClarityId_P2+','+@SingleCutClarityId_P2+','+@IsconvertedToFullCut_P2+')) as StandardPrice 

Тогда все работает нормально.

Я не могу найти решение. Пожалуйста, помогите.

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

В вашем запросе условие в условии Where с dbo.Product.Id in ('+ @ProductIds +') '. Пожалуйста, проверьте, есть ли дополнительные «,» в конце строки. Я предлагаю использовать функцию ниже, чтобы сделать список (Rows) из строки, разделенной запятой.

DECLARE @input_xml XML

SELECT @input_xml = Cast('<root><x>'+ Replace(@ProductIds, ',', '</x><x>')+ '</x></root>' AS XML)

SELECT f.x.value('.', 'BIGINT') AS ProductId
INTO #list_to_table
FROM @input_xml.nodes('/root/x') f(x)

Теперь сделайте соединение этой временной таблицы с вашим Query, и этот простой запрос, поэтому избегайте использования Dynamic SQL.

0 голосов
/ 13 сентября 2018

Я подозреваю, что ваша проблема здесь:

set @SQL='SELECT        dbo.Product.Id, dbo.Product.ItemSku, dbo.Product.ProductName, dbo.Product.ParentSku, dbo.Product.Quantity,
(select TotalProductPrice from dbo.fn_returnChangedB2BCost(dbo.Product.Id,'+@CompanyId+','+@IsChange+','+@PaymentOptionId+','+@MetalTypeId+','+@MetalGradeId+','+@FullCutClarityId_P1+','+@SingleCutClarityId_P1+','+@IsconvertedToFullCut_P1+','+@FullCutClarityId_P2+','+@SingleCutClarityId_P2+','+@IsconvertedToFullCut_P2+')) as StandardPrice, dbo.Product.SalePrice
        FROM            dbo.Product 
         where dbo.Product.CompanyId='+@CompanyId+' and dbo.Product.Id in(' + @ProductIds +')'

exec (@SQL)

Вы должны передавать данные в виде параметров - когда это возможно.@ProductIds немного сложно, поэтому хорошее начало:

DECLARE @SQL NVARCHAR(MAX) = '';

set @SQL = N'
SELECT p.Id, p.ItemSku, p.ProductName, p.ParentSku, p.Quantity,
       (select TotalProductPrice
FROM dbo.fn_returnChangedB2BCost(p.Id, @CompanyId, @IsChange, @PaymentOptionId, @MetalTypeId, @MetalGradeId, @FullCutClarityId_P1, @SingleCutClarityId_P1, @IsconvertedToFullCut_P1, @FullCutClarityId_P2, @SingleCutClarityId_P2, @IsconvertedToFullCut_P2)
                                ) as StandardPrice,
       p.SalePrice
FROM dbo.Product 
WHERE dbo.Product.CompanyId =@CompanyId and p.Id in(' + @ProductIds +')';

exec sp_executesql @sql,
                   N'@ProductId bigint, @CompanyId, @IsChangeByCritariya, @PaymentOptionId, @MetalTypeId, @MetalGradeId, @FullCutClarityId_P1, @SingleCutClarityId_P1, @IsConvertedToFullCut_P1, @FullCutClarityId_P2, @SingleCutClarityId_P2, @IsConvertedToFullCut_P2',
                   @ProductId=@ProductId,
                   @CompanyId=@CompanyId ,
                   @IsChangeByCritariya=@IsChangeByCritariya,
                   @PaymentOptionId=@PaymentOptionId,
                   @MetalTypeId=@MetalTypeId,
                   @MetalGradeId=@MetalGradeId,
                   @FullCutClarityId_P1=@FullCutClarityId_P1,
                   @SingleCutClarityId_P1=@SingleCutClarityId_P1,
                   @IsConvertedToFullCut_P1=@IsConvertedToFullCut_P1,
                   @FullCutClarityId_P2=@FullCutClarityId_P2,
                   @SingleCutClarityId_P2=@SingleCutClarityId_P2,
                   @IsConvertedToFullCut_P2=@IsConvertedToFullCut_P2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...