Вставить в отдельные столбцы из хранимой процедуры - PullRequest
0 голосов
/ 27 февраля 2019

Как вставить во временную таблицу, которая полностью готова внутри хранимой процедуры

ALTER PROCEDURE [dbo].[Report_1]
BEGIN
    CREATE TABLE #Temp
    (
        col1 INT,
        col2 INT,
        col3 VARCHAR(50)
    )

    INSERT INTO #Temp
       EXEC [spSelection] @ID

    ..do stuff
    ..do stuff
    ..do stuff

    SELECT * FROM #temp
END

У меня проблема в том, что я буду использовать эту хранимую процедуру (spSelection) в будущеми если я изменю эту хранимую процедуру, чтобы получить больше столбцов для другой хранимой процедуры, то Report_1 завершится неудачей.

Поэтому мне нужен способ динамически создавать таблицу или иметь возможность выбирать только отдельные столбцы извывод exec [spSelection] @ID или Report_1 может считывать данные из временной таблицы, созданной в spSelection.

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

@sql ='
    create table #Temp(
    col1 int,col2 int,col3 varchar(50)
    ) ' exec sp_executesql @sql

Я не могу получить доступ к таблице #temp за пределами кавычек

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Одной из альтернатив является изменение вашего SP, чтобы сделать вставку внутри SP:

ALTER PROCEDURE [spSelection]
AS
BEGIN

    -- Validate that your temporary table was created (the insert will fail otherwise)
    IF OBJECT_ID('tempdb..#Temp') IS NULL
    BEGIN
        RAISERROR ('The table #Temp must be created before executing this SP', 16, 1)
        RETURN
    END

    ..do stuff
    ..do stuff
    ..do stuff

    INSERT INTO #Temp (
        col1,
        col2,
        col3)
    SELECT
        /*Columns*/

END
GO


ALTER PROCEDURE [dbo].[Report_1]
BEGIN

    CREATE TABLE #Temp
    (
        col1 INT,
        col2 INT,
        col3 VARCHAR(50)
    )

    EXEC [spSelection] @ID -- Will insert into #Temp

    ..do stuff
    ..do stuff
    ..do stuff

    SELECT * FROM #temp
END

Этот подход потерпит неудачу, если вы в конечном итоге добавите новые столбцы втаблицу #Temp и вставьте их в SP без обновления CREATE TABLE в каждом вызывающем SP.

Здесь нет окончательного решения, пожалуйста, прочитайте эту превосходную статью обо всехвозможные способы обмена данными между SP, с преимуществами и недостатками каждого (решение, которое я разместил здесь, указано как 4. Использование таблицы ).

0 голосов
/ 27 февраля 2019

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

Вы не можете использовать хранимую процедуру в операторе выбора.

...