Да, apparenlyt SQL CE вообще не поддерживает язык процедур SQL. Единственное, о чем я могу думать, это просто выполнить вашу Alter Table и затем игнорировать любые ошибки. :-(

я неожиданная проблема. Я делаю сценарий для обновления схемы в базе данных SQL CE. Это не будет работать:

if not exists
(
    Select column_name from information_schema.columns
    where column_name = 'TempTestField' 
        and table_name = 'Inventory_Master_File' 
)
    Alter table Inventory_Master_File
      add TempTestField nvarchar(10) null   

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

Обратите внимание, что часть "select" работает нормально, а также часть "alter". Проблема в том, «если не существует». Я знаю, что есть некоторые другие сообщения о подобных проблемах с использованием SQL CE, но я не смог найти ответ на эту конкретную проблему.

ура
отметка

ОБНОВИТЬ:

Я потратил больше часа на поиски решения. Я нашел много сообщений с просьбой помочь с подобными проблемами, но я все еще не знаю, как это исправить. Я действительно не хочу делать это в коде C #. Мне нужно сделать это в сценарии SQL. Я не могу поверить, что это основное вызывает столько трудностей :(

 Martin Smith11 янв. 2011 г., 02:52
Поддерживает ли этоTRY .. CATCH или какие-либо операторы управления потоком вообще?
 Martin Smith11 янв. 2011 г., 02:32
Похоже, именноif это проблема.stackoverflow.com/questions/431511/... Я не знаю, как обойти это.
 Dour High Arch11 янв. 2011 г., 03:39
CASE не является оператором потока управления, это выражение, которое возвращает скаляр.
 Mark Evans11 янв. 2011 г., 02:34
Да, это правда, Мартин. Оказывается, SQL CE не поддерживает «IF». Черт возьми это !!! Я не могу заставить его работать, используя "CASE" либо :(
 Mark Evans11 янв. 2011 г., 03:06
Только ДЕЛО. Они не делают это легко ...

Ответы на вопрос(3)

что не знаком со специальными ограничениями SQL Server CE, однако, если он поддерживает Dynamic SQL, то это должно работать:

Declare @sql as nvarchar(max);
Set @sql = '';

Select @sql = 'Alter table Inventory_Master_File
  add TempTestField nvarchar(10) null   '
from information_schema.columns
where column_name = 'TempTestField' 
    and table_name = 'Inventory_Master_File' 

EXEC(@sql);
 Mark Evans11 янв. 2011 г., 03:07
Спасибо за предложение, но оно не справится даже с "объявить". Чертовски больно!
 RBarryYoung12 янв. 2011 г., 01:58
Да, apparenlyt SQL CE вообще не поддерживает язык процедур SQL. Единственное, о чем я могу думать, это просто выполнить вашу Alter Table и затем игнорировать любые ошибки. :-(
 ErikEJ11 янв. 2011 г., 11:31
Этот синтаксис не поддерживается SQL Server Compact
Решение Вопроса

что SQL CE вообще не поддерживает никаких процедурных расширений; только DDL и DML, как с 1970-х годов.

Вам придется либо добавить процедурную логику в свое приложение (C # или что-то еще), либо перейти на встраиваемую базу данных с процедурными расширениями, такими как MySQL.

 Mark Evans11 янв. 2011 г., 05:51
Да, вы правы (к сожалению). Я собираюсь сделать это в C #.

если у меня не было процедурных расширений, я просто запустил бы инструкцию ALTER TABLE. Если поле уже существует, вы получите исключение. Поскольку вы должны попытаться ... поймать это любым способом, вы просто должны обработать это исключение отдельно в вашей ключевой фразе ...

только мои два цента.

 Mark Evans12 янв. 2011 г., 23:11
Спасибо за предложение, Манфред, но я не хочу этого делать. Я хочу, чтобы исключения происходили только в том случае, если что-то пошло не так. Я собираюсь сделать все это на C #, а не SQL.

Ваш ответ на вопрос