如何将SQL查询结果的数值赋给数据类型为Double的包变量?

时间:2011-07-27 13:43:23

标签: sql sql-server ssis types user-variables

我应该是一个简单的任务 - 使用执行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相当陌生,所以我对如何让这种转换有点困惑。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

我认为您所描述的问题是由于SSIS在将数值分配给数据类型Double的SSIS包变量时的限制。如果报告了此问题,请参阅this link到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上的数据类型将更改为单元格不是字符串。请参阅屏幕截图#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:

1

<强>#2:

2

<强>#3:

3

<强>#4:

4

<强>#5:

5

<强>#6:

6

<强>#7:

7

<强>#8:

8

<强>#9:

9