如何在 SQL Server 的 IN 子句中使用存储过程输出
本文关键字:存储过程 输出 子句 IN SQL Server | 更新日期: 2023-09-27 18:34:01
我的应用程序中有一个视图,它有一个内部连接,另一个视图和一个表。
view ViewName
select * from AnotherView inner join TableName ON conditions
此视图花费了太多时间,专门使用 INNER JOIN 语句执行。所以我正在尝试使用 SP 提高性能。我正在尝试删除物理表上的内部连接。
我的 SP 将获取后续子句所需的数据。
所以代码将如下所示,
view ViewName
select * from AnotherView where columnName in (result of SP)
我尝试了表变量,在视图中调用视图。但是执行时间似乎相同,每次都有一些细微的差异。
谁能帮我理解这一点?可能吗?有没有其他更好的方法来实现这一目标。我不想使用openrowset。
提前感谢,
维杰
将以下查询放在您的视图中,它将创建一个包含 sp 结果的内部连接。
您可以使用 View 中的 OpenRowSet 访问 sp。
SELECT *
FROM AnotherView
INNER JOIN (SELECT a.*
FROM OPENROWSET('SQLNCLI',
'Server=(local);TRUSTED_CONNECTION=YES;',
'EXEC database.dbo.Spname') AS a) AS b
ON AnotherView.columnName = b.columnname
如果凭据不受开发人员控制,则可以创建一个链接服务器并在 openrowset 中传递服务器的名称。无需传递凭据。
如何创建到数据库的链接服务器:
EXEC master.dbo.sp_addlinkedserver
@server = N'LinkServerName',
@srvproduct=N'MSSQL',
@provider=N'SQLNCLI',
@provstr=N'PROVIDER=SQLOLEDB;SERVER=.'SQLEXPRESS;Database=DbName'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'LinkServerName',
@useself=N'True',
@locallogin=NULL
如何在视图中执行 sp:
SELECT * From OPENQUERY([LinkServerName],DbName.dbo.spname)
<</div>
div class="answers"> 将结果放在临时表中,并与其进行内部连接。
或
将结果放在变量(或输出变量)中,并使用动态 SQL 使用它。
若要提高性能,请在条件中使用的列上使用索引。