Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为SQL Server转换MS Access查询_Sql_Sql Server_Tsql_Ms Access_Sql Update - Fatal编程技术网

为SQL Server转换MS Access查询

为SQL Server转换MS Access查询,sql,sql-server,tsql,ms-access,sql-update,Sql,Sql Server,Tsql,Ms Access,Sql Update,我正在尝试重新创建在MS Access中完成的查询,现在正在SQL Server环境中处理。我知道有些SQL语法在Access中与在SQL Server中不同。网上有没有什么地方可以指出主要的差异,或者有助于将一个差异转化为另一个差异 这是一个我需要更新以在SQL Server中使用的查询: UPDATE dbo.TPR00100 INNER JOIN ( dbo.UPR10302 LEFT JOIN dbo.B3980280 ON dbo.TPR10302.CO

我正在尝试重新创建在MS Access中完成的查询,现在正在SQL Server环境中处理。我知道有些SQL语法在Access中与在SQL Server中不同。网上有没有什么地方可以指出主要的差异,或者有助于将一个差异转化为另一个差异

这是一个我需要更新以在SQL Server中使用的查询:

  UPDATE
    dbo.TPR00100
  INNER JOIN (
    dbo.UPR10302
    LEFT JOIN dbo.B3980280 ON dbo.TPR10302.COMPTRNM = dbo.B3980280.COMPTRNM
  ) ON dbo.TPR00100.STAFFID = dbo.TPR10302.STAFFID
  SET
    dbo.B3980280.COMPTRNM = dbo.TPR10302.comptrnm,
    dbo.B3980280.BI_LOC_ID = dbo.TPR00100.locatnid
  WHERE
    (((dbo.B3980280.COMPTRNM) Is Null))

对于此查询,在SQL Server事务中需要以不同方式处理的关键方面有哪些?

如果您觉得使用可更新的CTE很方便:

with cte as (
    select
        b39.comptrnm b39_comptrnm
        b39.bssi_loc_id b39_bssi_loc_id,
        tpr.comptrnm tpr_comptrnm,
        tpr.locatnid tpr_locatnid
    from dbo.tpr00100 tpr
    inner join dbo.upr10302 upr on tpr.staffid = upr.staffid
    inner join dbo.b3980280 b39 on tpr.comptrnm = b39.comptrnm
    where b39_comptrnm is null
)
update cte 
set b39_comptrnm = tpr_comptrnm, b39_bssi_loc_id = tpr_locatnid

注意:我不太清楚为什么要更新的表在原始查询中是
left join
ed,所以我将其改为`内部联接。

注意,这个
left join
可能是故意的。T-SQL中的
MERGE
相当于Access中带有
LEFT JOIN的
UPDATE
。Access中带有外部联接的
更新
查询将自动在不匹配的行上创建新行。是的,虽然我没有编写原始Access查询,但我认为这是有意的。旁白:每当我在将代码从一种SQL方言翻译成另一种SQL方言时,我都会发现搜索“@EricBrandt是的,在Access中没有
UPDATE
PIVOT
。T-SQL没有真正的等价物。
更新
可能必须重写为3个单独的
更新
/
合并
查询如果它涉及多个表,则只能使用动态SQL处理
透视