¿Sabe alguien una solución para esto? Esencialmente, el procedimiento almacenado fuerza a un operador de inserción contra la vista indexada, aunque las filas no califican. Como resultado, hay un error de lanzamiento. Sin embargo, para ad hocs, sql elimina correctamente la vista de la consideración.
Considere el siguiente esquema:
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
Todo esto funciona:
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;
Esto falla:
exec insert_testdata @kind = 'noninteger', @data = 'noninteger';
Una comparación de los "planes de ejecución estimados":
insert into testdata (kind, data) values ('noninteger', 'noninteger'):

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

option (recompile)ayuda?