私は最近、sp_MSforeachtable ストアド プロシージャを使用して、テーブル名に Transcode という単語が含まれるすべてのテーブルを選択し、それらのテーブルで SQL を実行したいという問題を発見しました。正常にスキップされることを望んでいたテーブル (つまり、名前にトランスコードが含まれていないテーブル) については、機能するコードを書くことができましたが、完全ではありませんでした。トランスコード テーブルに存在する) それらのテーブルには存在しません。問題は、必要な場合 (条件が満たされた場合など) にのみ SQL を解析するのではなく、ストアド プロシージャが呼び出されたときにすべての SQL が解析されることです。
次のコードは期待どおりに機能します。
exec sp_MSforeachtable '
print ''Table being tested: ?''
if exists (select 1 where ''?'' like ''%Transcode%'')
begin
print '' Do Something''
end
else
begin
print '' Ignored''
end
'
ただし、機能を追加しようとすると、実行されないコードからエラーが発生します。例えば
exec sp_MSforeachtable '
print ''Table being tested: ?''
if exists (select 1 where ''?'' like ''%Transcode%'')
begin
print '' Do Something''
insert ? (col1, col2, col3)
select col1, col2, 1
from ?
where col3 = 0
end
else
begin
print '' Ignored''
end
'
今回は、テーブル名に Transcode という単語が含まれている場合は最初の出力と同じ出力が得られますが、含まれていない場合は Ignored と表示されるのではなく、次のように表示されます。
メッセージ 207、レベル 16、状態 1、行 9
無効な列名 col3
これは、動的 SQL が解析される方法にかかっていると確信していますが、望ましくない動作です。誰もこれに遭遇したことがありますか/簡単な回避策はありますか?
私の場合、存在しない列のおかげでエラーはとにかくifステートメントと同じ効果があり、有効な行は正常に実行できたので、これは緊急ではありませんが、何かをする必要がある場合に備えて学びたいと思っていますこの動作が問題を引き起こす場合も同様です。
前もって感謝します、
JB
ps。この動作を再現するコードを以下に示します。
create table DemoTranscode1 (id bigint identity(1,1) primary key clustered, col1 nvarchar(10) not null, col2 nvarchar(10)not null, col3 bit not null)
go
create table DemoTable1 (id bigint identity(1,1) primary key clustered, col1 nvarchar(10) not null, col2 nvarchar(10)not null)
go
create table DemoTranscode2 (id bigint identity(1,1) primary key clustered, col1 nvarchar(10) not null, col2 nvarchar(10)not null, col3 bit not null)
go
create table DemoTranscode3 (id bigint identity(1,1) primary key clustered, col1 nvarchar(10) not null, col2 nvarchar(10)not null, col3 bit not null)
go
insert DemoTranscode1
select 'example1', 'demo', 0
union select 'example2', 'demo', 0
union select 'example3', 'demo', 0
union select 'example4', 'demo', 0
insert DemoTable1 select col1, col2 from DemoTranscode1
insert DemoTranscode2 select col1, col2, col3 from DemoTranscode1
insert DemoTranscode3 select col1, col2, col3 from DemoTranscode1