【问题标题】:SQL Update Statement works in SSMS but not in SSISSQL 更新语句在 SSMS 中有效,但在 SSIS 中无效
【发布时间】:2014-02-06 18:52:23
【问题描述】:

我有一个更新语句在 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

【问题讨论】:

  • 而通过失败,错误信息是?
  • 没有错误信息(没有说它失败只是没有正常运行)......只是没有改变相应数据中的值。从 SSMS 执行而不是从 SSIS 执行时会这样做
  • 或更多...问题在于 Details.GroupName 为空白或有空格开头,它不会用“L&I”替换值。但是,它确实可以让所有其他人将其值更改为 XREF.MAP_VALUE 中的值。
  • 您的环境变量设置是否正确。
  • 在目标数据库中针对这两种情况运行 Profiler Trace,以验证它是否在您期望的数据库中运行,并且它正在运行您期望的 SQL。

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


【解决方案1】:

第一个问题是您没有使用 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&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 任务以重新生成源数据。您可以在以下屏幕截图中看到我的原始数据和更正后的数据。

【讨论】:

    【解决方案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
    

    尝试表示显式架构

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

    【讨论】:

      猜你喜欢
      • 2013-08-11
      • 2013-08-02
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多