Построить и выполнить SQL - PullRequest
       0

Построить и выполнить SQL

0 голосов
/ 18 октября 2019

У меня есть такой скрипт SQL -

WHILE @year < year(getdate())

    BEGIN
        SET @table_name = 'Link_' + @year

        SET @sql = 'INSERT INTO ' + @table_name + ' (a1, b1, REF, TYPE, Patients) 
   Select a1, b1, REF, TYPE, Count(Distinct a) Patients 
   From tb Where DATEPART(YEAR, THRU_DT) = ' + @year + ' 
   And REF Is Not Null And Active = 1 Group By a1, b1, REF, TYPE'

        SET @trunc = 'TRUNCATE TABLE ' + @table_name

        EXECUTE sp_executesql @trunc

        EXECUTE sp_executesql @sql

        SET @YEAR = year(DATEADD(YEAR, 1, @YEAR))

        PRINT @year
    END 

Есть ли лучший способ для создания операторов SQL и их выполнения? Это делает работу, но это не похоже на хорошую практику.

1 Ответ

0 голосов
/ 18 октября 2019

Без лучшего понимания комментариев вашего поста, я считаю, что этот пример кода примерно то, что вы ищете. Это предполагает, что @year является целым числом (так и должно быть), что @table_name где-то указывается - курсор? и что цель состоит в том, чтобы обрезать таблицу перед выполнением вставки, что, по-видимому, является предыдущим поведением.

WHILE @year < year(getdate())

    BEGIN
        SET @table_name = QUOTENAME('Link_' + @year);
        SET @sql = 'TRUNCATE TABLE ' + @table_name + '; INSERT INTO ' + @table_name + ' (a1, b1, REF, TYPE, Patients) 
   Select a1, b1, REF, TYPE, Count(Distinct a) Patients 
   From tb Where DATEPART(YEAR, THRU_DT) = @year 
   And REF Is Not Null And Active = 1 Group By a1, b1, REF, TYPE'

        EXECUTE sp_executesql @sql, N'@year int', @year = @year;

        SET @YEAR += 1; -- @year should be an integer, so that's how we handle it throughout

        RAISERROR('%d has been processed', 0, 1, @year) WITH NOWAIT;
    END 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...