Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 为什么SSIS中似乎忽略了我的强制转换?_Sql Server 2005_Ssis_Sql Server 2008 R2_Truncation - Fatal编程技术网

Sql server 2005 为什么SSIS中似乎忽略了我的强制转换?

Sql server 2005 为什么SSIS中似乎忽略了我的强制转换?,sql-server-2005,ssis,sql-server-2008-r2,truncation,Sql Server 2005,Ssis,Sql Server 2008 R2,Truncation,我在SSIS中使用数据流任务从一台服务器(SQL server 2005)到另一台服务器(SQL server 2008 R2)获取数据。在OLE DB源连接中,我使用SQL命令获取数据。在此命令中,我已将内容强制转换为特定数据类型: SELECT CAST(column1 AS VARCHAR(10)) AS NameColumn1 ,CAST(column2 AS INT) AS NameColumn2 ,CAST(REPLACE(REPLACE(REPLACE(REPLACE(column

我在SSIS中使用数据流任务从一台服务器(SQL server 2005)到另一台服务器(SQL server 2008 R2)获取数据。在OLE DB源连接中,我使用SQL命令获取数据。在此命令中,我已将内容强制转换为特定数据类型:

SELECT
CAST(column1 AS VARCHAR(10)) AS NameColumn1
,CAST(column2 AS INT) AS NameColumn2
,CAST(REPLACE(REPLACE(REPLACE(REPLACE(column3, CHAR(10), ''), CHAR(13), ''), CHAR(9), ''), ';', '-') AS VARCHAR(100)) AS NameColumn3
,CAST(REPLACE(REPLACE(REPLACE(REPLACE(column4, CHAR(10), ''), CHAR(13), ''), CHAR(9), ''), ';', '-') AS VARCHAR(255)) AS NameColumn4
...
FROM (etc.)
(请注意,强制转换为源数据库中列值的原始数据类型。因此,column1的数据类型最初是
VARCHAR(10)
,column4的数据类型最初是
VARCHAR(255)
,等等。)

之所以使用这些强制转换,是因为在包的后面,我得到了以下关于
column3
column4
的警告:

验证警告。[…]由于插入数据,可能会发生截断 从长度为8000的数据流列“column4”到数据库 列“column4”,长度为255

但是,由于column3和column4的截断警告不断出现,这些强制转换似乎不起作用。(我已经在OLE DB源中设置了截断警告以忽略失败,但这似乎没有什么区别。)


我在网上找不到任何东西,我将暂时通过导入列
VARCHAR(8000)
来“解决”这个问题。但我想知道SSIS中这种行为的原因是什么。有人有线索吗?

进入源组件的advabseced属性,验证第3列和第4列的大小(在输入和输出属性中)。如果它们已经被计算为varchar(8000),那么您必须手动更改它们


或者,删除该组件,并从一开始就使用Select/Cast in place添加一个新组件-这应该正确分配正确的字段长度。

r u使用任何
派生列
,从而将其长度转换为8000,因为错误清楚地表明
列4
中的长度为
8000
源表
并且您正试图映射到
目标
中具有
255
长度的列?否,因为
column4
是源表中的数据类型
VARCHAR(255)
。8000的长度似乎无中生有……
右键单击OLEDB source上的
,手动更改第4列的长度,以防万一,在
Destination
source
中检查属性
ValidateExternalMetadata
。如果将强制转换为Varchar(10),则应为
true
. 这会改变错误信息吗?(在这种情况下,截断警告是由强制转换引起的,40000只是中间列获得的SSIS最大大小)作为删除组件的替代方法,只需将查询更改为类似于
SELECT 1 As tmp
。单击“确定”后,输出缓冲区的元数据将重置为数据类型为int的单个列。然后将查询粘贴回。潜在的问题是,源组件并不总是关心源列是否小于最初声明的列。逻辑似乎是“字符串255适合字符串8000,所以不需要刷新元数据。”@billinkc:你的建议成功了!显然,问题是由于元数据没有被刷新。。。谢谢你们的建议!今天学到了新东西:-)