Я использую следующий динамический запрос, но вижу, что производительность низкая.Я не большой поклонник динамического SQL и ищу, если возможно, хорошую чистую и быструю альтернативу SQL для следующего.Спасибо за миллион тонн заранее!Вот некоторые подробности:
В следующем коде финальная таблица missingfields_ xxxx перечисляет строки, в которых у нас отсутствует поле правила.имя_таблицы имеет столбец правило , в котором содержится имя столбца таблицы имя_транспорта (эту таблицу можно найти в динамической части sql)
DECLARE @rule NVARCHAR(MAX)
DECLARE @PeriodNumber INT = 1
DECLARE @SelectList NVARCHAR(MAX)
DECLARE @WhereList NVARCHAR(MAX)
DECLARE @SQL NVARCHAR(MAX)
DECLARE @ModelName as NVARCHAR(MAX) = 'modelname'
--DECLARE @MaxPeriods INT = 8
DECLARE @MaxPeriods INT
SELECT @MaxPeriods = count (*)
FROM
(
SELECT [rule]
FROM table_name
WHERE ModelName = @ModelName) ab
DECLARE db_cursor3 CURSOR FOR
SELECT * FROM
(
SELECT [rule]
FROM table_name
WHERE ModelName = @ModelName) cd
OPEN db_cursor3
FETCH NEXT FROM db_cursor3 INTO @rule
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
SELECT @SelectList = COALESCE(@SelectList + ', ', '') + '' + @rule + ' AS [GLSegment_' + RIGHT('00' + CAST(@PeriodNumber AS VARCHAR), 3) + ']'
SELECT @SelectList as 'Selectlist'
IF @PeriodNumber < @MaxPeriods
BEGIN
SELECT @WhereList = COALESCE(@WhereList, '') + '(isnull([GLSegment_' + RIGHT('00' + CAST(@PeriodNumber AS VARCHAR), 3) + '],'''') = '''' ) OR '
SELECT @WhereList as 'Wherelist where periodnumber < maxperiods'
END
ELSE IF @PeriodNumber = @MaxPeriods
BEGIN
SELECT @WhereList = COALESCE(@WhereList, '') + '(isnull([GLSegment_' + RIGHT('00' + CAST(@PeriodNumber AS VARCHAR), 3) + '], '''') = '''' )'
SELECT @WhereList as 'Wherelist where periodnumber = maxperiods'
END
SET @PeriodNumber = @PeriodNumber + 1
END
FETCH NEXT FROM db_cursor3 INTO @rule
END
CLOSE db_cursor3
DEALLOCATE db_cursor3
-- build dynamic query
SET @SQL =
'SELECT * into missingfields_' + @ModelName + ' from trans_' + @ModelName + '
WHERE id in
(
SELECT id from
(
SELECT id, ' + @SelectList + '
FROM trans_' + @ModelName + ')A
WHERE ' + @WhereList + '
);
SELECT * from missingfields_' + @ModelName
PRINT @SQL
print 'missingfields_' + @ModelName
EXEC sp_executesql @SQL