DTS (Transform Data Task) Error!

kentyshang 2006-07-04 05:15:44
我做了一个DTS.

Source server: S03A
Destination server: Ns00001

创建Transform Data Task Properties.

Transform Data Task Properties.
Source:
TABLE:tblDIS('fldDisPrj_Num','fldDis_Num')
Destination:
TABLE:tblDIS('fldDisPrj_Num','fldDis_Num')
Transformations:
删除所有连接,选择New->ActiveX Script.
Transformation Options.
Source Columns:选择所有Columns
Destination Columns:选择所有Columns
General:选择Properties/ActiveX Script
将会自动生成:
'**********************************************************************
' Visual Basic Transformation Script
'************************************************************************

' Copy each source column to the destination column
Function Main()
DTSDestination("fldDisPrj_Num") = DTSSource("fldDisPrj_Num")
DTSDestination("fldDis_Num") = DTSSource("fldDis_Num")
Main = DTSTransformStat_OK
End Function
将DTSDestination("fldDisPrj_Num") = DTSSource("fldDisPrj_Num")
DTSDestination("fldDis_Num") = DTSSource("fldDis_Num")
删除.
选择Test,测试成功.

点选ok,退出->保存.
运行(Exectude),将会出现如下错误讯息:

The number of failing rows exceeds the maximum specified.
insert error,column 2('fldDisPrj_Num',DBTYPE_NUMERIC),status 10; Integrity violation;attempt to insert NULL data or data which violates contraints.

insert error,column 2('fldDis_Num',DBTYPE_NUMERIC),status 10; Integrity violation;attempt to insert NULL data or data which violates contraints.
未指定的错误.

那么,我想问的是:
1)为什么会在ActiveX中测试运行的时候,会一切正常.而在执行DTS包的时候就会出现错误呢
2)ActiveX Script 中的 Tasks Constant/Data Pump Constant中的
DTSTransformStat_OK
DTSTransformStat_Info
DTSTransformStat_OKInfo
DTSTransformStat_SkipRow
DTSTransformStat_SkipRowInfo
DTSTransformStat_SkipFetch
DTSTransformStat_SkipInsert
DTSTransformStat_DestDataNotSet
DTSTransformStat_Error
DTSTransformStat_ErrorSkipRow
DTSTransformStat_ExceptionRow
DTSTransformStat_AbortPump
DTSTransformStat_NoMoreRows
都有什么区别呢?
我需要从那些方面来了解这些常量的意义呢?
3)如果某些Fields为Null,我该如何发现和做处理呢!
就像上面讲的那样,我在main函数中什么都没有做呀!
就只有一个返回值.
Function Main()
Main = DTSTransformStat_OK
End Function
而提示的错误讯息确实 某些Columns为空,我该如何才能解决呢?

多谢!多谢!
如果描述的不够清晰,那么请联系我!
msn:shangpeng1990@hotmail.com
QQ:109426573
也可以到我的blog上面看一下里面的描述.
http://kentyshang.cnblogs.com/archive/2006/06/08/420591.html
多谢!多谢
...全文
253 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
kentyshang 2006-07-11
  • 打赏
  • 举报
回复
请大家在关注一下!多谢!
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
这个方法我觉得应该可以解决我的问题.
但是为什么会出现Insert null,我倒是还没有弄明白呢!
多谢了!多谢!
playwarcraft 2006-07-05
  • 打赏
  • 举报
回复
假設fldDisPrj_Num存在NULL的情況,

Function Main()
if isnull(DTSSource("fldDisPrj_Num")) Then
DTSDestination("fldDisPrj_Num")=默認值
DTSDestination("fldDis_Num")= DTSSource("fldDis_Num")
Main = DTSTransformStat_OK
else
DTSDestination("fldDisPrj_Num") = DTSSource("fldDisPrj_Num")
DTSDestination("fldDis_Num") = DTSSource("fldDis_Num")
Main = DTSTransformStat_OK
end if
End Function
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
是要将Null值的设置为一个默认值,然后INSERT
playwarcraft 2006-07-05
  • 打赏
  • 举报
回复
你的要求是什麼??
是要把NULL的過慮掉,把不是NULL的轉換到目的表中去嗎?
我上面好像已經回答了吧
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
是这样的,那么如何解决这个问题呢?
我知道用 Main = DTSTransformStat_SkipRow就可以解决这个问题
但是现在老大不让用这个,讲如果有重要数据的话就糟糕了.
所以你看呢?
playwarcraft 2006-07-05
  • 打赏
  • 举报
回复
看來我理解有誤.
Function Main()
Main = DTSTransformStat_OK
End Function

這樣不是什麼都不干,而是每行以null轉換到目的表中.
可以建2個表來看下結果,
create table table1 (c1 int,c2 int)
insert into table1
select 1,2
union
select 3,4
union
select 5,6

create table table2(c3 int ,c4 int)

執行DTS
執行語句 select * from table2
c3 c4
----------
NULL NULL
NULL NULL
NULL NULL
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
playwarcraft,多谢你!
Transform Data Task order的问题解决了!
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
谢谢您的回答.
'**************************************************************************
1.你把那兩條語句都刪除了,那就是什麼都不干,這個DTS還有什麼作用呢??
錯誤的提示應該是企圖把NULL插入目的表中,提示錯誤.
'**************************************************************************
是,你这样的理解我也曾有过,但是很快对其进行了怀疑.
你也讲,将两条语句删除了,什么都不干,这个DTS应该什么都没有做了.
那么,为什么在执行的时候还会出现Insert NULL值的错误呢?
所以我认为即时ActiveX中只有一个返回值,但是在
Transformation Options中的Source Columns和Destination Columns中选择了两个Columns,
所以DTS包会认为它需要把Destination的值Insert 到Source中.
你觉得呢?或许我的理解是错误的!多谢!

playwarcraft 2006-07-05
  • 打赏
  • 举报
回复
还有一个问题呀!
也是DTS的,如何控制
Transform Data Task的顺序呢?
也就是讲,在DTS包中,有三个Transform Data Task,如何让这个执行结束再让另外一个执行呢!
多谢了!

--------------------
右鍵Transform Data Task--Workflow Properties--New--選擇Souece Step在哪個成功後執行
playwarcraft 2006-07-05
  • 打赏
  • 举报
回复
1.你把那兩條語句都刪除了,那就是什麼都不干,這個DTS還有什麼作用呢??
錯誤的提示應該是企圖把NULL插入目的表中,提示錯誤.
2.可以參考SQL聯機幫助!
DTSTransformStat_OK : Default conversions (if any) succeeded. Write the row to destination if specified, without calling any error handlers.
DTSTransformStat_SkipRow : Terminate further processing of this row, for nonerror reasons.

3.可以用isnull(DTSSource("fldDisPrj_Num"))來判斷.
舉個例子,假如你要把DTSSource("fldDisPrj_Num")為null的情況排除掉,可以這樣
Function Main()
if isnull(DTSSource("fldDisPrj_Num")) Then
Main=DTSTransformStat_SkipRowInfo
else
DTSDestination("fldDisPrj_Num") = DTSSource("fldDisPrj_Num")
DTSDestination("fldDis_Num") = DTSSource("fldDis_Num")
Main = DTSTransformStat_OK
end if
End Function
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
还有一个问题呀!
也是DTS的,如何控制
Transform Data Task的顺序呢?
也就是讲,在DTS包中,有三个Transform Data Task,如何让这个执行结束再让另外一个执行呢!
多谢了!
kentyshang 2006-07-05
  • 打赏
  • 举报
回复
都没有回答了吗?
kentyshang 2006-07-04
  • 打赏
  • 举报
回复
如果是你,你会认为是什么地方出现了错误呢!
或者换句话讲,是什么地方进行了Insert的事件,所以才会出现 Null值的错误呢!
zjcxc 元老 2006-07-04
  • 打赏
  • 举报
回复
main函数中什么都没有做呀!
只是在Transformation Options中的Source Columns和Destination Columns中选择了两个Columns呀!
\\


似乎错误提示并没有说是 Main 过程出错吧? 你定义了两个列的数据传输, 那如果这两个列有不允许为NULL的定义, 但你又要插入NULL值, 一样会报错吧?
zjcxc 元老 2006-07-04
  • 打赏
  • 举报
回复
我现在用2005, 没有2000的互不干涉.
kentyshang 2006-07-04
  • 打赏
  • 举报
回复
知道是Null值的问题,但问题是:
Function Main()
Main = DTSTransformStat_OK
End Function
main函数中什么都没有做呀!
只是在Transformation Options中的Source Columns和Destination Columns中选择了两个Columns呀!
并且这个表是完全相同的.

不过,你可以自己建立一个测试一下.
肯定也会出现这样的问题.
zjcxc 元老 2006-07-04
  • 打赏
  • 举报
回复
NULL值的问题啊, 目的表不允许插入NULL值吧?
zhh007 2006-07-04
  • 打赏
  • 举报
回复
你目的字段的数据类型为数值型,而源字段的数据类型为字符型,就有可能出现,你现在的这种情况.因为如果你源字段可以为NULL值,在插入时肯定回抱错,原因是int不能为空...
插入的时候判断一下:
if DTSSource("fldDis_Num") = null then
DTSDestination("fldDis_Num") = 0
else
DTSDestination("fldDis_Num") = DTSSource("fldDis_Num")
end if
等不等于0还要你自己定,我只是举个例子~!!
kentyshang 2006-07-04
  • 打赏
  • 举报
回复
用户的问题?
不是很懂呢!
现在就是我自己机子上面测试不能通过
最后我使用了
Function Main()
Main = DTSTransformStat_SkipRow
End Function
就解决了这个问题呢!
但是今天老大讲,不能这样使用,返回值必须为:
Main = DTSTransformStat_OK
如果这样,就会出现上面的提示错误讯息!
加载更多回复(1)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧