Альтернатива 'GO' для партии в потенциальной хранимой процедуре (используются временные таблицы) - PullRequest
0 голосов
/ 30 октября 2019

У меня есть стена кода, которую я хочу превратить в SP. Он начинается с массовой вставки довольно грязного .CSV в временную таблицу и требует множества обновлений и изменений. На самом деле в коде также используется несколько временных таблиц.

Я использовал GO для пакетирования всего этого, но теперь, когда я хочу превратить его в SP, я больше не могу этого делать. Естественно, если я удалю все GO, я получу ошибки «Неверное имя столбца» для временных таблиц, поскольку они больше не работают по порядку. Хотите знать, какие у меня есть альтернативы?

Образец кода процедуры предварительного создания

IF OBJECT_ID('tempdb.dbo.#Map', 'U') IS NOT NULL
DROP TABLE #Map
GO

CREATE TABLE #Map
    (
        RowNum NVARCHAR(255)
        , Entity_Type NVARCHAR(255)
        , Tagging_Status NVARCHAR(255)
        , Website NVARCHAR(255)
        , Mock_Pages_Viewed NVARCHAR(255)
    )
GO

BULK INSERT #Map
FROM '\\*Server*\*Folder*\*SubFolder*\*File*.csv'
WITH
    (
        FIELDTERMINATOR = ','
        , ROWTERMINATOR = '0x0a'
        , FIRSTROW = 3
    )
GO

ALTER TABLE #Map
DROP COLUMN RowNum
GO

ALTER TABLE #Map
DROP COLUMN Entity_Type
GO

UPDATE #Map
SET Mock_Pages_Viewed = SUBSTRING(Mock_Pages_Viewed, 2, LEN(Mock_Pages_Viewed)-2)
GO

И т. Д. И т. Д.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Хранимая процедура выполняется в контексте одного пакета. GO - это просто разделитель пакетов, и вы не можете иметь несколько пакетов внутри хранимой процедуры, если только вы не вернетесь к созданию строк SQL и их выполнению для каждого пакета в рамках хранимой процедуры. Это почти всегда плохая идея.

Гораздо лучше будет переписать код процедуры, чтобы он мог работать без разделителя пакетов.

Кроме того, вместо того, чтобы возиться с темпомтаблицы, рассмотрите возможность использования OPENROWSET вместо BULK INSERT. Затем вы можете просто обрабатывать внешние данные как таблицу и просто выбирать нужные столбцы и фильтровать нужные вам строки. Это позволит избежать всех частей сбрасываемых столбцов и т. Д.

1 голос
/ 30 октября 2019

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

create or alter procedure foo 
as
begin

    CREATE TABLE #Map
        (
            RowNum NVARCHAR(255)
            , Entity_Type NVARCHAR(255)
            , Tagging_Status NVARCHAR(255)
            , Website NVARCHAR(255)
            , Mock_Pages_Viewed NVARCHAR(255)
        )

    --BULK INSERT #Map
    --FROM '\\*Server*\*Folder*\*SubFolder*\*File*.csv'
    --WITH
    --  (
    --      FIELDTERMINATOR = ','
    --      , ROWTERMINATOR = '0x0a'
    --      , FIRSTROW = 3
    --  )

    ALTER TABLE #Map
    DROP COLUMN RowNum

    ALTER TABLE #Map
    DROP COLUMN Entity_Type

    UPDATE #Map
    SET Mock_Pages_Viewed = SUBSTRING(Mock_Pages_Viewed, 2, LEN(Mock_Pages_Viewed)-2)

    exec ('alter table #map drop column Mock_Pages_Viewed')

    select * 
    from #map

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