SQL2014存储过程 - 在昨天真正起作用的代码上获取错误

时间:2016-03-18 20:46:28

标签: sql-server stored-procedures temp-tables

我有一个proc设计用于将数据从链接的sql2008r2服务器移动到几个相同的dbs到我的新sql2014服务器。它会创建所有新数据库和对象,并在导入时转换/处理数据。您在源数据库名称上运行它,然后完成其余的工作。我已经使用它几个月没有问题,包括最近一晚。

部分代码选择最后报表的每个表的记录计数之前和之后。

今天,前/后计数阻止我运行存储过程或改变它。 (多个错误,因为它在每个表之后执行此操作。)

以下是它所引发的线条。也许有比使用临时表更好的方法吗?

exec('select count(*) as beforerecs into ##t from [sourceserver\localities].' + @dbname + '.dbo.' + @Tabname + ';')
select @sCount=beforerecs from ##t  --line 96
drop table ##t
exec('select count(*) as afterrecs into ##t from ' + @destdbname + '.dbo.' + @Tabname + ';')
select @dcount=afterrecs from ##t   --line 99
drop table ##t

我得到的错误是抱怨的,因为表和列在技术上并不存在,直到执行上一行代码,但它直到今天仍然不关心:

  

Msg 207,Level 16,State 1,Procedure MigrateLocalityDB,Line 96   列名称无效' beforerecs'。
  消息207,级别16,状态1,过程MigrateLocalityDB,第99行   列名称无效' afterrecs'。

这是我当时能够想到使用我的数据库和表名变量获取记录计数的唯一方法。欢迎提出更好的方法!提前谢谢。

1 个答案:

答案 0 :(得分:0)

巴尔德实际上回答了这个问题,但我不确定如何在没有答案的情况下结束这个问题。

问题结果与使用全局临时表有关,该临时表的名称有时在其他存储过程中使用(## t) - 之前没有出现过问题的东西,但是对我来说很懒惰部分。将它们更改为本地临时表(#t)允许我编译(更改)proc,但是proc无法运行,因为结果不可用于后续查询。解决方案是继续使用全局临时表,但只是使名称更加独特以防止冲突(## tlocmig)。生活和学习。

感谢Balde让我走上正轨!