Est-ce que quelqu'un connaît une solution de contournement pour cela? Essentiellement, la procédure stockée force un opérateur d'insertion contre la vue indexée, même si les lignes ne sont pas qualifiées. Il en résulte une erreur de transtypage. Cependant, pour les ad hocs, sql élimine correctement la vue de toute considération.
Considérez le schéma suivant:
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
Tout cela fonctionne:
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;
Cela échoue:
exec insert_testdata @kind = 'noninteger', @data = 'noninteger';
Une comparaison des "plans d'exécution estimés":
insert into testdata (kind, data) values ('noninteger', 'noninteger'):

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

option (recompile)aides?