0

我有组合框的功能。

ALTER FUNCTION [FN.USERNew]
(   
    @USER_ID INT 
)
RETURNS TABLE 
AS
RETURN 
(
Select  [USER_NAME] , username_Id  From USER
WHERE USER_ID=@USER_ID
)
GO

我尝试在我的存储过程中使用上述函数,如下所示。

但是,我收到一个错误

找不到列“dbo”或用户定义的函数或聚合“dbo.FN.USERNew”,或者名称不明确。

ALTER PROCEDURE DBO.[MY_STORED_PROCEDURE]
(
    @USER_ID INT,
    @PRODUCT_ID INT
)
AS
BEGIN  
SELECT 

PRODUCT_ID,
PRODUCT_NAME

DBO.FN.USERNew(USER_ID) AS PROBLEMHERE

FROM PRODUCT_TABLE
WHERE PRODUCT_ID=@PRODUCT_ID 
END

那么为什么我不能在我的存储过程中使用我的函数呢?

4

1 回答 1

2

您必须继续使用[]或引用名称,""因为.用于分隔名称部分:

ALTER PROCEDURE DBO.[MY_STORED_PROCEDURE]
(
    @USER_ID INT,
    @PRODUCT_ID INT
)
AS
BEGIN  
SELECT 

PRODUCT_ID,
PRODUCT_NAME

DBO.[FN.USERNew](USER_ID) AS PROBLEMHERE

FROM PRODUCT_TABLE
WHERE PRODUCT_ID=@PRODUCT_ID 
END

请参阅数据库标识符


但是,这是一个表值函数——它通常会在FROM子句中使用(可能是通过APPLY)——我不确定 SQL Server 是否会让你在SELECT子句中使用它,因为它可以返回多个列和行。我想你可能想要:

ALTER PROCEDURE DBO.[MY_STORED_PROCEDURE]
(
    @USER_ID INT,
    @PRODUCT_ID INT
)
AS
BEGIN  
SELECT 

PRODUCT_ID,
PRODUCT_NAME

ft.* AS PROBLEMHERE

FROM PRODUCT_TABLE pt
    CROSS APPLY DBO.[FN.USERNew](pt.USER_ID) ft
WHERE pt.PRODUCT_ID=@PRODUCT_ID 
END
于 2013-10-14T14:40:16.803 回答