Tôi đã viết một đoạn mã SQL (dường như) thẳng về phía trước để giảm một cột sau khi nó đảm bảo cột tồn tại.
Vấn đề: nếu cột KHÔNG tồn tại, mã bên trong mệnh đề IF than phiền rằng nó không thể tìm thấy cột! Vâng, doh, đó là lý do tại sao nó nằm trong mệnh đề IF!
Vì vậy, câu hỏi của tôi là, tại sao một đoạn mã không nên được thực hiện cho lỗi?Tại sao một khối T-SQL đưa ra một lỗi ngay cả khi nó thậm chí không nên được thực hiện?
Sau đây là đoạn:
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
... và đây là lỗi:
Error executing SQL script [...]. Invalid column name 'timeout'
Tôi đang sử dụng Microsoft SQL Server 2005 Express Edition.
Đúng. Bạn cũng sẽ nhận được lỗi này nếu có các bảng tạm thời nằm xung quanh mà sproc sử dụng. – ConcernedOfTunbridgeWells
Để làm rõ, nếu một bảng tạm thời tồn tại thì các cột sẽ được kiểm tra khi bạn biên dịch sproc. Trường hợp sproc thực sự tạo bảng (ví dụ với một lựa chọn vào), bạn có thể cần phải thả bảng trước khi biên dịch lại sproc. – ConcernedOfTunbridgeWells
Đây là câu trả lời rất hay :) –