2014-02-06 84 views
1

我有一個更新語句在SQL Server Management Studio中正常工作,但在SSIS中的執行SQL任務內部使用時無法正確運行。任何人都不知道爲什麼它不會在那裏工作?SQL更新聲明適用於SSMS,但不適用於SSIS

代碼如下:

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 
+1

並且失敗,錯誤信息是? – billinkc

+0

沒有錯誤信息(沒有說它失敗,只是沒有正常工作)...只是不改變相應數據的值。它在從SSMS執行時執行,但不是從SSIS – SteveAnselment

+0

或更多執行到點...問題是Details.GroupName是空白或有空間開始,它不會用'L&I'替換值。但是,它確實可以幫助所有其他人將其值更改爲XREF.MAP_VALUE中的值。 – SteveAnselment

回答

2

第一個問題是,您沒有使用ansi標準連接語法。打破這種習慣並編寫可維護的代碼。

你也沒有指定你的模式。再次,一個壞習慣打破自己。

但是,該查詢在SSIS中的工作情況良好,就像在SSMS中一樣。

Sample fiddle

下包模擬作爲問題集

enter image description here

你描述了以下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&amp;I' 
      WHEN AU_DETAILS.GroupName = ' %' THEN 'L&amp;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任務以再生源數據。您可以在下面的屏幕截圖中看到我的原始數據和更正的數據。

enter image description here

2

我換成查詢這個

UPDATE AD 
SET AD.GroupName = 
CASE WHEN AD.GroupName = '' THEN 'L&I' 
WHEN AD.GroupName LIKE ' %' THEN 'L&I' 
ELSE AX.MAP_VALUE END 

FROM <schema>.AU_XREF AX 
JOIN <schema>.AU_DETAILS AD on AD.AU = AX.AU 

嘗試表示明確的架構

還要檢查,如果你有足夠的權限

相關問題