存储过程与临时表的联接结果

时间:2018-12-30 17:38:18

标签: sql-server join temp-tables

我有两个连接在一起的表。我想将联接表的结果与具有两个变量的存储过程的结果联接起来。

我不确定是否应该创建两个临时表或另一个函数,因此我什至不知道应该从哪里开始以及最简单的方法是什么。

以下是我的第一次加入。

SELECT *
FROM dbo.Users a WITH (NOLOCK)
JOIN Company b ON a.email = b.email 

下面是我的存储过程,它所做的只是将一列拆分为更多行。拆分是另一个功能。我想使用内部联接。

SELECT a.*, b.* 
FROM [dbo].[Menu] a
CROSS APPLY dbo.Split(SalesPersons, ',') b
WHERE ID = @ID AND Date = @Date

1 个答案:

答案 0 :(得分:1)

假设存储过程的输出是确定性的,最简单的方法是将存储过程的输出填充到临时表中,然后加入临时表中。

CREATE TABLE #tmp
(
   COL1 INT NOT NULL,
   COL2 INT NOT NULL
)

INSERT INTO #tmp
Exec sproc_YourSproc 'Params'


SELECT *
FROM dbo.Users u
INNER JOIN dbo.Company c ON u.email = c.email 
INNER JOIN #tmp t ON t.ID = c.ID
话虽如此,正如马丁·史密斯(Martin Smith)所说,如果可能的话,您可能希望将该逻辑移到存储过程中。

另外,请不要使用(NOLOCK)它实际上并不能像大多数人所认为的那样帮助您,它可能会导致某些令人讨厌的结果。 (重复读取行,幽灵记录等)

如果您需要能够执行读取而不会引起读/写争用,那么我将研究使用更多的optimistic isolation levels,找到优化读取性能以减少可能的拥塞的方法,或者找到会{ 3}},而不会锁定表本身。