我有两个连接在一起的表。我想将联接表的结果与具有两个变量的存储过程的结果联接起来。
我不确定是否应该创建两个临时表或另一个函数,因此我什至不知道应该从哪里开始以及最简单的方法是什么。
以下是我的第一次加入。
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
答案 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}},而不会锁定表本身。