簡體   English   中英

將其加入臨時表和內部聯接的最佳方法

[英]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 1SELECT NULL是標准的。

然后,您可以根據語言從客戶端代碼或像這樣的 T-SQL 中傳入表變量

DECLARE @list dbo.List;
INSERT @list (ListVal)
VALUES ('SomeValue');

EXEC YourProc @LocIdList = @list;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM