SQL Server:在存储过程中使用表函数

本文关键字:函数 过程中 存储过程 Server 存储 SQL | 更新日期: 2023-09-27 18:35:21

我有组合框的函数。

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.用户新",或者名字是模棱两可的。

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

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

SQL Server:在存储过程中使用表函数

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

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