Псевдонимы таблиц и имена полей с пробелами

Из SAS я обновляю таблицу в MS Access значениями из другой таблицы. Некоторые поля в обновляемой таблице содержат пробелы. Кажется, это вызывает проблемы в операторе обновления. Это дает мне ошибку «Слишком мало параметров. Ожидается 1.»:

update [Original Table] as a inner join Updates as b on a.ID = b.ID
set a.[Variable 1] = b.[Variable 1]
where Year = "2000";

Для имен полей без пробелов оператор работает без ошибок. И поскольку я использую имена полей в другом месте без ссылок на таблицы/псевдонимов, я полагаю, что комбинация [] и псевдонимов вызывает проблему. Любые предложения по решению этой проблемы?


person attitude_stool    schedule 24.09.2012    source источник
comment
Да. Если бы предложение set читалось как set a.var1 = b.var1, оператор update работал бы.   -  person attitude_stool    schedule 24.09.2012
comment
Вы упоминаете SAS, но SAS не допускает пробелов в именах переменных (по крайней мере, без специального кодирования). Может ли это быть проблема? Выполняете ли вы вышеперечисленное в программе SAS, и если да, то что именно вы пытаетесь?   -  person BellevueBob    schedule 25.09.2012
comment
@BobDuell, вы правы, SAS не допускает пробелов в именах переменных. Таблицы, однако, размещены в MS Access, что позволяет использовать пробелы. Вышеприведенный пример кода будет содержаться в транзитной части: proc sql; connect to access (path="C:/database.mdb"); execute ( update [Original Table] as a inner join Updates as b on a.ID = b.ID set a.[Variable 1] = b.[Variable 1] where Year = "2000" ) by access; disconnect from access; quit;   -  person attitude_stool    schedule 25.09.2012
comment
Это может быть дефект SAS, возможно, связанный с версией SAS (или Access), которую вы используете. То, что вы пытаетесь сделать, кажется правильным, поэтому я бы обратился за помощью в службу технической поддержки SAS.   -  person BellevueBob    schedule 25.09.2012
comment
Может ли ваш запрос выполняться в Access? Если он работает в Access, но не в SAS Passthrough, то это проблема SAS. Если он не работает в Access, то либо у вас плохо спроектированный запрос, либо что-то не так с вашей версией Access.   -  person Joe    schedule 25.09.2012


Ответы (3)


Year() — это функция, которая возвращает целое число вариантного подтипа, соответствующее календарному году значения даты, которое вы даете функции.

В вашем случае кажется, что у вас есть поле с именем Year. Так что, возможно, «отсутствующий параметр» — это ожидаемый аргумент даты для Year() функции.

Вы можете избежать путаницы с механизмом БД, заключив Year в квадратные скобки. Скобки сигнализируют движку, что Year — это имя объекта (поля), а не функции.

update [Original Table] as a inner join Updates as b on a.ID = b.ID
set a.[Variable 1] = b.[Variable 1]
where [Year] = "2000";

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

Дополнительную информацию о «проблемах именования» см. в разделе имена задач и зарезервированные слова в Access.

Извините, я упустил из виду тот факт, что запрос может работать, несмотря на проблему с предложением WHERE.

Я ничего не вижу об остатке вашего SQL, который должен вызвать жалобу от механизма БД. Я предполагаю, что вы проверили это утверждение непосредственно в Access и не получили никаких ошибок.

Если есть что-то особенное во взаимодействии между SAS и Access, которое вызывает это, возможно, вы могли бы использовать сохраненный запрос Access в качестве обходного пути. Возьмите этот SQL и сохраните его как именованный запрос qrySasTest в базе данных Access. Затем попробуйте выполнить qrySasTest со стороны SAS.

person HansUp    schedule 24.09.2012
comment
Спасибо, что указали на это, но проблема существует как с использованием предложения where, так и без него, как указано в моем первоначальном вопросе. Проблема буквально возникает только тогда, когда имена полей в предложении set содержат пробелы. - person attitude_stool; 25.09.2012

Этот запрос работал для меня как есть (изменение только имен таблиц), как из доступа, так и из SAS. Это с 64-разрядной версией SAS 9.3 и 64-разрядной версией Office 2010, поэтому я полагаю, что с вашей версией (версиями) обоих может происходить что-то другое, но это сработало, как и ожидалось.

proc sql; 
connect to access (path="c:\temp\test.accdb"); 
execute 
( 
update [Test2] as a inner join Test as b on a.ID = b.ID
set a.[Variable 1] = b.[Variable 1]
where Year ="2000";
) 
by access; 
disconnect from access; 
quit;
person Joe    schedule 25.09.2012
comment
В итоге я просто переименовал поля в Access. Не знаю, почему раньше не работало, а сейчас работает. - person attitude_stool; 26.09.2012

Если вы хотите использовать ссылку на имя библиотеки вместо доступа к SAS, вы можете использовать опцию «dquote=ansi» после инструкции proc sql, как показано ниже. В этом примере я создал ссылку на библиотеку с именем mydbms:

libname mydbms odbc dsn=prompt preserve_names=yes;

    proc sql dquote=ansi;
    update mydbms."Original Table" as a inner join mydbms.Updates as b on a.ID = b.ID
    set a."Variable 1" = b."Variable 1"
    where Year = "2000";
    quit;
person StatsStudent    schedule 23.05.2015