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 如何修复错误:更新@tentable字段时的多部分ID_Sql Server_Tsql_Sql Server 2008_Merge_Sql Merge - Fatal编程技术网

Sql server 如何修复错误:更新@tentable字段时的多部分ID

Sql server 如何修复错误:更新@tentable字段时的多部分ID,sql-server,tsql,sql-server-2008,merge,sql-merge,Sql Server,Tsql,Sql Server 2008,Merge,Sql Merge,我想将@TENTABLE与tableA进行比较,如果匹配,则更新@TENTABLE的FieldValue等于tableA的id;如果不匹配,则插入值,并获取tableA的id以更新@Entable的FieldValue 以下是我的SQL查询: create table [dbo].[TableA]([Id] int Indentity(1,1),[Data] [sql_variant] NULL) declare @tempTable table (FieldValue nvarchar(10

我想将@TENTABLE与tableA进行比较,如果匹配,则更新@TENTABLE的FieldValue等于tableA的id;如果不匹配,则插入值,并获取tableA的id以更新@Entable的FieldValue

以下是我的SQL查询:

create table [dbo].[TableA]([Id] int Indentity(1,1),[Data] [sql_variant] NULL)

declare @tempTable table (FieldValue nvarchar(1000),FieldType nvarchar(1000))
insert @tempTable values ('some content','A Type') 

merge
    tableA
using (
    select 
        FieldValue
    from
        @tempTable
) x
on tableA.[Data] = x.FieldValue
when not matched then  
    insert values (x.FieldValue)
when matched then   
    update set x.FieldValue = tableA.[Id] ;
以下是错误消息:

无法绑定多部分ID“x.FieldValue”


这个错误看起来像是x.FieldValue和tableA.id之间的不同数据类型,所以我将它们调整为相同的数据类型,但它仍然不起作用,我不知道如何修复它。

您想实现什么?您的目标表是
表A
,您的源表是x别名子查询

下次请尝试创建一个。我不得不稍微修改您的代码,但您将得到ghist:

declare @TableA TABLE([Id] int,[Data] [sql_variant] NULL)

declare @tempTable table (FieldValue nvarchar(1000),FieldType nvarchar(1000))
insert @tempTable values ('some content','A Type'); 

merge
    @tableA a
using (
    select 
        FieldValue
    from
        @tempTable
) x
on a.[Data] = x.FieldValue
when matched then   
    update set a.id = x.FieldValue; --fields swapped, probably not really your intention...
重点是:您的代码尝试更新源表的字段。
MERGE
的总体思路是

  • 我们以一个表为目标,在其中插入/更新/删除一些记录
  • 我们使用第二组数据来比较和使用这些操作
  • 我们在源中找到目标->
    INSERT中缺少的行
  • 我们在源中找到行,这些行存在于目标->
    更新
  • 我们在目标中找到源->
    删除
    中缺少的行

这么说,我怀疑上面的代码是否需要合并…

下面的代码可以达到我想要的结果

merge
  tableA
using (
  select 
    FieldValue
  from
    @tempTable
) x
on tableA.[Data] = x.FieldValue
when not matched then
  insert values (x.FieldValue);

update @tempTable
set t.FieldValue = i.[Id]
from @tempTable t
  join TableA i ON i.[Data] = t.FieldValue

select * from @tempTable

要添加到Schnugo的响应中,您要更新的表是tableA。您无法更新x中的列(这是@tentable)。谢谢,我修复了我的问题,并将文字分开。