【发布时间】: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