#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