我应该是一个简单的任务 - 使用执行SQL任务中的ResultSet填充用户变量
SELECT MainID FROM TableA WHERE TableA_ID = 1`
(这只会返回一列和一行)。
MainID当前存储为数据库中的用户定义数据类型。该值以XXXX.Y格式存储(例如8008.1)。
如果我将UserVariable更改为String数据类型,我可以在没有任何问题的情况下分配值,无论是CASTing还是将ResultSet转换为STRING / NUMERIC / FLOAT。
SELECT CAST(MainID as NUMERIC(9,1)) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CAST(MainID as FLOAT) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CAST(MainID as VARCHAR(10)) as 'MainID' FROM TableA WHERE TableA_ID = 1;
或
SELECT CONVERT(NUMERIC(9,1), MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CONVERT(FLOAT, MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1;
SELECT CONVERT(VARCHAR(10), MainID) as 'MainID' FROM TableA WHERE TableA_ID = 1;
但是,如果用户变量数据类型为DOUBLE,则无法分配值。我收到以下错误消息:
[执行SQL任务]错误:分配值时发生错误 变量“dUserVariable”:“赋值给的值的类型 变量“User :: dUserVariable”与当前变量类型不同。 变量在执行期间可能不会更改类型。变量类型是 strict,除了Object类型的变量。 ”
我对SSIS相当陌生,所以我对如何让这种转换有点困惑。
有什么想法吗?
答案 0 :(得分:2)
我不确定以下选项是否适用于Web Service Task,但您可以尝试一下。
我认为您所描述的问题是由于SSIS在将数值分配给数据类型Double
的SSIS包变量时的限制。如果报告了此问题,请参阅this link到MSDN Connect。
以下是一个简单的分步示例,说明了您可以尝试的选项。此示例是在SSIS 2008 R2
。
创建SSIS包。我在开头的YYYYMMDD_hhmm格式中命名了包,然后是SO代表Stack Overflow,后面是SO问题ID,最后是描述。这对我来说很容易在以后再提到。请参阅屏幕截图#1 。
在包上,创建两个变量,即StringValue
和DoubleValue
。将变量 StringValue 设置为数值(例如 0 )。这是必要的,以便我们将在变量DoubleValue中配置的表达式不会出错。选择变量 DouleValue ,然后按 F4 查看属性。将属性 EvaluateAsExpression 设置为True
,并将 Expression 属性设置为(DT_DECIMAL, 2) @[User::StringValue]
NOTE:
此时变量DoubleValue上的数据类型将更改为单元格不是字符串。请参阅屏幕截图#2 和#3 。
在包上,为某个SQL Server数据库创建一个OLE DB连接管理器。我已经在本地计算机上创建了与Adventure Works数据库的连接。请参阅屏幕截图#4 。
在“控制流”标签上,放置Execute SQL Task
并按照屏幕截图#5 和#6 所示进行配置。双击“执行SQL任务”以执行“执行SQL任务编辑器”。将ResultSet设置为SingleRow
,因为我们将只获取一个值。将连接字符串设置为OLE DB连接管理器。 SQL语句应设置为SELECT CAST('3.14' AS NUMERIC(10,2)) AS ValueOfPi
。结果集应设置为变量StringValue
。
在“控制流”选项卡上,在“执行SQL任务”之后放置Script Task
。此脚本任务只是为了显示由于我们刚配置的表达式而将分配给 DoubleValue 变量的值。双击脚本任务以启用脚本任务编辑器。单击编辑脚本... 按钮以启用VSTA编辑器。使用脚本任务代码部分下给出的代码替换Main()方法。请参阅屏幕截图#7 和#8 。
执行包。变量 DoubleValue 中的值应显示在消息框中。请参阅屏幕截图#9 。
希望有所帮助。
脚本任务代码:
C#代码,只能在 SSIS 2008 and above
中使用。
public void Main()
{
Variables varCollection = null;
Dts.VariableDispenser.LockForWrite("User::DoubleValue");
Dts.VariableDispenser.GetVariables(ref varCollection);
MessageBox.Show(varCollection["User::DoubleValue"].Value.ToString());
Dts.TaskResult = (int)ScriptResults.Success;
}
<强>截图:强>
<强>#1:强>
<强>#2:强>
<强>#3:强>
<强>#4:强>
<强>#5:强>
<强>#6:强>
<强>#7:强>
<强>#8:强>
<强>#9:强>