如果您想将参数传递给查询并连接结果,这就是表值函数的用途。当你加入它时,你使用 CROSS APPLY 或 OUTER APPLY 而不是 INNER JOIN 或 LEFT JOIN。
另外,我认为这是不言而喻的,但是当您检查 PurchaseDate 是否为空时:
WHERE s.PurchaseDate <> ''
那里可能有问题......这意味着它是一个 varchar 字段而不是日期时间(是吗?)并且不处理空值。至少,您可能想用 ISNULL(s.PurchaseDate, '') <> '' 替换它。如果它实际上是日期时间,请使用 IS NOT NULL 而不是 <> ''。
(编辑以添加示例数据和 DDL 语句。我建议将这些添加到 SQL 帖子中以帮助回答者。此外,由于查询中的字符串比较,我购买了一个 varchar 而不是 datetime。)
https://technet.microsoft.com/en-us/library/ms191165(v=sql.105).aspx
CREATE TABLE company (company_name VARCHAR(25))
INSERT INTO company VALUES ('Company1'), ('Company2')
CREATE TABLE vw_repeat (customername VARCHAR(25), purchasedate VARCHAR(25), company VARCHAR(25))
INSERT INTO vw_repeat VALUES ('Cust1', '11/16/2017', 'Company1')
INSERT INTO vw_repeat VALUES ('Cust1', '11/16/2017', 'Company1')
INSERT INTO vw_repeat VALUES ('Cust2', '11/16/2017', 'Company2')
CREATE FUNCTION [dbo].tf_customers
(
@company varchar(25)
)
RETURNS TABLE AS RETURN
(
SELECT s.[CustomerName], cast(s.PurchaseDate as date) PurchaseDate
FROM vw_Repeat s
WHERE s.PurchaseDate <> '' AND s.Company = @company
GROUP BY s.[CustomerName] , cast(s.PurchaseDate as date)
HAVING COUNT(*) > 1
)
GO
SELECT *
FROM company c
CROSS APPLY tf_customers(c.company_name)