Динамический SQL (сохранение таблицы результатов)

У меня есть следующая таблица, используемая в динамической сводке для PORT_NAME:

DECLARE @BaseQuery TABLE 
                   (
                       PORT_NAME NVARCHAR(50),
                       BILL_ACCOUNT_NAME NVARCHAR(50), 
                       AVERAGE float
                   );

Мне нужно сохранить вывод в виде таблицы, я попытался добавить следующий код, поскольку столбцы должны быть динамическими для планирования задания SQL:

DECLARE @sql varchar(max)
SET @sql = 'CREATE TABLE ##T1 (BILL_ACCOUNT_NAME NVARCHAR(50),' + @Columns + ' float)'
EXEC(@sql)
INSERT INTO ##T1 VALUES (select @Query)
SELECT * FROM ##T1

got (Неправильный синтаксис рядом с ключевым словом «выбрать».)

Я работаю в SQL Server Management Studio 18 (версия 2019 г.), я пытался прочитать код в SSIS, но не смог прочитать результаты.

Зачем тогда нужно хранить данные в таблице? Что вы потом собираетесь делать с этими данными? Звучит как проблема XY, если честно. Подобный поворот обычно должен выполняться на уровне представления.

Larnu 20.01.2023 17:54

«Мне нужно, чтобы все сводные столбцы были числами с плавающей запятой, а BILL_ACCOUNT_NAME — NVARCHAR(50)». С таким названием, как BILL_ACCOUNT_NAME (и другим столбцом с именем TOTAL_PRE_VAT_AMNT_PER_INVOICE), это звучит так, как будто данные — это финансовые данные. Если да, то float — это ужасный выбор типа данных для ваших денежных значений. Значения базы 2 не подходят для хранения финансовых значений базы 10.

Larnu 20.01.2023 17:55

Почему бы просто не использовать into <resultstable> from... в последнем запросе?

Stu 20.01.2023 17:59

«это запросы от моих старших». Тогда ваши старшие должны знать, насколько ошибочным является требование хранить финансовые данные в float; используйте decimal (вероятно, decimal(18,4) или аналогичный).

Larnu 20.01.2023 18:06

Stu Я пробовал, не получилось, может я не так сделал, не могли бы вы уточнить?

user267454 20.01.2023 18:14
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете вставить результат сводки в новый объект таблицы, используя INTO.

Быстрый пример:

Выполняет строку @Query, которая создает объект dbo.RESULT_PIVOT_TABLE.

SET @Query = 'SELECT
    BILL_ACCOUNT_NAME,
    ' + @Columns + N'
INTO dbo.RESULT_PIVOT_TABLE -- INSERT PIVOT RESULT INTO TABLE OBJECT
FROM (SELECT
          PORT_NAME,
          BILL_ACCOUNT_NAME,
          AVERAGE
      FROM #BaseQuery) AS a PIVOT (MAX(AVERAGE) FOR a.PORT_NAME IN (' + @Columns + ')) AS P';

EXEC sp_executesql @Query;

SELECT * FROM dbo.RESULT_PIVOT_TABLE;

Полный пример:

DROP TABLE IF EXISTS dbo.RESULT_PIVOT_TABLE;
DROP TABLE IF EXISTS #BaseQuery;

CREATE TABLE #BaseQuery
(
    PORT_NAME         NVARCHAR(50),
    BILL_ACCOUNT_NAME NVARCHAR(50),
    AVERAGE           FLOAT
);
DECLARE @Query NVARCHAR(MAX);
DECLARE @Columns NVARCHAR(MAX);

/* POPULATE TEMP DUMMY TABLE WITH FAKE DATA */
INSERT INTO #BaseQuery
SELECT
    a.PORT_NAME,
    a.BILL_ACCOUNT_NAME,
    a.AVERAGE
FROM (SELECT
          'PORT 1' AS PORT_NAME,
          'NAME 1' AS BILL_ACCOUNT_NAME,
          1.23 AS AVERAGE
      UNION ALL
      SELECT
          'PORT 2' AS PORT_NAME,
          'NAME 2' AS BILL_ACCOUNT_NAME,
          2.34 AS AVERAGE
      UNION ALL
      SELECT
          'PORT 3' AS PORT_NAME,
          'NAME 3' AS BILL_ACCOUNT_NAME,
          3.45 AS AVERAGE) a;

/* SET COLUMNS FOR PIVOT */
SELECT
    @Columns = STRING_AGG(a.PORT_NAME, ',')
FROM (SELECT DISTINCT
          QUOTENAME(PORT_NAME) AS PORT_NAME
      FROM #BaseQuery) a;

/* SET DYNAMIC QUERY STRING THAT INSERTS PIVOT RESULT INTO TABLE OBJECT */
SET @Query = 'SELECT
    BILL_ACCOUNT_NAME,
    ' + @Columns + N'
INTO dbo.RESULT_PIVOT_TABLE -- INSERT PIVOT RESULT INTO TABLE OBJECT
FROM (SELECT
          PORT_NAME,
          BILL_ACCOUNT_NAME,
          AVERAGE
      FROM #BaseQuery) AS a PIVOT (MAX(AVERAGE) FOR a.PORT_NAME IN (' + @Columns + ')) AS P';

EXEC sp_executesql @Query;

SELECT * FROM dbo.RESULT_PIVOT_TABLE;

Результат:

BILL_ACCOUNT_NAME [ПОРТ 1] [ПОРТ 2] [ПОРТ 3] ИМЯ 1 1,23 нулевой нулевой ИМЯ 2 нулевой 2,34 нулевой ИМЯ 3 нулевой нулевой 3,45

Вы спасатель жизни. большое спасибо, я очень ценю время, которое вы потратили, чтобы ответить на мой вопрос.

user267454 20.01.2023 19:32

Другие вопросы по теме