मैं तालिकाओं की एक सूची बनाना चाहता हूं और सूची में प्रत्येक तालिका की जांच करना चाहता हूं यदि यह खाली नहीं है (यानी पॉप्युलेट होना चाहिए)। नीचे तर्क का छद्म कोड है लेकिन टीएसक्यूएल में होना चाहिए।

छद्म कोड:

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

आपकी सहायता के लिए धन्यवाद।

0
silver 8 पद 2020, 06:50

3 जवाब

सबसे बढ़िया उत्तर

आपको Dynamic SQL क्वेरी का उपयोग करना होगा। sp_executesql

आपने आवश्यक आउटपुट निर्दिष्ट नहीं किया, मैंने उस तालिका में पंक्तियों की संख्या रिकॉर्ड करने के लिए एक गिनती कॉलम जोड़ने के लिए #SourceTables को संशोधित किया।

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
Squirrel 8 पद 2020, 08:45

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
0
silver 8 पद 2020, 10:26

कृपया यहां दिखाए गए कोड को देखें:

DROP TABLE IF EXISTS #SourceTables
DROP TABLE IF EXISTS #temp

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')

CREATE TABLE #temp
(
     name varchar(100),
     tblCount int
)

DECLARE @ctr INT = 1
DECLARE @length INT = (SELECT COUNT(*) FROM #SourceTables)
DECLARE @SQL VARCHAR(MAX) 
DECLARE @TableName VARCHAR(50)

WHILE (@ctr <= @length)
BEGIN
    SELECT @TableName = TableName FROM #SourceTables WHERE Id = @ctr

    SET @SQL = 'select '''+@TableName+''',count(*) from ' + @TableName +' having count(*)=0'
    insert into #temp

    EXEC(@SQL)

    SET @ctr = @ctr + 1
END

SELECT * FROM #temp

SQL सर्वर के लिए नया "Microsoft Q&A" एक्सप्लोर करने का प्रयास करें संबंधित सवाल!

यदि मेरा लेन-देन लॉग भरा हुआ है तो मैं क्या कर सकता हूँ?---गर्म मुद्दे नवम्बर

प्रोफाइलर ट्रेस को SQL सर्वर तालिका में कैसे परिवर्तित करें - गर्म मुद्दे नवंबर

1
marc_s 8 पद 2020, 08:49