根据另一个表中列的可用性更新单元格

时间:2018-08-10 07:50:58

标签: sql sql-server tsql

我有一个元数据(column_struct)表,其中包含column_nametable_namedata_type值。还有一个flag字段。

columnname  tablename   datatype   flag
------------------------------------------
desc1       sec         varchar     null
date        sec         datetime    null
sype_id     sec         int         null
s_type      sec         varchar     null
date        prod        datetime    null

我需要检查(链接的)另一台服务器中对应表(sec,prod)中是否存在每一列,并将flag的值设置为1(如果存在),并将其设置为0除此以外。我对应该如何前进感到困惑。我使用了以下查询,如果未找到列,它将更新所有flag值。

update A
set Flag=1
  from [metadata].[column_struct] A 
  where not exists( select C.name,B.name from
  [linked_server].db_name.sys.objects B
  join [linked_server].db_name.sys.columns C 
      on  B.object_id=C.object_id
  join [linked_server].db_name.sys.types D 
      on D.user_type_id=C.user_type_id
where A.tablename  =B.Name 
and A.columnname=C.name
)

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我通过类似如下的查询来解决这个问题:

CREATE TABLE #temp (tablename VARCHAR(50), columnname VARCHAR(50), flag INT);
INSERT INTO #temp SELECT 'account', 'account_status', NULL;
INSERT INTO #temp SELECT 'account', 'account_not_there', NULL;

UPDATE
    t
SET
    flag = CASE WHEN sc.[name] IS NULL THEN 0 ELSE 1 END
FROM
    #temp t
    LEFT JOIN linked_Server.remote_db_name.sys.tables st ON st.[name] = t.tablename
    LEFT JOIN linked_Server.remote_db_name.sys.columns sc ON sc.[object_id] = st.[object_id] AND sc.[name] = t.columnname;

SELECT * FROM #temp;
DROP TABLE #temp;

当我用适用于我的环境的值替换linked_server和remote_db_name时,得到的结果如下:

tablename   columnname          flag
account     account_status      1
account     account_not_there   0

...这是正确的。

这距离您的查询距离还不到一百万英里,但是您使用NOT EXISTS的方式对我来说似乎没有任何意义?