我有一个元数据(column_struct
)表,其中包含column_name
,table_name
和data_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
)
感谢您的帮助。
答案 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
的方式对我来说似乎没有任何意义?