繁体   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