我有一个包含60个表的数据库。在其中一些表中,我有一个名为“Open”的列,如果用户没有使用该记录(来自C#应用程序的用户访问DB),则存储0,如果记录正在使用,则存储1。 好吧,我需要从我的数据库中的所有表中获取“open”列值为true或1的所有记录。
这甚至可以吗?
答案 0 :(得分: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'')'
答案 1 :(得分:1)
获取数据库中表格列表的快速代码。使用游标循环检查它的答案,他们将fld命名为[open],如果它构建一个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#应用程序执行查询&#34; EXEC usp_BulkTableOpenReport&#34;然后遍历表输出。