use Tempdb
go
-- 在 SQL2005 和 SQL2008 時,都會出現
set nocount on ;
if object_id ( 'Tempdb..#A' ) is not null
drop table #A
create table #A
(
A_ID int not null ,
Type nvarchar ( 20)
)
if object_id ( 'Tempdb..#B' ) is not null
drop table #B
create table #B
(
A_ID int not null,
Value nvarchar ( 4000),
Num int -- 無意義列
)
insert #A select 1, N'A'
insert #A select 2, N'A'
insert #B select 3, 'Error' , 0-- 類型非字符
/*
#A:
A_ID Type
----------- --------------------
1 A
2 A
#B:
A_ID Value Num
----------- -------------------- -----------
3 Error 0
*/
-- 轉換后出錯時出錯 , 不成立沒結果集
select
cast ( b. value as bigint ) as [ 轉換后出錯 ]
from #A a
inner join #B b on a. A_Id= b. A_Id
/*
訊息 8114 ,層級 16 ,狀態 5 ,行 28
Error converting data type nvarchar to bigint.
*/
insert #B select 1, 10, 0-- 新增一條后,影響引擎類型判斷以下不會錯
go
select
cast ( b. value as bigint ) as [ 轉換后出錯 ]
from #A a
inner join #B b on a. A_Id= b. A_Id
-- 怎樣處理方法 ( 用表提示處理 , 改變數據庫引擎的執行順序 )
--LOOP | HASH | MERGE | REMOTE
delete #B where isnumeric ( Value )= 1-- 刪除新增記錄
select
cast ( b. value as int ) as [ 轉換后正常 ]
from #A a
inner HASH join #B b on a. A_Id= b. A_Id
go
-- 新增條數據 , 數據量記錄數對類型判斷有影響 .
declare @i int
set @i= 0
while @i< 10
begin
insert #B select 3, 'Error' + rtrim ( @i), 2-- 類型非字符
set @i= @i+ 1
end
go
--force order 用提示強制執行順序
select
cast ( b. value as int ) as [ 轉換后正常 ]
from
#A a
Cross Apply
( select top 1 Value from #B where A_ID= a. A_ID order by Num asc ) b
option ( force order )
drop table #a, #b