Проверить таблицу, если она не пуста, из списка таблиц в TSQL

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я хочу создать список таблиц и проверить каждую таблицу в списке, если она не пуста (т.е. должно быть заполнено). Ниже приведен псевдокод логики, но он должен быть в TSQL.

Псевдокод:

 DECLARE @ctr INT = 0

// list of table objects, how to do in TSQL
DECLARE @sourceTables = {
    src.fusion_sec_assigned_workgroup,
    src.fusion_sec_user_account,
    src.fusion_sec_user_in_organisation,
    src.BULL_OHMS_WORKGROUPS,
    src.fusion_rep_extension_request_reason,
    src.fusion_rep_extension_request_trade,
    src.fusion_rep_job_ext_request_reason,
    src.fusion_rep_job_ext_request_trade,
    src.bull_rep_audit_adhoc_jobs,
    src.BULL_REP_AUDIT_JOB_NONSORS,
    src.bull_REP_AUDIT_JOB_SORS,
    src.BULL_REP_REASON_CODES
}

WHILE (@ctr < sourceTables.length)
BEGIN
    EXEC tSQLt.AssertNonEmptyTable 'sourceTables[ctr]'
    SET @ctr = @ctr   1
END
 

РЕДАКТИРОВАТЬ: улучшена попытка

 DROP TABLE IF EXISTS #SourceTables
CREATE TABLE #SourceTables
(
    Id INT,
    TableName NVARCHAR(MAX)
)
INSERT INTO #SourceTables
    VALUES
        (1, 'src.fusion_sec_assigned_workgroup'),
        (2, 'src.fusion_sec_user_account'),
        (3, 'src.fusion_sec_user_in_organisation'),
        (4, 'src.BULL_OHMS_WORKGROUPS'),
        (5, 'src.fusion_rep_extension_request_reason'),
        (6, 'src.fusion_rep_extension_request_trade'),
        (7, 'src.fusion_rep_job_ext_request_reason'),
        (8, 'src.fusion_rep_job_ext_request_trade'),
        (9, 'src.bull_rep_audit_adhoc_jobs'),
        (10, 'src.BULL_REP_AUDIT_JOB_NONSORS'),
        (11, 'src.bull_REP_AUDIT_JOB_SORS'),
        (12, 'src.BULL_REP_REASON_CODES')

DECLARE @ctr INT = 1
DECLARE @length INT = (SELECT COUNT(*) FROM #SourceTables)
WHILE (@ctr <= @length)
BEGIN
    PRINT @ctr
    EXEC tSQLt.AssertNonEmptyTable '' -- how to refer to a table name per iteration (in C# something like SourceTables[ctr])
    SET @ctr = @ctr   1
END
 

Спасибо за вашу помощь.

Комментарии:

1. Пожалуйста, покажите нам вашу попытку

2. Псевдокод — моя лучшая попытка, и у меня есть логика. Я могу сделать это довольно легко на Java, C # и Python. Я просто озадачен синтаксисом TSQL, вот и все.

Ответ №1:

Вам нужно будет использовать Dynamic SQL query. sp_executesql

Вы не указали требуемый вывод, я изменил #SourceTables , чтобы добавить столбец count для записи количества строк в этой таблице.

 CREATE TABLE #SourceTables
(
    Id INT,
    TableName NVARCHAR(MAX),
    TableCount INT                   -- Added this
)
INSERT INTO #SourceTables (Id, TableName)
    VALUES
        (1, 'src.fusion_sec_assigned_workgroup'),
        (2, 'src.fusion_sec_user_account'),
        (3, 'src.fusion_sec_user_in_organisation'),
        (4, 'src.BULL_OHMS_WORKGROUPS'),
        (5, 'src.fusion_rep_extension_request_reason'),
        (6, 'src.fusion_rep_extension_request_trade'),
        (7, 'src.fusion_rep_job_ext_request_reason'),
        (8, 'src.fusion_rep_job_ext_request_trade'),
        (9, 'src.bull_rep_audit_adhoc_jobs'),
        (10, 'src.BULL_REP_AUDIT_JOB_NONSORS'),
        (11, 'src.bull_REP_AUDIT_JOB_SORS'),
        (12, 'src.BULL_REP_REASON_CODES')


DECLARE @SQL    NVARCHAR(MAX)

-- Form the dynamic sql query
select  @SQL    = ISNULL(@SQL   ';'   char(13), '')
                  'UPDATE #SourceTables SET TableCount = (SELECT COUNT(*) FROM '   TableName   ') WHERE TableName = '''   TableName   ''''
from    #SourceTables

-- print out for verification    
print   @SQL

-- execute the query
exec    sp_executesql @SQL

select  *
from    #SourceTables
 

Комментарии:

1. Спасибо, добавленный столбец полезен для устранения неполадок.

2. Вопрос, что конкретно ISNULL(@sql ';' char(13), '') делает?

3. начальное значение для @sql равно NULL . Функция ISNULL() проверяет NULL и возвращает второй параметр, который является пустой строкой

4. Какая-либо конкретная причина @SQL ';' char(13) , по которой они объединяются как первый параметр (вместо, возможно, просто @SQL)?

5. самый первый раз @SQL , когда значение равно null, оно будет объединено с пустой строкой (NULL ; char(13) все равно будет null). Далее, это не null, к нему добавляется ; amp; возврат каретки CHAR(13)

Ответ №2:

Полное решение, включая утверждение с помощью tSQLt. Основа из белка.

     DROP TABLE IF EXISTS #SourceTables
    CREATE TABLE #SourceTables
    (
        Id INT IDENTITY(1,1),
        TableName NVARCHAR(MAX),
        TableCount INT                   -- Added this
    )
    INSERT INTO #SourceTables (TableName)
        VALUES
            ('src.fusion_sec_assigned_workgroup'),
            ('src.fusion_sec_user_account'),
            ('src.fusion_sec_user_in_organisation'),
            ('src.BULL_OHMS_WORKGROUPS'),
            ('src.fusion_rep_extension_request_reason'),
            ('src.fusion_rep_extension_request_trade'),
            ('src.fusion_rep_job_ext_request_reason'),
            ('src.fusion_rep_job_ext_request_trade'),
            ('src.bull_rep_audit_adhoc_jobs'),
            ('src.BULL_REP_AUDIT_JOB_NONSORS'),
            ('src.bull_REP_AUDIT_JOB_SORS'),
            ('src.BULL_REP_REASON_CODES')

    DECLARE @sql    NVARCHAR(MAX)

    -- Form the dynamic sql query
    SELECT  @sql    = ISNULL(@sql   ';'   char(13), '')
                      'UPDATE #SourceTables SET TableCount = (SELECT COUNT(*) FROM '   TableName   ') WHERE TableName = '''   TableName   ''''
    FROM    #SourceTables

    -- Print out for verification    
    PRINT   @sql

    -- Execute the query
    EXEC    sp_executesql @sql

    SELECT  *
    FROM    #SourceTables

    -- Assert
    DECLARE
        @ctr INT = 1,
        @length INT = (SELECT COUNT(*) FROM #SourceTables)
    WHILE (@ctr <= @length)
    BEGIN
        DECLARE @tableCount INT = (SELECT TableCount FROM #SourceTables WHERE Id = @ctr)
        EXEC tSQLt.AssertNotEquals 0, @tableCount
        SET @tableCount = 0
        SET @ctr = @ctr   1
    END