Qualcuno conosce una soluzione alternativa per questo? In sostanza, la procedura memorizzata forza un operatore di inserimento contro la vista indicizzata, anche se le righe non sono idonee. Di conseguenza, si è verificato un errore di trasmissione. Tuttavia, per ad hocs, sql elimina correttamente la vista dalla considerazione.
Considera il seguente schema:
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
Questi funzionano tutti:
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;
Questo fallisce:
exec insert_testdata @kind = 'noninteger', @data = 'noninteger';
Un confronto tra i "piani di esecuzione stimati":
insert into testdata (kind, data) values ('noninteger', 'noninteger'):

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

option (recompile)aiuto?