第一個問題是,您沒有使用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