Sql 此查询不起作用。我做错了什么?

Sql 此查询不起作用。我做错了什么?,sql,sql-server,Sql,Sql Server,我正在编写一个自动任务的更新,该任务用于同步来自不同应用程序的同一数据库中两个不同表的数据。该脚本的原始版本是用ColdFusion编写的,工作非常好,但我想用SQL重写部分代码以提高性能。原始代码脚本采用ColdFusion,如下所示: <cfquery name="getIMSIToUpdate" datasource="mydsn"> SELECT DISTINCT a.imsi, b.esn, b.parentId FROM table_a a INNER JOIN tabl

我正在编写一个自动任务的更新,该任务用于同步来自不同应用程序的同一数据库中两个不同表的数据。该脚本的原始版本是用ColdFusion编写的,工作非常好,但我想用SQL重写部分代码以提高性能。原始代码脚本采用ColdFusion,如下所示:

<cfquery name="getIMSIToUpdate" datasource="mydsn">
SELECT DISTINCT a.imsi, b.esn, b.parentId
FROM table_a a
INNER JOIN table_b b ON a.imsi = b.termPhone
WHERE (a.parentID IS NULL OR a.parentID = '')
</cfquery>

<cfloop query="getIMSIToUpdate">
<cfquery name="updtIMSIParentIdEsn" datasource="mydsn">
    UPDATE table_a
    SET esn = <cfqueryparam cfsqltype="cf_sql_varchar" value="#Trim(getIMSIToUpdate.esn)#" null="#NOT Len(Trim(getIMSIToUpdate.esn))#" />
        ,parentId = <cfqueryparam cfsqltype="cf_sql_integer" value="#Trim(getIMSIToUpdate.parentId)#" null="#NOT Len(Trim(getIMSIToUpdate.parentId))#" />
    WHERE imsi = <cfqueryparam cfsqltype="cf_sql_varchar" value="#Trim(getIMSIToUpdate.imsi)#" />
</cfquery>
所以我查询表A中的记录,然后遍历返回的每个记录,并根据原始查询中从表B检索到的内容对表A的值进行更新。这是我为替换此代码而编写的SQL查询:

BEGIN
    DECLARE @update_table TABLE (imsi VARCHAR(25), esn VARCHAR(25), parentId INT);
    DECLARE @localimsi VARCHAR(25);
    DECLARE @localesn VARCHAR(25);
    DECLARE @localparentid INT;
    SELECT a.imsi, b.esn, b.parentId
    INTO "dbo"."@update_table"
    FROM dbo.table_a A
    INNER JOIN table_b B ON A.imsi = B.termPhone
    WHERE (A.parentID IS NULL OR A.parentID = '');
    WHILE (SELECT COUNT(*) FROM @update_table) <> 0
        SELECT TOP 1 
        @localimsi = imsi,
        @localesn = esn,
        @localparentid = parentid
        FROM @update_table;

        UPDATE table_a A
        SET esn = @localesn,
        parentId = @localparentid
        WHERE imsi = @localimsi;

        DELETE FROM @update_table WHERE imsi = @localimsi;
END
DROP TABLE "dbo"."@update_table";

我确信有一种方法可以自己解决这个问题,但我不熟悉SQL Server调试器的工作原理,因此我不能100%确定实际发生了什么,只能确定我认为应该发生的事情。查询会选择适当的行和值并将它们插入临时表中,但不会更新任何选定的记录。如果您对如何编写更高效的SQL脚本有更多的意见,我们将不胜感激,但如果没有模式,您将无法获得答案奖。

这有点困难,但我认为您正在更新表A,使其具有表B中的ESN和parentID,其中A.IMSI=B.termPhone,表A上的parentID为null或空

您可以使用单个查询执行此操作:

update table_a
set esn = b.esn, 
    parentid = b.termphone
from table_a a, 
     table_b b
where a.imsi = b.termphone
and (a.parentid is null
     or a.parentid = '')

这可能是一个事务处理问题吗?我在脚本中没有看到任何commit语句…@piet.t这里需要它吗?这并不是在事务标记中被阻止的,它只是一个脚本块。隐式而非显式连接的原因是什么?不是真的-我倾向于选择它们,但这是个人偏好