2013-08-20 47 views
1

我有一個表的一些列是bit數據類型。我只需要選擇[BIT]數據類型列和值[TRUE]SQL Server 2008選擇某些列有特定的數據

我有以下代碼來從給定的表中只選擇[BIT]列。

SELECT 
    OBJECT_NAME(c.OBJECT_ID) TableName, c.name ColumnName 
FROM 
    sys.columns AS c 
JOIN 
    sys.types AS t ON c.user_type_id= t.user_type_id 
JOIN 
    sys.all_objects as o ON o.object_id = c.object_id 
WHERE 
    t.name = 'bit' 
    AND o.name = 'TABLENAME' --this is the table name 
ORDER BY 
    c.OBJECT_ID 
GO 

請告訴我如何只有那些選擇以[TRUE]值

感謝

+0

列沒有值 - 記錄做。它可能有助於提供樣本數據和預期結果。 –

+1

「sys」模式中的表爲您的表提供元數據,但不包含表的行數據。如果你想查詢你的表中的數據,你需要回到你的表。 –

+0

是的,我知道,我需要知道如何去做。 –

回答

2

您可以在查詢中使用動態sql和臨時表來將位類型的列的值返回爲true或false。 希望這有助於。

DECLARE @SQL nvarchar(max) 
SET @SQL='DECLARE @TempTable table (Value bit,Table_Column nvarchar(500))' 
SELECT @[email protected]+';INSERT @TempTable (Value,Table_Column) SELECT '+c.name + ','' '+c.name + ' - ' + o.name + 
    ''' FROM [' 
     +o.name + ']' 
     FROM sys.columns AS c 
JOIN sys.types AS t ON c.user_type_id=t.user_type_id 
join sys.all_objects as o on o.object_id = c.object_id 
WHERE t.name = 'bit' 
and o.name = 'TABLENAME' --this is the table name 
ORDER BY c.OBJECT_ID -- columns 

SET @[email protected]+';SELECT Table_Column,Value= CASE Value WHEN 0 THEN ''False'' When 1 THEN ''True'' end FROM @TempTable;' 
print @SQL 
EXEC (@SQL) 
+0

我正在嘗試你的解決方案作爲最後的手段,但你很優秀。你做得比我預期的要好。我現在需要的只是在代碼中添加一些where子句。謝謝。 –

+0

很高興它解決了 – SoftwareCarpenter

1

這不能做。 Sys模式只包含有關數據庫中對象的信息,而不包含表中的記錄。

可能做到這一點的唯一方法是獲取您擁有的信息,並循環訪問數據庫中的每個表名,打開每個表,您的上面引用的視圖返回並使用「WHERE ColumnName <>'NULL'」循環視圖中的限定符。

+0

我提供了示例代碼,僅供參考,並且我知道sys架構僅包含有關對象的信息。我需要知道它是否有用。 –

+0

就像我說過的,你可以使用返回的表名,這樣你就可以確切地知道要檢查的表和列。但是,您仍然必須循環訪問數據庫並查詢每個表以瞭解該列是設置爲True還是False。這絕對是正確的起點。 –

+0

如何將對象名稱[系統名稱]與查詢返回的varchar值進行比較 –

相關問題