2013-10-14 35 views
0

我有组合框的功能。SQL Server:在存储过程中使用表函数

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

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

但是,我得到一个错误

无法找到其中任何一列 “DBO” 或用户-defined函数或聚合 “dbo.FN.USERNew”,或名称ambigous。”

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 [email protected]_ID 
END 

那么,为什么我不能用我的功能在我的存储过程?

+0

从逻辑上说,你正在添加一个表到List列是不可能的。 – Kaf

回答

2

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

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 [email protected]_ID 
END 

参见Database Identifiers


然而,这是一个表值函数 - 这会更正常的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 [email protected]_ID 
END 
+0

如果你已经注意到他的函数正在返回一个不能在一列中捕获的表 – Dhaval

+0

@Dhaval - 有两个问题 - 我注意到的第一个问题是他们需要引用这个名称 - 所以答案的一部分是正确的,但不是足以完全修复查询。然后我意识到这是一个TVF,所以我在第二部分添加了更多信息,包括猜测他们想要的内容。 –

+0

我已经在编辑之前放弃了投票,所以我现在已经将它删除了 – Dhaval

相关问题