Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 SQL Server合并,条件不合并_Sql Server_Sql Merge - Fatal编程技术网

Sql server SQL Server合并,条件不合并

Sql server SQL Server合并,条件不合并,sql-server,sql-merge,Sql Server,Sql Merge,当收集器具有与最终表不同的数据时,我尝试对我的表进行简单的更新。我正在使用下面的代码。当第一个SELECT运行时,它告诉我这两列中都有数据。在MERGE语句运行之后,我执行了新的SELECT,这两列仍然显示为NULL。合并没有更新任何内容 我把MERGE语法搞砸了吗 我的生产代码还包括不匹配时的和其他项目。这只是一个小例子来说明这个问题 选择l.Region\u名称、l.Region\u代码 从dbo.Collector_位置l 其中l.id=1038 合并到dbo.Locations中作为T

当收集器具有与最终表不同的数据时,我尝试对我的表进行简单的更新。我正在使用下面的代码。当第一个
SELECT
运行时,它告诉我这两列中都有数据。在
MERGE
语句运行之后,我执行了新的
SELECT
,这两列仍然显示为
NULL
。合并没有更新任何内容

我把
MERGE
语法搞砸了吗

我的生产代码还包括不匹配时的
和其他项目。这只是一个小例子来说明这个问题

选择l.Region\u名称、l.Region\u代码
从dbo.Collector_位置l
其中l.id=1038
合并到dbo.Locations中作为T
使用T.id=S.id上的dbo.Collector_位置
匹配和时(T.区域\名称S.区域\名称或T.区域\代码S.区域\代码)
然后
更新集T.Region\u Name=S.Region\u Name,
T.区域\代码=S.区域\代码;
选择l.区域\名称、l.区域\代码
从dbo.l
其中l.id=1038

将查询更改为容纳空值:

MERGE dbo.Locations AS T
USING dbo.Collector_Locations S 
ON T.id = S.id
WHEN MATCHED AND (ISNULL(T.Region_Name,'a') <> S.Region_Name OR ISNULL(T.Region_Code,'a') <> S.Region_Code) THEN UPDATE SET
    T.Region_Name = S.Region_Name,
    T.Region_Code = S.Region_Code;

进入
只是可选的。拥有或删除它对语句本身没有影响。我删除它只是为了确定,这没有什么区别。我只是用UPDATE语句在我的答案中添加了一个编辑…你不使用UPDATE语句的具体原因是什么?因为它是包含更多列、删除和插入的更大合并的一部分。我试图将问题分解为我能发布的最小项。您在这里使用的合并语句语法似乎没有任何问题……您确定映射变量和预期结果吗?是的。
Collector\u Locations
表的ID有两个字符串值。
Locations
表的ID中有两个列的
NULL
值。是否运行联接查询以确保ID匹配并且联接后两列中有数据?@JoeC是的,在我的示例中可以看到,我从两个表中选择了一个特定ID,并且两个表中都有数据。它只是不更新。
UPDATE dbo.Locations
SET T.Region_Name = S.Region_Name,T.Region_Code = S.Region_Code
FROM dbo.Locations T 
    INNER JOIN dbo.Collector_Locations S 
        ON T.id = S.id AND (T.Region_Name <> S.Region_Name OR T.Region_Code <> S.Region_Code)
UPDATE dbo.Locations
    SET T.Region_Name = S.Region_Name,T.Region_Code = S.Region_Code
    FROM dbo.Locations T 
        INNER JOIN dbo.Collector_Locations S 
            ON T.id = S.id