Моя процедура хранения выполняет только мой первый оператор выбора, в то время как я написал три? - PullRequest
0 голосов
/ 11 декабря 2018

Это моя таблица:

CREATE TABLE [dbo].[InfoTable] 
(
    [Id]               INT IDENTITY (1, 1) NOT NULL,
    [TimeSpanColumn]   NVARCHAR(50) NULL,
    [TimeStampColumn]  DATETIME     NULL,
    [TimeStringColumn] NVARCHAR(50) NULL,
    [TotalSecColumn]   NVARCHAR(50) NULL,

    PRIMARY KEY CLUSTERED ([Id] ASC)
)

Я хочу выбрать время spans между 2 указанными датами и поместить их в другую таблицу, например:

 Col1    Col2      col3
 [hh]  |  [mm]  |  [ss]
 ----------------------
 02       55       36
 54       32       41

Моя хранимая процедура:

CREATE PROCEDURE sumBetweenDates
    @QueryFromDate DateTime,
    @QueryToDate DateTime
AS
    SELECT 
        SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2))) as hh
    FROM 
        InfoTable 
    WHERE
        TimeStampColumn BETWEEN @QueryFromDate AND @QueryToDate
    GROUP BY 
        TimeStampColumn

    SELECT 
        SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2))) AS mm
    FROM 
        InfoTable 
    WHERE
        TimeStampColumn BETWEEN @QueryFromDate AND @QueryToDate
    GROUP BY 
        TimeStampColumn

    SELECT 
        SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2))) AS ss
    FROM 
        InfoTable 
    WHERE
        TimeStampColumn BETWEEN @QueryFromDate AND @QueryToDate
    GROUP BY 
        TimeStampColumn

Возвращает только результат первого запроса.Например:

[hh]
02
54

Как мне сделать то, что я сказал?

Я не могу присвоить переменную этим операторам выбора, потому что они могут иметь более одного значения, после этого онисгруппированы по timestampcolumn

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Учитывая ваш заявленный желаемый результат, я думаю, что вы просто хотите один SELECT со всеми 3 агрегатами:

SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2))) as hh,
  SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2))) as mm,
  SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2))) as ss
FROM InfoTable 
where TimeStampColumn between @QueryFromDate and @QueryToDate
GROUP BY TimeStampColumn

Но ваш комментарий:

Я просто выполнилпроцедура сохранения в моей программе на c # и заполнила мое представление данных результатами, показанными только в одном столбце.

Если у вас несколько SELECT операторов, вам нужно уделить дополнительное вниманиекак ты их читаешь.Если вы используете SqlDataReader, есть метод NextResult для перехода от одного набора результатов к следующему.При использовании какой-либо формы адаптера данных или аналогичного вам необходимо обратить внимание на то, как он описывает, как использовать несколько наборов результатов.Например, вы бы искали материал для заполнения DataSet, а не DataTable.

0 голосов
/ 11 декабря 2018

Ваша хранимая процедура состоит только из первого оператора SELECT, потому что вы не используете BEGIN / END:

CREATE PROCEDURE sumBetweenDates (
    @QueryFromDate DateTime,
    @QueryToDate DateTime
) AS
BEGIN
    SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2))) as hh
    FROM InfoTable 
    WHERE TimeStampColumn between @QueryFromDate and @QueryToDate
    GROUP BY TimeStampColumn;

    SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2))) as mm
    FROM InfoTable 
    WHERE TimeStampColumn BETWEEN @QueryFromDate and @QueryToDate
    GROUP BY TimeStampColumn;

    SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2))) as ss
    FROM InfoTable 
    WHERE TimeStampColumn BETWEEN @QueryFromDate and @QueryToDate
    GROUP BY TimeStampColumn;
END;  -- sumBetweenDates

Я не совсем уверен, что вы хотите.Основываясь на данных примера, вы, похоже, хотите:

CREATE PROCEDURE sumBetweenDates (
    @QueryFromDate DateTime,
    @QueryToDate DateTime
) AS
BEGIN
    SELECT DISTINCT CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2))) as hh,
           CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2))) as mm,
           CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2))) as ss               
    FROM InfoTable 
    WHERE TimeStampColumn BETWEEN @QueryFromDate AND @QueryToDate;
END;

Однако это не кажется особенно полезным, и можно предположить, что вы хотите что-то сложить.

0 голосов
/ 11 декабря 2018

Если вы хотите вычислить данные между столбцами, просто создайте временную таблицу для хранения результатов хранимой процедуры и вычислите желаемое значение.

Позвольте мне показать пример.

  1. Создать хранимую процедуру

    CREATE PROCEDURE sumBetweenDates
    @QueryFromDate DateTime,
    @QueryToDate DateTime
    AS
    
    SELECT DISTINCT * FROM (VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 
        12)) AS X(a, a1, a2)
    /*
    --Insert your query here instead of above test values.
    SELECT SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 1, 2))) as hh,
        SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 3, 2))) as mm,
        SUM(CONVERT(INT, SUBSTRING(TimeStringColumn, 5, 2))) as ss
    FROM InfoTable 
    WHERE TimeStampColumn between @QueryFromDate and @QueryToDate
    GROUP BY TimeStampColumn
    */        
    
  2. Создать табличную переменную для хранения результата вашей хранимой процедуры, затем вставить данные из вашей хранимой процедурыsumBetweenDates '2018-12-1', '2018-12-1'.Тогда в операторе SELECT вы можете делать все, что захотите:

    Declare @T Table (col1 INT, col2 INT, col3 int)
    Insert @T Exec sumBetweenDates '2018-12-1', '2018-12-1'
    
    SELECT 
      t.col1
    , t.col2
    , t.col3 
    , t.col3 - t.col1 CalculatedColumn
    FROM @T t
    

Здесь @T - табличная переменная.Declare @T Table (col1 INT, col2 INT, col3 int).Вы можете узнать разницу между ними, прочитав эту классную статью .

Этот ответ поможет вам , как вы можете использовать exec stored procedure для вставки данных в таблицу.

Кроме того, вы можете прочитать статью MSDN о INSERT, используя инструкцию EXEC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...