[英]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.