3

我正在为 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。

经过一番谷歌搜索后,我发现:

  1. 该表#new_temporary_table是在exec sp_executesql与我的存储过程不同的调用范围内创建的。这就是下一个exec sp_executesql找不到表的原因。这篇文章对此进行了解释: http ://social.msdn.microsoft.com/forums/en-US/transactsql/thread/1dd6a408-4ac5-4193-9284-4fee8880d18a

  2. 我可以使用以 . 开头的全局临时表##。我不能这样做,因为多个存储过程可以同时运行并且它们会影响彼此的状态

  3. 在这篇文章中,它说如果我发现自己处于这种情况,我应该改变数据库的结构。这对我来说不是一个选择:http: //www.sommarskog.se/dynamic_sql.html

我发现的一种解决方法是将所有select into #new_temporary_table..和所有insert into ...脚本组合成一个巨大的语句。这工作正常,但它有一些缺点。

例如,如果我打印@sql 进行故障排除,文本会被截断。

我还有其他选择吗?欢迎所有想法。

4

3 回答 3

3

您可以使用全局临时表,但使用上下文 ID例如 newid())作为全局临时表名称的一部分。

declare @sql varchar(2000)
declare @contextid varchar(50) = convert(varchar(20), convert(bigint, substring(convert(binary(16), newid()), 1, 4)))
set @sql = 'select getdate() as stuff into ##new_temporary_table_' + @contextid
exec (@sql)
于 2012-05-18T15:45:39.300 回答
1

#temp 表(非全局)在它们创建的范围内及以下可用。所以你可以做类似的事情......

while (your_condition = 1) begin
    set @sql = 'select ... into #temp1 ...from blah
        exec sp_do_the_inserts'
    exec(@sql)
end

sp_do_the_inserts 可能看起来像...

select * into #temp2 from #temp1
....your special logic here....

当然,这假定您事先创建 sp_do_the_inserts。不知道这是否满足您的需求。

于 2012-05-18T15:41:46.083 回答
1

我认为最好使用一个脚本。

您可以在“工具”>“选项”>“查询结果”>“SQL Server”>“结果为文本”中更改将打印的字符数 - 将“最大字符数...”从 256 更改为最大值 (8192)。

如果它大于8192,那么是的,打印很困难。但在这种情况下,您可以尝试不同的选择。而PRINT @sql;不是使用以下内容(使用结果到网格):

SELECT sql FROM (SELECT @sql) AS x(sql) FOR XML PATH;

现在您可以单击结果,它会在新的查询窗口中打开。好吧,它是一个 XML 文件窗口,您无法执行它或查看颜色编码,并且您必须忽略它的更改,例如>>使其作为 XML 数据有效,但是从这里很容易看到,如果您是只是想看看它。您可以将其复制并粘贴到真正的查询编辑器窗口,并根据需要对实体化字符进行搜索和替换。FWIW 我要求他们制作这样的 XML 窗口真正的查询窗口,但这被拒绝了:

http://connect.microsoft.com/SQLServer/feedback/details/425990/ssms-allow-same-semantics-for-xml-docs-as-query-windows

于 2012-05-18T17:30:58.910 回答