2014-02-06 47 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 

尝试表示明确的架构

还要检查,如果你有足够的权限

相关问题