2008-09-23 35 views
5

Sütun var olduğundan emin olduktan sonra bir sütun bırakan (görünüşte) düz bir SQL parçacığı yazıyordum.
Sorun: sütun mevcut değilse,'un içinde bulunan numaralı kod, bu sütunu bulamadığından şikayetçidir! Eh, doh, bu yüzden IF cümlesi içinde!
Yani benim sorum şu, neden yürütülmemesi gereken bir kod parçası hata veriyor?
Bir T-SQL bloğu neden çalıştırılmasa bile bir hata veriyor?

İşte pasajı var:

IF exists (select * from syscolumns 
    WHERE id=object_id('Table_MD') and name='timeout') 
BEGIN 
    ALTER TABLE [dbo].[Table_MD] 
     DROP COLUMN timeout 
END 
GO 

... ve burada hata var: Microsoft SQL Server 2005 Express Edition kullanıyorum

Error executing SQL script [...]. Invalid column name 'timeout'

.

cevap

10
IF exists (select * from syscolumns 
    WHERE id=object_id('Table_MD') and name='timeout') 
BEGIN 
    DECLARE @SQL nvarchar(1000) 
    SET @SQL = N'ALTER TABLE [dbo].[Table_MD] DROP COLUMN timeout' 
    EXEC sp_executesql @SQL 
END 
GO 

Sebep: SQL Server kod derlediğinde (onlar varsa) , bunlar kullanılan nesneler için kontrol . Bu kontrol prosedürü herhangi bir "IF", "WHILE", vb. Yok sayar ve koddaki tüm kullanılmış nesneleri kontrol eder. İşte

+0

Doğru. Sproc'in kullandığı etrafında geçici tablolar varsa, bu hatayı da alacaksınız. – ConcernedOfTunbridgeWells

+0

Geçici bir tablo varsa, spro'yu derlerken sütunlar kontrol edilir. Sproc aslında tabloyu oluşturduğunda (örneğin bir seçimle), spro'yu yeniden derlemeden önce tabloyu düşürmeniz gerekebilir. – ConcernedOfTunbridgeWells

+0

Bu çok iyi bir cevap :) –

0

Hiçbir zaman yürütülemeyebilir, ancak Sql Server tarafından geçerlilik için ayrıştırılır. "Etrafında olsun" tek yolu bu dinamik sql bloğunu oluşturmak için ve daha sonra seçici olarak çalıştırmak o

0

Devam etsin diye böyle kazandım: EĞER fıkra İçinde

, ben exec ('ALTER ... DROP ...')

ile ALTER ... DROP ... komutu değişti Bunu ayrıştırma SQL sunucusu kod üzerinde bir geçerlilik kontrolü yaptığında görünüyor ve görür Mevcut olmayan bir sütunun bir yere atıfta bulunulduğu (bu kod parçası hiçbir zaman idam edilmeyecek olsa bile).
exec(ute) komutunu kullanarak sorunlu kodu bir dizede sarar, ayrıştırıcı şikayet etmez ve kod yalnızca gerektiğinde yürütülür. İşte değiştirilmiş parçacık İşte:

IF exists (select * from syscolumns 
    WHERE id=object_id('Table_MD') and name='timeout') 
BEGIN 
    exec ('ALTER TABLE [dbo].[Table_MD] DROP COLUMN timeout') 
END 
GO 
0

arada, orada Oracle benzer bir konudur ve "yürütme acil" maddesini kullanarak benzer bir geçici çözüm.

İlgili konular