मैं तालिकाओं की एक सूची बनाना चाहता हूं और सूची में प्रत्येक तालिका की जांच करना चाहता हूं यदि यह खाली नहीं है (यानी पॉप्युलेट होना चाहिए)। नीचे तर्क का छद्म कोड है लेकिन टीएसक्यूएल में होना चाहिए।
छद्म कोड:
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
आपकी सहायता के लिए धन्यवाद।
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
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
कृपया यहां दिखाए गए कोड को देखें:
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 सर्वर तालिका में कैसे परिवर्तित करें - गर्म मुद्दे नवंबर
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।