对变量值使用 Select 语句

Use a Select Statement for Variable Values

提问人:Data_Science_Mick 提问时间:10/25/2023 最后编辑:Thom AData_Science_Mick 更新时间:10/25/2023 访问量:36

问:

在 SQL 中,我创建了一个表函数,在其定义中,它包含一个名为 @customerid 的变量。因此,select 语句需要包含 (@customerid)。

在对表函数执行 select 语句时,我通常会声明变量值,如下所示。但是,这限制了我只能使用一个客户。然而,我想为所有客户返回有关表函数的数据。

DECLARE @customerid INT = 123456
SELECT * FROM custom.tfnCustomerRatings(@customerid)

我试图将变量的值设置为 select 语句。但是,这会引发如下错误。我需要以不同的方式执行此操作吗?“子查询返回了 1 个以上的值。当子查询跟在 =、!=、<、<= 、>、>= 之后或子查询用作表达式时,这是不允许的。

DECLARE @customerid INT
SET @customerid = (SELECT distinct Customerid FROM compliance.CustomerTable WHERE CountryID = 1)
SELECT * FROM custom.tfnCustomerRatings(@customerid)

提前致谢。

sql-server 变量 表函数

评论

0赞 siggemannen 10/25/2023
使用交叉应用...select * from customertable c cross apply dbo.yourfunction(customerId) cf
0赞 Data_Science_Mick 10/25/2023
谢谢@siggemannen。使用交叉应用有效。但是,返回结果需要 1 分钟。但是,以下操作在 4 秒内运行。SELECT * FROM custom.tfnCustomerRatings(null) WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Compliance.Customer WHERE CountryID = 1)
0赞 Data_Science_Mick 10/25/2023
'SELECT * FROM custom.tfnCustomerRatings(null) WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Compliance.Customer WHERE CountryID = 1)'
0赞 siggemannen 10/25/2023
不过,这不是同一个查询。您不会在“快速”查询中选择任何客户数据,还需要在交叉应用查询中添加 WHERE
0赞 siggemannen 10/25/2023
此外,性能不是您的问题的一部分,但没关系,使用表值函数可能会更慢,因为对于每个客户行,它都需要一个接一个地获取客户数据

答:

0赞 Data_Science_Mick 10/25/2023 #1

使用交叉应用会在 1 分钟内返回结果。使用以下命令可在 4 秒内返回结果。

SELECT * FROM  custom.tfnCustomerRatings(null)
WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Compliance.Customer WHERE CountryID = 1)

评论

2赞 Aaron Bertrand 10/25/2023
你是说这是解决方案吗?如果没有,那么您应该将信息添加到问题中,而不是答案。如果这确实以某种方式解决了您的问题,请将其标记为已接受(但也删除了 ,这是无缘无故的额外工作,尤其是如果是键)。DISTINCTCustomer.CustomerID