第一个问题是,您没有使用ansi标准连接语法。打破这种习惯并编写可维护的代码。
你也没有指定你的模式。再次,一个坏习惯打破自己。
但是,该查询在SSIS中的工作情况良好,就像在SSMS中一样。
Sample fiddle
下包模拟作为问题集
你描述了以下Biml被用来生成包。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<!-- http://sqlfiddle.com/#!6/53b0c/1 -->
<!-- http://stackoverflow.com/questions/21611485/sql-update-statement-works-in-ssms-but-not-in-ssis -->
<Connections>
<OleDbConnection Name="CM_OLEDB" ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;"></OleDbConnection>
</Connections>
<Packages>
<Package ConstraintMode="Linear" Name="so_21611485">
<Variables>
<Variable DataType="String" Name="QueryDDL" EvaluateAsExpression="true">"
IF NOT EXISTS(SELECT * FROM sys.tables AS T WHERE T.name = 'AU_DETAILS')
BEGIN
CREATE TABLE AU_DETAILS
(
GroupName varchar(10)
, AU int
);
END
IF NOT EXISTS(SELECT * FROM sys.tables AS T WHERE T.name = 'AU_DETAILS')
BEGIN
CREATE TABLE AU_XREF
(
AU int
, MAP_VALUE varchar(10)
);
END;
INSERT INTO dbo.AU_DETAILS
(GroupName, AU)
VALUES
('',0)
, (' %',1)
, ('This works',2);
INSERT INTO dbo.AU_XREF
(AU, MAP_VALUE)
VALUES
(0, 'A')
, (1, 'B')
, (2, 'C');"</Variable>
<Variable DataType="String" Name="QueryUpdate" EvaluateAsExpression="true">"
UPDATE AU_DETAILS
SET
AU_DETAILS.GroupName =
CASE
WHEN AU_DETAILS.GroupName = '' THEN 'L&I'
WHEN AU_DETAILS.GroupName = ' %' THEN 'L&I'
ELSE AU_XREF.MAP_VALUE
END
FROM
AU_XREF
, AU_DETAILS
WHERE
AU_DETAILS.AU = AU_XREF.AU"</Variable>
</Variables>
<Tasks>
<ExecuteSQL ConnectionName="CM_OLEDB" Name="SQL Generate Schema">
<VariableInput VariableName="User.QueryDDL" />
</ExecuteSQL>
<ExecuteSQL ConnectionName="CM_OLEDB" Name="SQL Update works fine">
<VariableInput VariableName="User.QueryUpdate" />
</ExecuteSQL>
</Tasks>
</Package>
</Packages>
</Biml>
我跑的包来完成,然后重新运行所述第一执行SQL任务以再生源数据。您可以在下面的屏幕截图中看到我的原始数据和更正的数据。
并且失败,错误信息是? – billinkc
没有错误信息(没有说它失败,只是没有正常工作)...只是不改变相应数据的值。它在从SSMS执行时执行,但不是从SSIS – SteveAnselment
或更多执行到点...问题是Details.GroupName是空白或有空间开始,它不会用'L&I'替换值。但是,它确实可以帮助所有其他人将其值更改为XREF.MAP_VALUE中的值。 – SteveAnselment