Adakah yang tahu solusi untuk ini? Pada dasarnya, prosedur yang disimpan memaksa operator memasukkan terhadap tampilan yang diindeks, meskipun baris tidak memenuhi syarat. Akibatnya, ada kesalahan pemeran. Namun, untuk ad hocs, sql dengan benar menghilangkan tampilan dari pertimbangan.
Pertimbangkan skema berikut:
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
Ini semua bekerja:
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;
Ini gagal:
exec insert_testdata @kind = 'noninteger', @data = 'noninteger';
Perbandingan "perkiraan rencana eksekusi":
insert into testdata (kind, data) values ('noninteger', 'noninteger'):

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

option (recompile)bantuan?