Можно ли заменить этот динамический SQL на обычный SQL для повышения производительности? - PullRequest
0 голосов
/ 12 декабря 2018

Я использую следующий динамический запрос, но вижу, что производительность низкая.Я не большой поклонник динамического 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
...