0

我有一个简单的任务 - 使用 Execute SQL 任务中的 ResultSet 填充用户变量

SELECT MainID FROM TableA WHERE TableA_ID = 1` 

(这只会返回一列和一行)。

MainID 当前作为用户定义的数据类型存储在数据库中。该值以 XXXX.Y 格式存储(例如 8008.1)。

如果我将 UserVariable 更改为 String 数据类型,我可以毫无问题地分配该值,将 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”的值的类型与当前变量类型不同。变量在执行期间可能不会更改类型. 变量类型是严格的,除了 Object 类型的变量。”。

我对 SSIS 还很陌生,所以我对如何进行这种转换有点困惑。

有任何想法吗?

4

1 回答 1

2

我不确定以下选项是否适用于 Web Service Task,但您可以尝试一下。

我认为您所描述的问题是由于 SSIS 在将数值分配给数据类型的 SSIS 包变量时存在限制Double。请参考此链接到报告此问题的 MSDN Connect。

这是一个简单的分步示例,说明了您可以尝试的选项。此示例创建于SSIS 2008 R2.

创建一个 SSIS 包。我在开头以 YYYYMMDD_hhmm 格式命名了包,然后是 SO 代表 Stack Overflow,然后是 SO 问题 ID,最后是描述。这是为了让我以后可以轻松地引用它。请参阅屏幕截图#1

在包上,创建两个变量,即StringValueDoubleValue。将变量StringValue设置为数值(比如0)。这是必要的,这样我们将在变量 DoubleValue 中配置的表达式不会出错。选择变量DouleValue并按F4查看属性。将属性EvaluateAsExpression设置为True并将Expression属性设置为(DT_DECIMAL, 2) @[User::StringValue] NOTE:此时变量 DoubleValue 上的数据类型将更改为Cell is not a string。请参阅屏幕截图#2#3

在包上,为某些 SQL Server 数据库创建一个 OLE DB 连接管理器。我创建了与本地计算机上的 Adventure Works 数据库的连接。参考截图#4

在 Control Flow 选项卡上,放置Execute SQL Task并配置它,如屏幕截图#5#6所示。双击执行 SQL 任务以显示执行 SQL 任务编辑器。将 ResultSet 设置为,SingleRow因为我们将只获取一个值。将连接字符串设置为 OLE DB 连接管理器。SQL 语句应设置为SELECT CAST('3.14' AS NUMERIC(10,2)) AS ValueOfPi. 结果集应该设置为变量StringValue

在控制流选项卡上,Script Task在执行 SQL 任务之后放置一个。此脚本任务只是显示由于我们刚刚配置的表达式而将分配给DoubleValue变量的值。双击脚本任务以打开脚本任务编辑器。单击Edit Script...按钮以打开 VSTA 编辑器。用脚本任务代码部分下给出的代码替换 Main() 方法。请参阅屏幕截图#7#8

执行包。变量DoubleValue中的值应显示在消息框中。参考截图#9

希望有帮助。

脚本任务代码:

只能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:

1

#2:

2

#3:

3

#4:

4

#5:

5

#6:

6

#7:

7

#8:

8

#9:

9

于 2011-07-27T15:42:59.810 回答