我有一个更新语句在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
答案 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中一样。
以下包模拟您所描述的问题集
以下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任务以重新生成源数据。您可以在以下屏幕截图中查看我的原始数据和更正的数据。