Как получить данные #temptable, созданные внутри хранимой процедуры и SqlCommand?

Я читал здесь много ответов о том, как повторно использовать SqlCommand, но ни один из них не является ответом на эту проблему. В основном у меня есть хранимая процедура, которая создает файл #temptable.

Что-то вроде этого:

CREATE PROCEDURE [dbo].[ProjectPriorInterestIncome]
    @selectedDate Date,
    @EndDay Date
AS
BEGIN
    CREATE TABLE #LoanPriorProjected
    (
      Colums here....
    )
END

В моем .Net у меня есть SqlCommand, который выполняет хранимую процедуру. Что-то вроде этого:

Using cmd As New SqlCommand("ProjectPriorInterestIncome", SQLConn)
   cmd.CommandType = CommandType.StoredProcedure
   cmd.Parameters.AddWithValue("@SelectedDate", frmDefault.dtDate.Value)
   cmd.Parameters.AddWithValue("@EndDay", Format(GetLastDayofMonth(frmDefault.dtDate.Value), "12/31/yyyy"))
   cmd.ExecuteNonQuery()  

   'Executing a select query from #temptable'
   cmd.CommandText = "SELECT * FROM #LoanPriorProjected"
   cmd.CommandType = CommandType.Text
   cmd.ExecuteNonQuery()
End Using

Теперь, когда я пытаюсь выполнить запрос выбора из таблицы #LoanPriorProjected, он говорит

Недопустимое имя объекта '#LoanPriorProjected'.


person jreloz    schedule 23.09.2019    source источник
comment
Необходимо объявить табличную переменную. что это значит?   -  person jreloz    schedule 23.09.2019
comment
@DaleBurrell, на самом деле, когда я запускаю свой запрос на стороне сервера, все работает, просто найдите.   -  person jreloz    schedule 23.09.2019
comment
Михал прав, вам нужна глобальная временная таблица (##). Локальная временная таблица автоматически удаляется в конце процедуры.   -  person Dale K    schedule 23.09.2019
comment
@Suraj S прав, вам нужно просто выбрать результаты в сохраненной процедуре, и они будут возвращены на ваш уровень С#. Хорошая вещь в том, что у вас может быть несколько операторов select, и вы получите несколько таблиц в своем наборе результатов.   -  person Jonathan Freestone    schedule 23.09.2019


Ответы (2)


Временные таблицы... временные - они существуют в рамках одного соединения. Итак, при выполнении процедуры создается таблица, затем команда завершается, а временная таблица исчезает.

Вы можете сделать временную таблицу «более глобальной», используя двойной хэш ##temptable.

Для лучшего объяснения обратитесь к это:

Классическая временная таблица бывает двух видов: глобальная или совместно используемая временная таблица с префиксом «##» и локальная временная таблица с префиксом «#». Локальные временные таблицы менее похожи на обычные таблицы, чем глобальные временные таблицы: вы не можете создавать для них представления или связывать с ними триггеры. Немного сложно понять, какой процесс, сеанс или процедура их создали. Мы немного поможем вам с этим позже. Самое главное, они более безопасны, чем глобальные временные таблицы, поскольку их может видеть только процесс-владелец.

person Michał Turczyn    schedule 23.09.2019
comment
##temp таблицы не нужны для вашего сценария, просто возвращайте результаты непосредственно из хранимой процедуры. Это легче на сервере, вы делаете два соединения, когда можно было бы сделать одно. - person Jonathan Freestone; 23.09.2019
comment
@JonathanFreestone .NET использует пул соединений, так что это не так дорого :) - person Michał Turczyn; 23.09.2019

если вы хотите использовать данные временной таблицы, просто выберите данные временной таблицы внутри процедуры, т.е. select * from #LoanPriorProjected ваша процедура вернет результат в виде таблицы, а затем используйте datatable для отображения данных этой таблицы.

person Suraj S.    schedule 23.09.2019