我编写了一个T-SQL脚本来更新生产中的现有数据库。
基本上,如果列存在,脚本必须创建一个新表,将现有数据插入新表中,最后删除该列。
检查(dbo.Patient)中是否存在列 1.1创建一个新表(dbo.PatientPhoto) 1.2将数据从dbo.Patient.Photo迁移到dbo.PatientPhoto 1.3删除列dbo.Patient.Photo
如果列不存在,则不执行任何操作...
当列存在时脚本工作正常但是当列不存在时失败...看起来它进入" IF"如果列不存在,则为子句事件。
剧本:
-- Vérifier si la colonne Photo exists dans la table patient
IF EXISTS(SELECT * FROM sys.columns
WHERE Name = N'Photo' AND Object_ID = Object_ID(N'Patient'))
BEGIN
-- Vérifier si la table PatientPhoto existe et la créer si ce n'Est pas le cas
IF (NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = 'PatientPhoto'))
BEGIN
CREATE TABLE [dbo].[PatientPhoto](
Id INT IDENTITY(1,1) NOT NULL,
PatientId UNIQUEIDENTIFIER NOT NULL,
[Photo] [varbinary](max) NOT NULL
)
END
-- Vider la table PatientPhoto
DELETE FROM dbo.PatientPhoto
-- Populer la table PatientPhoto avec le contenu de la table patient
INSERT INTO PatientPhoto(PatientId, Photo)
SELECT Id, Photo FROM dbo.Patient
WHERE Photo IS NOT NULL
-- Supprimer la colonne Photo de la table patient
ALTER TABLE dbo.Patient DROP COLUMN Photo
END
答案 0 :(得分:4)
正确,SQL Server必须能够在执行之前验证您的整个查询;即使它包含一个IF语句,也会阻止它试图访问一个不存在的列。如果列不存在,它将不会执行此查询,因为它不会验证。
解决此问题的一种方法是对需要可能不存在的列的脚本部分使用动态sql,因为SQL Server在执行之前不会尝试验证动态sql。