#sql #sql-server
#sql #sql-сервер
Вопрос:
Я пытаюсь создать запрос, который является несколько универсальным для выполнения с разными версиями одной и той же базы данных. В более старых версиях определенные столбцы не существуют в конкретной таблице, к которой я пытаюсь обратиться. Идея состоит в том, чтобы это запускалось кем-то, кто не будет знать, какая у них версия. Итак, я пытаюсь заставить запрос проверять, существует ли определенный столбец (и если этого не происходит, ни один из других сомнительных столбцов тоже), затем запустите один из двух вариантов одного и того же скрипта, основываясь на том, какие столбцы существуют, а какие нет.
Маскируя некоторую служебную информацию, это проблемная область:
IF COL_LENGTH('dbo.users', '<column A>') IS NOT NULL -- Check for existence of <column A> column
-- Some earlier versions do not have this column
UPDATE Users
SET Password = 'XXXX', <column A> = 0, <column B> = NULL
WHERE Login = 'User' -- Reset password for later versions
ELSE
UPDATE Users
SET Password = 'XXXX'
WHERE Login = 'User' -- Reset password for earlier versions
PRINT 'The Password for Login "User" has been reset to XXXX.'
END
Проблема, которую я нахожу, заключается в том, что весь скрипт (над этой областью есть еще) выдает ошибку и ничего не делает, потому что столбец A не существует в более старой версии DB. Похоже, что он не игнорирует первый показанный оператор update, если этот столбец отсутствует.
Тестирование в более новой версии DB полностью успешно, хотя в ней есть столбец A.
Любые идеи по этому поводу приветствуются. Спасибо.
Комментарии:
1. Было бы полезно, если бы вы пометили свой пост с помощью используемой вами СУБД.
2. Прошу прощения, поскольку я на самом деле не администратор базы данных, а просто тот, кто управляет конкретной программой, использующей БД. Что такое СУБД?
3. Вы используете Oracle? MySQL? PostgreSQL? MySQL? Microsoft SQL Server? И т.д.? Соответствующая пометка вашего сообщения передаст некоторые доступные вам инструменты.
4. MS SQL SQL Management Studio. Мои извинения.
5. Поместите код, ссылающийся на потенциально несуществующий столбец, внутри EXEC, чтобы он компилировался только в том случае, если эта ветвь принимается для выполнения
Ответ №1:
Проблема в том, что сценарий должен быть скомпилирован . , , и вам не хватает столбцов в компиляции. Я мог бы предложить:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_SCHEMA = 'dbo' AND
TABLE_NAME = 'users' AND
COLUMN_NAME = '<column A>'
) -- Check for existence of <column A> column
BEGIN
-- Some earlier versions do not have this column
EXEC('
UPDATE Users
SET Password = ''XXXX'', <column A> = 0, <column B> = NULL
WHERE Login = ''User''
'); -- Reset password for later versions
END;
ELSE
BEGIN
UPDATE Users
SET Password = 'XXXX'
WHERE Login = 'User' -- Reset password for earlier versions
PRINT 'The Password for Login "User" has been reset to XXXX.'
END;
Обе версии имеют Password
, поэтому ELSE
должны нормально компилироваться.
Комментарии:
1. Спасибо, Гордон. Это сработало прекрасно. 🙂 Очень признателен.