SQL Update语句适用于SSMS,但不适用于SSIS

时间:2014-02-06 18:52:24

标签: sql sql-server sql-server-2008 ssis sql-update

我有一个更新语句在SQL Server Management Studio中正常工作但在SSIS中的执行SQL任务中使用时无法正常运行。有谁知道为什么它不会在那里工作?

代码遵循:

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

2 个答案:

答案 0 :(得分: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

尝试表示显式架构

还要检查您是否有足够的权限

答案 1 :(得分: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