[英]How do I force SQL Server to execute a query in a particular order
我有以下查詢
DECLARE @userId INT DECLARE @siteId INT SET @siteId = -1 SET @userId = 1828 SELECT a.id AS alertId, a.location_id, a.alert_type_id, a.event_id, a.user_id, a.site_id, a.accepted_by FROM alerts AS a JOIN alert_types AS ats ON a.alert_type_id = ats.id JOIN events AS tr ON a.event_id = tr.event_id WHERE tr.end_Time IS null AND tr.status_id = 0 AND ats.code = 'E' AND a.site_id in (SELECT * FROM dbo.udf_get_event_sitelist(@siteId, @userId))
此查詢運行需要5到17秒,但在許多情況下,函數dbo.udf_get_event_sitelist(@ siteId,@ userId)不返回任何行,因此查詢將找不到任何數據。
如何強制SQL Server首先執行用戶定義的函數。 我感謝我可以將查詢重寫為存儲過程並首先執行子選擇,但是如果可能的話,我想在單個SQL語句中執行此操作。
使“FROM”表成為函數的結果集,並將其他表連接到它
DECLARE @userId INT
DECLARE @siteId INT
SET @siteId = -1
SET @userId = 1828
SELECT a.id AS alertId,
a.location_id,
a.alert_type_id,
a.event_id,
a.user_id,
a.site_id,
a.accepted_by
FROM (SELECT * FROM dbo.udf_get_event_sitelist(@siteId, @userId)) dt
JOIN alerts AS a ON dt.site_id=a.site_id
JOIN alert_types AS ats ON a.alert_type_id = ats.id
JOIN events AS tr ON a.event_id = tr.event_id
WHERE tr.end_Time IS null
AND tr.status_id = 0
AND ats.code = 'E'
你可以將udf_get_event_sitelist的結果選擇到一個表變量中,如果@@ rowcount> 0,只能繼續查詢大查詢
使用內聯函數時遇到的問題是可以為SELECT中返回的每一行重新計算它們。 這意味着,如果SELECT語句返回100行,則該函數可以執行100次。
您應該遵循Sambo99的建議並將其提取到表變量(如果您認為它需要索引,則將其提取到臨時表)。
此外,修改您的UDF只返回site_ID,因為我猜你沒有neet所有(*)列
SELECT * FROM dbo.udf_get_event_sitelist(@siteId, @userId)
至
SELECT site_id FROM dbo.udf_get_event_sitelist(@siteId, @userId)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.