Не удается найти ни столбец "dbo", ни пользовательскую функцию, ни агрегат "TryConvertInt", либо имя является неоднозначным - PullRequest
0 голосов
/ 11 марта 2019

Я вызываю эту скалярную функцию

CREATE FUNCTION dbo.TryConvertInt(@Value varchar(200))
RETURNS INT
AS
BEGIN
    SET @Value = REPLACE(@Value, ',', '')

    IF ISNUMERIC(@Value + 'e0') = 0 
       RETURN NULL

    IF (CHARINDEX('.', @Value) > 0 AND CONVERT(bigint, PARSENAME(@Value, 1)) <> 0) 
       RETURN NULL

    DECLARE @I bigint = CASE
                           WHEN CHARINDEX('.', @Value) > 0 
                              THEN CONVERT(bigint, PARSENAME(@Value, 2))
                              ELSE CONVERT(bigint, @Value)
                        END

    IF ABS(@I) > 2147483647 
        RETURN NULL

    RETURN @I
END
GO

в этой хранимой процедуре

ALTER PROCEDURE [dbo].[SelectItem]
    @identifier VARCHAR(200)
AS
BEGIN
    SELECT
        tb_Items_Master.item_auto_code AS 'Item Code',
        tb_Items_Master.item_name_en AS 'Item Name',
        MIN(tb_Quantity_Expire.expity_date) AS 'Expiry',
        SUM(tb_Quantity_Expire.quantity) AS 'Stock',
        tb_Items_Master.price AS 'Price'
    FROM
        (tb_Items_Master
    INNER JOIN
        tb_Quantity_Expire ON tb_Items_Master.item_auto_code = tb_Quantity_Expire.item_auto_code
    LEFT JOIN
        tb_Items_Codes ON tb_Items_Master.item_auto_code = tb_Items_Codes.item_auto_code)
    WHERE
        tb_Items_Codes.item_code = @identifier
        OR tb_Items_Master.item_name_en LIKE '%'+@identifier+'%'
        OR tb_Items_Master.item_name_2 LIKE '%'+@identifier+'%'
        -- I'm calling it in the following line
        OR tb_Items_Master.item_auto_code = SELECT dbo.TryConvertInt(@identifier)
    GROUP BY
        tb_Items_Master.item_auto_code, tb_Items_Master.item_name_en,
        tb_Items_Master.price;
END

Я получаю ошибку

Невозможно найти ни столбец "dbo", ни пользовательскую функцию, ни агрегат "TryConvertInt", либо имя неоднозначно

Я нашел похожие вопросы, но их ответы не помогли, или я что-то не знаю

1 Ответ

1 голос
/ 11 марта 2019

Проблема tb_Items_Master.item_auto_code = select dbo.TryConvertInt(@identifier).Не уверены, является ли это скалярной функцией или функцией табличного значения.Я предполагаю первое, но я опубликую, как вы ссылаетесь на оба:

Скалярная функция

tb_Items_Master.item_auto_code = dbo.TryConvertInt(@identifier)

Таблица значений Функция

tb_Items_Master.item_auto_code = (SELECT dbo.TryConvertInt(@identifier))

Или

--In your `FROM` clause
CROSS APPLY dbo.TryConvertInt(@identifier) TCI
WHERE ...
   OR tb_Items_Master.item_auto_code = TCI.[column name] --I don't know what the name of the column returned it
                                                         --So you'll need to amend that

Эта функция, однако, подразумевает из ее названия, что это функция, которая пытается преобразовать varchar в int и не потерпит неудачу?В SQL Server уже есть функция, которая называется TRY_CONVERT, поэтому вы можете просто выполнить:

tb_Items_Master.item_auto_code = TRY_CONVERT(int,@identifier)
...