假设我有一个表,该表在SQL Server 2016中具有列Name, Date, StoredProcedure
我需要查询该表并遍历存储过程列,并检查该存储过程是否存在于数据库中。如果它不存在,那么我只需要将该行设置为存储过程列为空。
这是我尝试过的方法,但是不起作用
Select m1.StoredProcedure
from MyTable m1
where
IF NOT EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'StoredProcedure')
AND type IN (N'P', N'PC'))
Then Update MyTable m2
Set StoredProcedure = ''
Where m2 StoredProcedure = m1.StoredProcedure
答案 0 :(得分:5)
我怀疑您所追求的是:
UPDATE MT
SET StoredProcedure = NULL
FROM MyTable MT
LEFT JOIN sys.procedures p ON MT.StoredProcedure = p.[name]
WHERE p.object_id IS NULL;
还要注意,''
和NULL
是不同的。在示例SQL中,您有Set StoredProcedure = ''
,但是,您在问题中声明“我需要为存储过程列将此行设置为空” 。我假设,您确实想要NULL
而不是空字符串(''
)。
答案 1 :(得分:0)
尽管@Larnu的答案是正确的,但我想提供另外两个简单的方法
update mt
set StoredProcedure = NULL
from MyTable mt
where object_id('StoredProcedure') is null;
-- or
-- at the suggestion of Larnu comment
update MyTable
set StoredProcedure = case when object_id('StoredProcedure') is null then null else StoredProcedure end