2013-05-22 33 views
15

Tôi đang sử dụng câu lệnh SQL server được nhúng trong một số mã C# khác; và chỉ muốn kiểm tra xem cột có tồn tại trong bảng của tôi hay không.Sử dụng câu lệnh CASE để kiểm tra xem cột có tồn tại trong bảng hay không - SQL Server

Nếu cột (ModifiedByUSer đây) không tồn tại sau đó tôi muốn trở lại một hoặc một đúng; nếu không thì tôi muốn trả lại một số hoặc false (hoặc cái gì đó tương tự có thể được diễn giải trong C#).

Tôi đã có như xa như sử dụng một lệnh CASE như sau:

SELECT cast(case WHEN EXISTS (select ModifiedByUser from Tags) 
      THEN 0 
      ELSE 1 
      END as bit) 

Nhưng nếu ModifiedByUser không tồn tại sau đó tôi nhận được một invalid column name, thay vì giá trị trả về.

Tôi cũng đã xem xét:

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tags' AND COLUMN_NAME = 'ModifiedByUser') 
    BEGIN // Do something here to return a value 
    END 

Nhưng không biết làm thế nào để có điều kiện trả về giá trị/bool/bit dựa trên kết quả. Bất kỳ trợ giúp nào được đánh giá cao!

+0

Như bạn đã khám phá, tốt nhất là thêm câu trả lời bên dưới câu hỏi, để duy trì định dạng trả lời câu hỏi chuẩn. Cảm ơn bạn đã thêm nó! – halfer

Trả lời

20

câu trả lời cuối cùng là một sự kết hợp của hai điều trên (Tôi đã upvoted cả hai để thể hiện sự đánh giá cao của tôi!):

select case 
    when exists (
     SELECT 1 
     FROM Sys.columns c 
     WHERE c.[object_id] = OBJECT_ID('dbo.Tags') 
     AND c.name = 'ModifiedByUserId' 
    ) 
    then 1 
    else 0 
end 
+1

Vì bài đăng gốc được đề cập bằng cách sử dụng một cái gì đó như C# để làm việc với kết quả, tôi sẽ đề xuất cũng đúc giá trị cho bit trong sql. Bằng cách đó C# thực sự có thể làm việc với giá trị trả về như một bool. – BVernon

11
select case 
     when exists (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Tags' AND COLUMN_NAME = 'ModifiedByUser') 
     then 0 
     else 1 
     end 
+0

Cảm ơn câu trả lời, nhưng có vẻ như luôn luôn quay trở lại 1, cho dù cột có hiện diện hay không. – WheretheresaWill

+0

Tôi đã kết hợp câu trả lời của bạn với câu trả lời dưới đây và có vẻ như hoạt động: 'chọn trường hợp khi tồn tại (SELECT 1 FROM Sys.columns c WHERE c. [Object_id] = OBJECT_ID ('dbo.Tags') AND c.name = 'ModifiedByUserId') sau đó 1 else 0 end' – WheretheresaWill

1

Hãy thử này -

SELECT * 
FROM ... 
WHERE EXISTS(SELECT 1 
     FROM sys.columns c 
     WHERE c.[object_id] = OBJECT_ID('dbo.Tags') 
      AND c.name = 'ModifiedByUser' 
    ) 
+0

@table_name như 'dbo.table1' – Devart

+0

Tôi làm cách nào để sử dụng? Xin lỗi không quen thuộc với SQL và điều này là khó khăn để có được đầu của tôi xung quanh. – WheretheresaWill

+0

Tôi đã kết hợp câu trả lời của bạn với câu trả lời ở trên và có vẻ như hoạt động: 'chọn trường hợp khi tồn tại (SELECT 1 FROM Sys.columns c WHERE c. [Object_id] = OBJECT_ID ('dbo.Tags') AND c.name = 'ModifiedByUserId') sau đó 1 else 0 end' – WheretheresaWill

1

Bạn có thể kiểm tra trong hệ thống 'lập bản đồ cột bảng' bảng

SELECT count(*) 
    FROM Sys.Columns c 
    JOIN Sys.Tables t ON c.Object_Id = t.Object_Id 
WHERE upper(t.Name) = 'TAGS' 
    AND upper(c.NAME) = 'MODIFIEDBYUSER' 
+0

Cảm ơn nhưng điều này cho tôi một ** Tên cột không hợp lệ 'Table_Name' ** cho dòng 4. Mọi ý tưởng tại sao? – WheretheresaWill

+0

@WheretheresaWill .. My Bad .. Tôi đã thay đổi và sửa chữa truy vấn .. bây giờ kiểm tra –

3
SELECT * 
FROM ... 
WHERE EXISTS(SELECT 1 
     FROM sys.columns c 
     WHERE c.[object_id] = OBJECT_ID('dbo.Tags') 
      AND c.name = 'ModifiedByUser' 
    ) 
+1

cảm ơn chỉnh sửa radim –

Các vấn đề liên quan