[英]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.