2014-11-21 61 views
0

我有一個包含60個表的數據庫。在其中一些表中,我有一個名爲「Open」的列,如果記錄未被用戶使用(用戶從C#應用程序訪問數據庫),則存儲0,如果記錄正在使用,則存儲1。 那麼,我需要從我的數據庫中的所有表中的「開放」列值爲真,或1獲得所有記錄。或者,這是甚至可以做到的嗎?使用「Where」條件檢索所有數據庫表中的所有行

這甚至有可能嗎?

+0

做所有的表具有相同的列? – Lamak 2014-11-21 14:53:13

+0

我猜你需要動態SQL,以循環所有表與一個特定的列,但我不知道該怎麼做。 – Mihai 2014-11-21 14:55:30

+0

不,但他們有「打開」列 – Reznor13 2014-11-21 14:55:30

回答

1

在您的數據庫中獲取表的列表的快速代碼。使用遊標循環遍歷答案,檢查它是否具有名爲[open]的fld,如果它執行了構建SQL語句並執行此SQL字符串。

CREATE PROCEDURE usp_BulkTableOpenReport 
AS 
BEGIN 

    DECLARE @TBLS AS TABLE (REF INT IDENTITY (0,1), TABLENAME NVARCHAR(100), TABLEID BIGINT); 
    DECLARE @TBL AS NVARCHAR(100); 
    DECLARE @TBLID AS BIGINT; 
    DECLARE @SQL AS NVARCHAR(MAX); 
    DECLARE @I INT = 0; 
    DECLARE @M INT = 0; 
    DECLARE @V INT = 0 

    INSERT INTO @TBLS(TABLENAME,TABLEID) 
    SELECT NAME,OBJECT_ID FROM sys.tables 

    SELECT @M = MAX(REF) FROM @TBLS 

    WHILE @I <= @M 
    BEGIN 
     SELECT @TBL = TABLENAME, @TBLID= TABLEID FROM @TBLS WHERE REF = @I 
     /* CHECK TO MAKE INSURE THAT A FLD CALLED [OPEN] EXIST. */ 
     SELECT @V = COUNT(*) FROM SYS.columns WHERE name = 'OPEN' AND OBJECT_ID = @TBLID 
     IF @V != 0 
     BEGIN 
      SET @SQL = 'SELECT * FROM [' + @TBL + '] WHERE [OPEN] = 1' 
      EXEC SP_EXECUTESQL @SQL 
     END; 
     SET @I = @I + 1 
    END; 
END 
GO 

從C#應用程序的exec通過表輸出查詢 「EXEC usp_BulkTableOpenReport」 然後循環。

+0

如果你把它放到一個存儲過程中,你可以通過簡單的調用這個存儲過程「exec usp_show」然後在你的C#應用​​程序步驟中通過結果集訪問它。 – 2014-11-21 15:24:24

+0

http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx – 2014-11-21 15:27:10

+0

嗨,斯蒂芬,我怎麼能把這個成SP? – Reznor13 2014-11-27 17:18:18

2

這裏有一個簡單的使用無證sp_MSforeachtable的:

EXEC sp_MSforeachtable 
@command1='SELECT * FROM ? WHERE Open=1', 
@whereand='AND o.id in (select object_id from sys.columns c where c.name=''Open'')' 
相關問題