我有以下查询添加禁令。 但是为了添加,我想检查这个密钥是否已被使用?
ALTER TABLE HL7_MessageHierarchy
ADD CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType)
REFERENCES HL7_MessageType(vMessageType);
例如,。如果我必须添加一列,我可以很容易地检查该表是否存在于sysobjects中,并且它的相应列是否存在于syscolumns中。
是否可以在没有GO的情况下多次使用查询并且确实没有出现任何错误?如果是,那么如何???
[编辑]
我不知道为什么我的浏览器不允许我添加评论,所以我要添加到编辑。
我想检查是否存在任何具有相同名称的外键。因此,如果没有数据,那么查询可能会产生问题,因为密钥可能已经存在。我想运行上面的脚本干净(当然常驻数据确实很重要,但这可能是一个直接的检查?) [编辑]
我的坏,我一定知道这个版本很重要......我相信它的2005年...(很想知道是否有人可以告诉其他版本)
答案 0 :(得分:3)
我认为你的意思是
检查HL7_MessageHierarchy中的值不是inHL7_MessageType“
所以,这样的查询会告诉你
SELECT *
FROM HL7_MessageHierarchy H
WHERE NOT EXISTS (SELECT *
FROM HL7_MessageType T
WHERE H.vMessageType = T.vMessageType)
另外,我建议使用WITH CHECK
ALTER TABLE HL7_MessageHierarchy WITH CHECK ADD
CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType)
REFERENCES HL7_MessageType(vMessageType);
答案 1 :(得分:2)
在SQL 2005中,检查对象是否存在的推荐方法是Catalog Views。你想要的是sys.foreign_keys
:
IF NOT EXISTS ( SELECT * FROM sys.foreign_keys
WHERE name = 'fk_vMessageType' )
BEGIN
EXEC ('
ALTER TABLE HL7_MessageHierarchy
ADD CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType)
REFERENCES HL7_MessageType(vMessageType)
')
END
我已将创建包装在EXEC
中,以避免混淆解析器。