C# SSIS:列大小未根据查询更改
我有一个包裹。它有一个输入到C# SSIS:列大小未根据查询更改,c#,tsql,visual-studio-2015,ssis,C#,Tsql,Visual Studio 2015,Ssis,我有一个包裹。它有一个输入到脚本组件中的查询 在查询中,我从表中选择一个varchar(8)列,然后我CAST(myDateCol作为varchar(10)) 在我的脚本中,我试图在Input0中的行.myDateCol中添加两个字符,但是我得到了一个缓冲区错误,它位于myDateCol的属性设置器中。您可以看到,它将属性设置为8个字符,但之后会出现错误 我所做的是添加一个长度为10的输出列,设置它,并将其映射到包中的下一个组件,但这似乎有点愚蠢 是否有一种方法可以根据查询强制调整输入列的大小或
脚本组件中的查询
在查询中,我从表中选择一个varchar(8)
列,然后我CAST(myDateCol作为varchar(10))
在我的脚本中,我试图在Input0
中的行.myDateCol
中添加两个字符,但是我得到了一个缓冲区错误
,它位于myDateCol
的属性设置器中。您可以看到,它将属性设置为8个字符,但之后会出现错误
我所做的是添加一个长度为10的输出列,设置它,并将其映射到包中的下一个组件,但这似乎有点愚蠢
是否有一种方法可以根据查询强制调整输入列的大小或是否有一种方法可以手动强制刷新,以防在添加CAST
操作时,软件包认为我正在处理varchar(8)
其他信息:
Row.myDateCol = "20170404"
Row.myDateCol = "2017-04-04" // Errors out
您的问题是将日期(时间)处理为文本而不是数字的结果。我真的无法从你的问题中判断你是想在数据层(Sql)还是应用层(C#)添加额外的字符
如果不填写(pad)该值,则强制转换VarChar(8)=>VarChar(10)仍将返回VarChar(8)。您可以尝试将VarChar(8)强制转换为Char(10)
另一个选项是将列值双重转换为日期,然后再转换回所需的varchar(10)
您的问题是将日期(时间)处理为文本而不是数字的结果。我真的无法从你的问题中判断你是想在数据层(Sql)还是应用层(C#)添加额外的字符
如果不填写(pad)该值,则强制转换VarChar(8)=>VarChar(10)仍将返回VarChar(8)。您可以尝试将VarChar(8)强制转换为Char(10)
另一个选项是将列值双重转换为日期,然后再转换回所需的varchar(10)
因此,在进行了一些尝试之后,我发现重命名列将大小更改为varchar(10)
per,如下所示:
SELECT
myPK,
CAST(myDateCol AS varchar(10)) AS DATECOL,
myOtherCol
FROM
MyServer.MySchema.MyTable
然后我把它改回去
SELECT
myPK,
CAST(myDateCol AS varchar(10)),
myOtherCol
FROM
MyServer.MySchema.MyTable
而零钱被卡住了。我不知道为什么或如何,但VS/SSIS不知何故从未刷新自身以更改为其他类型。我假设它在输入初始查询后不会处理查询更改,除非名称/别名更改
这也不仅仅是我的机器。奇怪。因此,在玩了一些游戏之后,我发现重命名列将大小更改为varchar(10)
,如下所示:
SELECT
myPK,
CAST(myDateCol AS varchar(10)) AS DATECOL,
myOtherCol
FROM
MyServer.MySchema.MyTable
然后我把它改回去
SELECT
myPK,
CAST(myDateCol AS varchar(10)),
myOtherCol
FROM
MyServer.MySchema.MyTable
而零钱被卡住了。我不知道为什么或如何,但VS/SSIS不知何故从未刷新自身以更改为其他类型。我假设它在输入初始查询后不会处理查询更改,除非名称/别名更改
这也不仅仅是我的机器。奇怪。这是SSI的正常行为。当您创建使用SQL查询的数据源时,SSIS将查看您的查询并为数据流构建元数据。只有在更改查询的结构(例如数字列或其名称)时,数据源才会重新计算该元数据
强制刷新数据类型而不重新命名列的最简单方法是转到数据源编辑器的“列”页面,取消勾选,然后勾选可用外部列的顶部勾选框。这将取消选择所有列并重新选择它们,同时刷新元数据。将鼠标悬停在下方列出的External\Output列名上,可以轻松确认这一点
这是SSI的正常行为。当您创建使用SQL查询的数据源时,SSIS将查看您的查询并为数据流构建元数据。只有在更改查询的结构(例如数字列或其名称)时,数据源才会重新计算该元数据
强制刷新数据类型而不重新命名列的最简单方法是转到数据源编辑器的“列”页面,取消勾选,然后勾选可用外部列的顶部勾选框。这将取消选择所有列并重新选择它们,同时刷新元数据。将鼠标悬停在下方列出的External\Output列名上,可以轻松确认这一点
首先强制转换为varchar(10),然后添加2个字符第一次强制转换为varchar(10),然后添加2个字符我知道这就是问题所在。问题是,由于垃圾数据,脚本必须清除一些日期。我不能只是CONVERT
,因为它可能会因为没有足够的用户输入验证而轰炸查询,即2/29/2015
不是日期。我会试试你的其他建议,然后再给你回复。谢谢。所以我用空格CAST(myDateCol+''作为varchar(10))
填充了我的专栏,它仍然保留为varchar(8)
。然后我将名称,CAST(myDateCol作为varchar(10))更改为DATECOL
,并将其正确映射为varchar(10)
。这是我的最后一个问题,手动强制
。所以,虽然你的答案不是正确的,但它确实让我有了不同的想法,为此,我感谢你。我喜欢遗传的混乱。可能会创建一个真实的DATE
列(可为空),然后尝试填充,捕捉错误,并提出一些标准(2/29/15=>2/28/15)。事实上,混乱太多了。不过,我喜欢这个建议,并尝试了一下<代码>IIF(ISDATE(DOB)=1,演员阵容(DOB为日期),空)
就像一个符咒。唯一的问题是我必须记录上一个值,这意味着在查询中再次选择实际值,但我不必扩展字符串。一个有趣的旁注,在我得到要取消粘贴的列大小后,它现在随着