繁体   English   中英

当用作IN子查询时,T-SQL表函数不返回行

[英]T-SQL Table Function does not return rows when used as an IN sub-query

我具有以下TSQL Table函数,当其本身用作查询时,该函数完全按要求工作:

-- ================================================
-- Template generated from Template Explorer using:
-- Create Multi-Statement Function (New Menu).SQL
--
-- Use the Specify Values for Template Parameters 
-- command (Ctrl-Shift-M) to fill in the parameter 
-- values below.
--
-- This block of comments will not be included in
-- the definition of the function.
-- ================================================
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER FUNCTION dbo.GetReplacements 
(
    -- Add the parameters for the function here
    @ProductId int
)
RETURNS @AvailableReplacements TABLE 
(
    prod_id INT NOT NULL
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set
    DECLARE @tmpKey int
    DECLARE @getReplacementId cursor 
    DECLARE @replacementProductId int = 0
    DECLARE @lastReplacementProductId int = 0
    DECLARE @findAgain bit = 1
    DECLARE @done bit = 0

    BEGIN
        DECLARE @tmpProdIDs TABLE (prod_id int, prep_id int)  
        DECLARE @prod_id_test int

        INSERT INTO @tmpProdIDs (prod_id, prep_id)  

        SELECT  p.prod_id, pr.prep_id FROM Product p INNER JOIN Product_Replacement pr ON p.prod_id = pr.prep_prod_id2 WHERE pr.prep_prod_id1 = @ProductId      

        WHILE @done = 0  

            BEGIN  

                SET @done = 1    
                DECLARE ProductCursor CURSOR  

                FOR SELECT prod_id FROM @tmpProdIDs  

                    OPEN ProductCursor    
                    FETCH ProductCursor INTO @prod_id_test  

                    WHILE @@FETCH_STATUS = 0  

                    BEGIN  

                        INSERT INTO @tmpProdIDs (prod_id, prep_id)        
                        SELECT  p.prod_id,  pr.prep_id FROM Product p INNER JOIN Product_Replacement pr ON p.prod_id = pr.prep_prod_id2 WHERE  pr.prep_prod_id1 = @prod_id_test    

                        IF @@ROWCOUNT > 0  

                        BEGIN    
                            DELETE FROM @tmpProdIDs WHERE prod_id = @prod_id_test    
                            SET @done = 0  

                        END         

                        FETCH ProductCursor INTO @prod_id_test  

                    END  

                    CLOSE ProductCursor    
                    DEALLOCATE ProductCursor 

                END
            END

            INSERT @AvailableReplacements SELECT prep_id FROM @tmpProdIDs
    RETURN 

END
GO

...当作为基本查询执行时:

declare @productId int = 869725
SELECT prod_id FROM [dbo].[GetReplacements](@productId)

prod_id
91332
91333

....但是当我尝试将该函数用作子查询的一部分时,即使是非常简单的子查询,也不会返回任何行。 谁能阐明为什么?

declare @productId int = 869725
SELECT *
FROM product p
WHERE p.prod_id IN (SELECT prod_id FROM [dbo].[GetReplacements](@productId))

我不明白在IN子查询中有什么不同,这意味着它不起作用?

所以这里有两个问题!

1)确保子查询所关联的源表中存在关联的行(感谢Naveen Kumar)

2)确保该函数还返回正确的ID类型。 在这种情况下,它返回的是Identity列,而不是Product ID,这会使子查询返回的值对于IN语句无效!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM