2016-03-18 7 views
1

いくつかの同一のdbを持つリンクされたsql2008r2サーバーから新しいsql2014サーバーにデータを移動するためのprocがあります。すべての新しいデータベースとオブジェクトを作成し、インポート時にデータを変換/処理します。ソースデータベース名で実行し、残りは実行します。最近は昨晩も問題なく、数ヶ月間使ってきました。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、レベル16、状態1、プロシージャMigrateLocalityDB、96行 無効な列名 'beforerecs'。
Msg 207、レベル16、状態1、プロシージャMigrateLocalityDB、行99 無効な列名 'afterrecs'。

これは、データベースとテーブル名変数を使用してレコード数を取得する際に私が考えていた唯一の方法でした。より良い方法のための提案は大歓迎です!前もって感謝します。

+2

グローバル一時テーブルは、作成された後のすべてのユーザーおよび接続に表示され、そのテーブルを参照しているすべてのユーザーがSQL Serverのインスタンスから切断されると削除されます。誰か他の人や他のクエリがテーブルを変更したことを確認していますか?このスクリプトを最後に実行したときからSQL Serverでセッションを終了しましたか? – Balde

+0

はい、使用していたサーバーとクライアントの両方が最近再起動されており、他の誰も修正を行っていません。 – spudchick

+0

私は、テンポラリテーブルで作成された列を参照する行96と99のインスタンスをコメントアウトしようとしましたが、エラーは停止します。もちろん、それは問題を解決しませんが、一時テーブルが原因ではないことを示しています。 – spudchick

答えて

0

Baldeさんが実際にこれに答えましたが、回答投稿なしで質問を閉じる方法がわかりません。

問題は、他のストアドプロシージャ(## t)で時々使用される名前のグローバルな一時テーブルを使用することに関連していることが判明しました。これまでに問題はなかったが、 。それらをローカルの一時テーブル(#t)に変更すると、procをコンパイル(変更)することができましたが、結果が次のクエリで利用できなかったため、procを実行できませんでした。その解決策は、グローバルな一時テーブルを引き続き使用することでしたが、衝突を防ぐために名前をより一意にするだけです(## tlocmig)。生活し、学びます。

私は正しい軌道に乗ってくれてありがとうBaldeに感謝します!

関連する問題