T-SQL中的临时函数或存储过程

39

在 MS SQL 2005 上是否有创建临时存储过程或函数的机会?我想仅在我的查询中使用此存储过程,因此在执行后它将消失。

我有一个查询,我想对一些数据执行EXEC。但是对于我将处理此命令的每个表,我都需要更改其中的某些部分。因此,我想创建临时SP,它将从我提供的参数(如表名等)返回查询,然后通过EXEC执行此查询。

并且这个存储过程以后对我来说没有用,所以我希望它是临时的,这样当我结束执行我的查询时 - 它将消失。


1
根据您的评论修改了答案。 - Marc Gravell
3个回答

35

这个问题有点老,但其他答案未能提供创建临时过程的语法。语法与创建临时表相同:使用 #name 来创建本地临时对象,使用 ##name 来创建全局临时对象。

CREATE PROCEDURE #uspMyTempProcedure AS
BEGIN
  print 'This is a temporary procedure'
END
这在官方文档的“过程名称”部分有描述。http://technet.microsoft.com/en-us/library/ms187926%28v=sql.90%29.aspx
我正在使用这种技术来去重我的基本T-SQL单元测试代码。虽然真正的单元测试框架会更好,但这总比没有好,而且“垃圾回收”自己。

6
函数怎么样?为了能够在SELECT列表达式中使用它们? - jgomo3

27

关于您的编辑 - 您似乎应该使用 sp_ExecuteSQL 对一个包含 TSQL 的(参数化)nvarchar 进行操作。

在 sp_ExecuteSQL 上搜索;这里是一个简单的例子:

DECLARE @SQL nvarchar(4000),
 @Table varchar(20) = 'ORDERS',
 @IDColumn varchar(20) = 'OrderID',
 @ID int = 10248

 SET @SQL = 'SELECT * FROM [' + @Table + '] WHERE ['
  + @IDColumn + '] = @Key'

  EXEC sp_executesql @SQL, N'@Key int', @ID

请注意表名和列名必须连接到查询中,但值(例如@Key)可以作为参数化。


有一个临时存储过程 - 但它是每个连接而不是每个存储过程的。

但是,您可能要查看公共表达式 - 它们可能是您想要的(尽管您只能从中读取一次)。

也许如果您能澄清您想要做什么?


你能澄清一下“临时存储过程”的部分吗?你是指sp_prepare还是sp_executesql? - gbn
1
我已经添加了更多关于我尝试实现的内容的解释。希望这有助于理解我的想法。 - Tom Smykowski

-3

只需在查询中使用存储过程的SQL即可。无需在数据库内创建存储过程,这不会比在查询内使用普通查询提供任何优势。


15
但这并不允许存储过程代码的重用 - 我认为这是这种方法的优点。 - Tone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接