我有一個包含60個表的數據庫。在其中一些表中,我有一個名爲「Open」的列,如果記錄未被用戶使用(用戶從C#應用程序訪問數據庫),則存儲0,如果記錄正在使用,則存儲1。 那麼,我需要從我的數據庫中的所有表中的「開放」列值爲真,或1獲得所有記錄。或者,這是甚至可以做到的嗎?使用「Where」條件檢索所有數據庫表中的所有行
這甚至有可能嗎?
我有一個包含60個表的數據庫。在其中一些表中,我有一個名爲「Open」的列,如果記錄未被用戶使用(用戶從C#應用程序訪問數據庫),則存儲0,如果記錄正在使用,則存儲1。 那麼,我需要從我的數據庫中的所有表中的「開放」列值爲真,或1獲得所有記錄。或者,這是甚至可以做到的嗎?使用「Where」條件檢索所有數據庫表中的所有行
這甚至有可能嗎?
在您的數據庫中獲取表的列表的快速代碼。使用遊標循環遍歷答案,檢查它是否具有名爲[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」 然後循環。
如果你把它放到一個存儲過程中,你可以通過簡單的調用這個存儲過程「exec usp_show」然後在你的C#應用程序步驟中通過結果集訪問它。 – 2014-11-21 15:24:24
http://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx – 2014-11-21 15:27:10
嗨,斯蒂芬,我怎麼能把這個成SP? – Reznor13 2014-11-27 17:18:18
這裏有一個簡單的使用無證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'')'
做所有的表具有相同的列? – Lamak 2014-11-21 14:53:13
我猜你需要動態SQL,以循環所有表與一個特定的列,但我不知道該怎麼做。 – Mihai 2014-11-21 14:55:30
不,但他們有「打開」列 – Reznor13 2014-11-21 14:55:30