SQL Server: TRY/CATCH для ALTER TABLE - (добавить столбец) не работает

Я ожидал получить информацию о том, что колонка не добавлена, но вместо этого получаю ошибку. Почему в этом случае не работает try/catch?

DROP TABLE IF EXISTS #Table

SELECT 1 AS FirstColumn INTO #Table

BEGIN TRY  
    ALTER TABLE #Table 
        ADD FirstColumn int;
    PRINT 'The column was added correctly'
END TRY  
BEGIN CATCH       
    PRINT 'The column was not added, maybe it already exists?'
END CATCH 
TRY... CATCH не работает с ошибками компиляции, так как никогда не вводится.
Larnu 22.02.2023 14:14

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

Jeroen Mostert 22.02.2023 14:15

SQL, язык, имеет статическую типизацию, но типы — это таблицы и столбцы, а не int или varchar. Вот почему таблица и столбцы не могут быть параметрами или почему вы не можете иметь произвольные столбцы в предложении SELECT. Даже SELECT * расширяется до реальных столбцов. Каждое определение данных или оператор манипулирования в вашем скрипте будет скомпилировано отдельно и создаст план выполнения. В этом случае ALTER TABLE #Table ADD FirstColumn int; не может полностью скомпилироваться

Panagiotis Kanavos 22.02.2023 14:19

@PanagiotisKanavos: хотя я знаю, что вы имеете в виду, когда говорите, что «таблицы [...] не могут быть параметрами», это утверждение по-прежнему бесполезно сбивает с толку, учитывая, что табличные параметры - это вещь, и что T-SQL разрешает идентификаторы для передаваться без кавычек в хранимые процедуры (sp_rename oldtable, newtable). Я бы не стал усложнять манеры, говоря, что таблицы — это типы; в T-SQL это не совсем так, а в реляционной алгебре точнее говорить об отношениях и наборах кортежей (и технически нет требования, чтобы они исходили из статически определенных таблиц).

Jeroen Mostert 22.02.2023 14:25

Я не уверен, что любое из этих утверждений пытается заявить, @BogdanSahlean. Пожалуйста, попробуйте перефразировать.

Larnu 22.02.2023 14:35

если вы завернете свой код изменения в EXEC («изменить таблицу ...»), он должен работать

siggemannen 22.02.2023 15:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите динамически добавить столбец и не уверены, существует ли столбец. Это должно работать:

DROP TABLE IF EXISTS #Table

SELECT 1 AS FirstColumn INTO #Table


IF NOT EXISTS(SELECT 1 FROM tempdb.sys.columns 
          WHERE Name = N'FirstColumn'
          AND Object_ID = OBJECT_ID('tempdb..#Table'))
BEGIN
        ALTER TABLE #Table 
        ADD FirstColumn int;
END

Другие вопросы по теме