【问题标题】:Retrieve all rows from all database tables with "Where" condition从具有“Where”条件的所有数据库表中检索所有行
【发布时间】:2015-01-19 18:11:03
【问题描述】:

我有一个包含 60 个表的数据库。在其中一些表中,我有一个名为“Open”的位列,如果记录未被用户使用(用户从 C# 应用程序访问数据库),则存储 0,如果记录正在使用,则存储 1。 好吧,我需要从数据库中“open”列值为 true 或 1 的所有表中获取所有记录。

这有可能吗?

【问题讨论】:

  • 你所有的表都有相同的列吗?
  • 没有,但他们有“打开”列
  • 我猜你需要动态 sql 来遍历具有特定列的所有表,但我不知道该怎么做。
  • sp_MSforeachtable 可能会有所帮助。或者您可以查询 INFORMATION_SCHEMA.COLUMNS 并构建一个查询字符串以使用 sp_executesql() 执行。
  • 重点是什么?您打算如何处理 60 个表中的一些行?

标签: c# sql sql-server conditional-statements


【解决方案1】:

以下是未记录的 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'')'

【讨论】:

    【解决方案2】:

    获取数据库中表列表的快速代码。使用游标循环检查答案,他们有名为 [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 usp_BulkTableOpenReport”,然后遍历表输出。

    【讨论】:

    • 嗨斯蒂芬,我怎样才能把它放到 SP 中?
    • 将原始答案更新为存储过程。现在您可以通过 SQL 或 C# 调用它,只需 'exec usp_BulkTableOpenReport'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2020-11-21
    相关资源
    最近更新 更多