Estou testando um relatório que escrevi em T-SQL e estou tendo alguns problemas com os resultados que estão sendo retornados. Aqui está a seção do código com a qual estou tendo problemas;
CREATE TABLE #Tables
( ID INT IDENTITY (1,1),
TenantId nvarchar(10),
TaskTable nvarchar(50),
RecordTable nvarchar(50),
RecordColumn nvarchar(50) )
SELECT @TSQL AS SQLCommand
INTO #Commands
INSERT INTO #Tables
select schema_name(t.schema_id) as TenantId,
t.[name] TaskTable,
t2.[name] RecordTable,
c.[name] RecordColumn
from sys.tables t, sys.tables t2
join sys.columns c on t2.object_id = c.object_id
where t.[name] in ('Task', 'Tasks')
and t2.[name] in ('TimeRecord', 'TimeRecords')
and schema_name(t.schema_id) >= 50
and schema_name(t.schema_id) <> 275 -- Exclude this because it's missing tables
and c.[name] like 'FK_Task%'
group by (schema_name(t.schema_id)), t.[name], t2.[name], c.[name]
union
select schema_name(t.schema_id) as TenantId,
t.[name] TaskTable,
t2.[name] RecordTable,
c.[name] RecordColumn
from sys.tables t, sys.tables t2
join sys.columns c on t2.object_id = c.object_id
where t.[name] in ('Tasks_NEW', 'Task_NEW')
and t2.[name] in ('TimeRecord_NEW', 'TimeRecords_NEW')
and schema_name(t.schema_id) >= 50
and c.[name] like 'FK_Task%'
group by (schema_name(t.schema_id)), t.[name], t2.[name], c.[name]
union
select schema_name(t.schema_id) as TenantId,
t.[name] TaskTable,
t2.[name] RecordTable,
c.[name] RecordColumn
from sys.tables t, sys.tables t2
join sys.columns c on t2.object_id = c.object_id
where t.[name] in ('Tasks_WOM', 'Task_WOM')
and t2.[name] in ('TimeRecord_WOM', 'TimeRecords_WOM')
and schema_name(t.schema_id) >= 50
and c.[name] like 'FK_Task%'
group by (schema_name(t.schema_id)), t.[name], t2.[name], c.[name]
SET @MaxRownum = (SELECT MAX(id) FROM #Tables)
SET @Iter = (SELECT MIN(id) FROM #Tables)
WHILE @Iter <= @MaxRownum
BEGIN
SELECT @TenantId = TenantId, @TaskTable = TaskTable, @RecordTable = RecordTable, @RecordColumn = RecordColumn
FROM #Tables
WHERE id = @Iter
SET @TSQL = N'SELECT '+@TenantId+' AS TenantId, COUNT(*) AS IntegrationDates, (SELECT COUNT(*) FROM [Dynamic].['+@TenantId+'].['+@TaskTable+'] WHERE SystemId NOT IN (SELECT '+@RecordColumn+' FROM [Dynamic].['+@TenantId+'].['+@RecordTable+'])) AS MissingTimeRecords FROM [Dynamic].['+@TenantId+'].['+@TaskTable+'] WHERE IntegrationDate IS NULL'
INSERT INTO #Commands
SELECT @TSQL AS SQLCommand
SET @Iter = @Iter + 1
END
SELECT @TSQLFinal = IsNull(@TSQLFinal + '
UNION
', '' ) + SQLCommand
FROM #Commands
CREATE TABLE #Results ( ApplicationId INT,
IntegrationDates INT,
MissingTimeRecords INT)
INSERT INTO #results
EXEC (@TSQLFinal)
Se eu SELECT * FROM #Commands
conseguir ver todos os comandos criados pela minha Declaração Dinâmica, que são 275 linhas neste caso.
Isso é perfeito, mas se eu SELECT * FROM #results
não recebo 275 linhas. Às vezes recebo 30 linhas, às vezes 100, mas nunca é consistente.
O que estou esperando aqui é que todos os meus comandos na tabela temporária #Commands sejam executados e os resultados desses comandos sejam colocados na tabela #results (daí o UNION)
Alguma coisa pode detectar o que pode estar acontecendo de errado aqui?
Desde já, obrigado!
Tom.
Seu código não mostra onde
@TSQLFinal
está declarado. Certifique-se de que seja um tipo de dados grande o suficiente para conter todos os seus resultados.Além disso,
UNION
suprime resultados duplicados por padrão. Se você quiser todos os resultados, useUNION ALL
.Como disse EzLo : Não use atribuição de variáveis
SELECT
para agregar valores. Você faz isso ao configurar@TSQLFinal
. ExperimenteSTRING_AGG()
se você tiver o SQL Server 2017+ ouFOR XML PATH('')
em versões inferiores.