[英]Best way to join this into a temp table and inner join
只是想知道將它放入臨時表然后加入它的最佳方法。
IF EXISTS(SELECT LocId
FROM dbo.Locations WITH (NOLOCK)
WHERE SourceSystem = @SourceSystem
AND LocId IN (SELECT ListVal
FROM etopsuser.fnParseListToTable(@LocIdList, ';')) AND IsHot = 1)
BEGIN
專門嘗試在這行代碼上做
(SELECT ListVal
FROM etopsuser.fnParseListToTable(@LocIdList, ';')) AND IsHot = 1)
NOLOCK 無關
您可以像從select
創建任何其他表一樣創建一個臨時表:
SELECT ListVal
INTO #templist
FROM etopsuser.fnParseListToTable(@LocIdList, ';');
那么你可以將它用作:
SELECT l.LocId
FROM dbo.Locations l JOIN
#templist tl
ON l.LocId = tl.Listval
WHERE l.SourceSystem = @SourceSystem AND l.IsHot = 1
將列表傳遞給過程的最佳方法是使用表值參數
CREATE TYPE dbo.List AS TABLE (ListVal varchar(255));
IF EXISTS(SELECT 1
FROM dbo.Locations l
WHERE l.SourceSystem = @SourceSystem
AND l.LocId IN (
SELECT ll.ListVal
FROM @LocIdList ll
) AND IsHot = 1)
注意:始終在每一列上使用表引用,尤其是在涉及子查詢時。 除非您准備好接受錯誤的結果,否則切勿使用
NOLOCK
。EXISTS
忽略它的SELECT
,所以SELECT 1
或SELECT NULL
是標准的。
然后,您可以根據語言從客戶端代碼或像這樣的 T-SQL 中傳入表變量
DECLARE @list dbo.List;
INSERT @list (ListVal)
VALUES ('SomeValue');
EXEC YourProc @LocIdList = @list;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.