Кто-нибудь знает обходной путь для этого? По сути, хранимая процедура заставляет оператор вставки использовать индексированное представление, даже если строки не соответствуют требованиям. В результате возникает ошибка приведения. Однако для ad hocs 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)?