Как получить @@ ROWCOUNT из одного запроса в UNION - создать запись трейлера с RowCount - PullRequest
0 голосов
/ 07 июля 2019

Мне нужно создать запись HEADER и TRAILER. ТРЕЙЛЕР должен включать RowCount из основного запроса .Как я могу получить @@ Rowcount запроса и сохранить его в переменной, чтобы включить его в TRAILER.

См. Это.

--- Var to save Count

declare @cnt int

-- HEADER RECORD
Select Cast('H' as Char(2)) +
    Cast('MyFile' as Char(30))
    + CONVERT(Char(8),GetDate(),112)

union all

-- MAIN Query that I need the Count of

Select top 10 lastname from CUSTOMERS

set @cnt = @@ROWCOUNT

union all    <--ERROR obviously

-- TRAILER record  
Select Cast('T' as Char(2)) +
         CONVERT(Char(9),GetDate(),112) +
      Right(Replicate('0',9) + Cast(@cnt as VarChar(9)),9)

thx заранее

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

Вы можете использовать CTE для повторного использования определения основного запроса:

WITH Query AS (
    SELECT top 10 lastname from CUSTOMERS
)
SELECT X.Result
FROM (
    SELECT Cast('H' as Char(2)) + Cast('MyFile' as Char(30)) 
        + CONVERT(Char(8),GetDate(),112) AS Result, 1 AS Position
    UNION ALL
    SELECT *, 2 AS Position FROM Query
    UNION ALL
    Select Cast('T' as Char(2)) + CONVERT(Char(9),GetDate(),112) + Right(Replicate('0',9) 
        + Cast((SELECT COUNT(*) FROM Query) as VarChar(9)),9) AS Result, 3 AS Position
) X ORDER BY X.Position

Однако CTE будет оцениваться дважды;если ваш запрос сложный и требует много времени, вы можете использовать временную таблицу:

SELECT TOP 10 lastname INTO #Temp FROM CUSTOMERS

SELECT X.Result
FROM (
    SELECT Cast('H' as Char(2)) + Cast('MyFile' as Char(30))
         + CONVERT(Char(8),GetDate(),112) AS Result, 1 AS Position
    UNION ALL
    SELECT *, 2 AS Position FROM #Temp
    UNION ALL
    Select Cast('T' as Char(2)) + CONVERT(Char(9),GetDate(),112) + Right(Replicate('0',9) 
         + Cast((SELECT COUNT(*) FROM #Temp) as VarChar(9)),9) AS Result, 3 AS Position
) X ORDER BY X.Position
1 голос
/ 08 июля 2019

Попробуйте следующий скрипт-

-- HEADER RECORD
SELECT CAST('H' AS CHAR(2)) + CAST('MyFile' AS CHAR(30)) + CONVERT(CHAR(8), GETDATE(), 112)

UNION ALL

-- MAIN Query that I need the Count of
SELECT lastname FROM CUSTOMERS

UNION ALL

-- TRAILER record  
SELECT CAST('T' AS CHAR(2)) + CONVERT(CHAR(9), GETDATE(), 112) + RIGHT(REPLICATE('0', 9) + CAST(
(
    SELECT COUNT(lastname) FROM CUSTOMERS
) AS VARCHAR(9)), 9);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...