for*_*reh 10
Erland Sommarskog有一篇关于在SQL Server中传递数据的详尽文章:
http://www.sommarskog.se/share_data.html
他介绍了SQL Server 2000,2005和2008,并且应该详细阅读它,因为每种方法的优点和缺点都有充分的内容.但是,为了提供可用于查看更多详细信息的搜索术语,以下是本文的重点(截至2015年7月为时冻结):
本文解决了两个相关问题:
- 如何在另一个存储过程中使用结果集,也表示为如何
在SELECT语句中使用存储过程的结果集?- 如何将参数中的表数据从一个存储过程传递到另一个存储过程?
输出参数
- 一般不适用,但有时会被忽视.
表值函数
- 通常是仅输出的最佳选择,但有几个限制.
- 例子:
- 内联函数:使用它来重用单个SELECT.
- 多语句函数:当您需要封装更复杂的逻辑时.
使用表格
- 最通用的解决方案.我最喜欢的输入/输出场景选择.
- 例子:
- 共享临时表:主要用于一对呼叫者/被呼叫者.
- 进程密钥表:同一被调用者的许多呼叫者的最佳选择.
- 全局临时表:流程键的变体.
表值参数
- 所需物品.版本:SQL 2008
- 从客户端传递数据时非常有用.
INSERT-EXEC
- 欺骗性的吸引力,但应该谨慎使用.
使用CLR
- 所需物品.版本:SQL 2005
- 复杂,但在INSERT-EXEC不起作用时作为最后的手段很有用.
OPENQUERY
- 有许多陷阱的棘手.泄气.
使用XML
- 所需物品.版本:SQL 2005
- 有点像kludge,但并非没有优势.
使用光标变量
- 不值得推荐.
这是内联函数的查询分析器模板 - 默认情况下返回2个值:
-- =============================================
-- Create inline function (IF)
-- =============================================
IF EXISTS (SELECT *
FROM sysobjects
WHERE name = N'<inline_function_name, sysname, test_function>')
DROP FUNCTION <inline_function_name, sysname, test_function>
GO
CREATE FUNCTION <inline_function_name, sysname, test_function>
(<@param1, sysname, @p1> <data_type_for_param1, , int>,
<@param2, sysname, @p2> <data_type_for_param2, , char>)
RETURNS TABLE
AS
RETURN SELECT @p1 AS c1,
@p2 AS c2
GO
-- =============================================
-- Example to execute function
-- =============================================
SELECT *
FROM <owner, , dbo>.<inline_function_name, sysname, test_function>
(<value_for_@param1, , 1>,
<value_for_@param2, , 'a'>)
GO
Run Code Online (Sandbox Code Playgroud)