誰かがこれの回避策を知っていますか?本質的に、ストアドプロシージャは、行が修飾されていなくても、インデックス付きビューに対して挿入演算子を強制します。その結果、キャストエラーが発生します。ただし、アドホックの場合、sqlはビューを考慮から正しく除外します。
次のスキーマを検討してください。
create table testdata (
testid int identity(1,1) primary key
, kind varchar(50)
, data nvarchar(4000))
go
create view integer_testdata with schemabinding
as
select cast(a.data as int) data, a.kind, a.testid
from dbo.testdata a
where a.kind = 'integer'
go
create unique clustered index cl_intdata on integer_testdata(data)
go
create procedure insert_testdata
(
@kind varchar(50)
, @data nvarchar(4000)
)
as
begin
insert into testdata (kind, data) values (@kind, @data)
end
go
これらはすべて機能します:
insert into testdata (kind, data) values ('integer', '1234');
insert into testdata (kind, data) values ('integer', 12345);
insert into testdata (kind, data) values ('noninteger', 'noninteger');
exec insert_testdata @kind = 'integer', @data = '123456';
exec insert_testdata @kind = 'integer', @data = 1234567;
これは失敗します:
exec insert_testdata @kind = 'noninteger', @data = 'noninteger';
「推定実行計画」の比較:
insert into testdata (kind, data) values ('noninteger', 'noninteger'):

exec insert_testdata @kind = 'noninteger', @data = 'noninteger':

option (recompile)助けはありますか?