【问题标题】:Cannot find either column "dbo" or the user-defined function or aggregate "TryConvertInt", or the name is ambiguous找不到列“dbo”或用户定义的函数或聚合“TryConvertInt”,或者名称不明确
【发布时间】:2019-08-01 20:10:54
【问题描述】:

我正在调用这个标量函数

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”,或者名称不明确

我发现了类似的问题,但他们的回答没有帮助,或者有些我不知道

【问题讨论】:

  • 去掉“选择”这个词。 FWIW,标量函数的表现是出了名的差。也许在这里使用内联表值函数是不错的选择。
  • @SeanLange:函数在隐藏任何正在进行的数据访问时表现不佳。此函数仅对参数等进行标量和转换工作-因此我相信它会执行良好
  • @marc_s 是的。我没有仔细研究这个功能,因为它只是问题的噪音。我同意这种功能的性能可能不是问题。
  • @Sean Lange:是​​的,删除“select”解决了它..对不起这个价值不高的问题。非常感谢
  • 很高兴你解决了。您可能会考虑删除这个问题,因为它基本上只是一个语法错误,不太可能帮助任何人。

标签: sql-server user-defined-functions


【解决方案1】:

问题是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)

【讨论】:

  • @Larnu:非常感谢
猜你喜欢
  • 2015-05-26
  • 2020-12-07
  • 2014-01-06
  • 2011-01-06
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 2011-07-13
相关资源
最近更新 更多