我正在为 SQL Server 2008 编写一个存储过程,我需要从一组表中提取信息。我不知道这些表的结构。同一数据库中还有另一个表,它告诉我该表中字段的名称和类型。
我正在这样做:
declare @sql nvarchar(max)
set @sql = 'select ... into #new_temporary_table ...'
exec sp_executesql @sql
Then I iterate doing:
set @sql = 'insert into #another_temporary_table ... select ... from #new_temporary_table'
exec sp_executesql @sql
之后我删除了临时表。这发生在一个循环中,因此该表被创建、填充和删除多次,每次都有不同的列。
这失败并出现错误:
对象名称无效:#new_temporary_table。
经过一番谷歌搜索后,我发现:
该表
#new_temporary_table
是在exec sp_executesql
与我的存储过程不同的调用范围内创建的。这就是下一个exec sp_executesql
找不到表的原因。这篇文章对此进行了解释: http ://social.msdn.microsoft.com/forums/en-US/transactsql/thread/1dd6a408-4ac5-4193-9284-4fee8880d18a我可以使用以 . 开头的全局临时表
##
。我不能这样做,因为多个存储过程可以同时运行并且它们会影响彼此的状态在这篇文章中,它说如果我发现自己处于这种情况,我应该改变数据库的结构。这对我来说不是一个选择:http: //www.sommarskog.se/dynamic_sql.html
我发现的一种解决方法是将所有select into #new_temporary_table..
和所有insert into ...
脚本组合成一个巨大的语句。这工作正常,但它有一些缺点。
例如,如果我打印@sql 进行故障排除,文本会被截断。
我还有其他选择吗?欢迎所有想法。