2012-09-24 1 views
0

Из 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"; 

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

+0

Да. Если предложение set прочитало 'set a.var1 = b.var1', инструкция обновления будет работать. –

+0

Вы упоминаете SAS, но SAS не допускает пробелов в именах переменных (по крайней мере, не без специального кодирования). Может ли это быть проблема? Выполняете ли вы вышеуказанное в программе SAS, и если да, то именно что вы пытаетесь? – BellevueBob

+0

@BobDuell, вы правы, SAS не допускает пробелов в именах переменных. Однако таблицы хранятся в MS Access, что позволяет использовать пробелы.Вышеприведенный пример кода будет содержаться в сквозном: 'proc sql; подключиться к доступу (путь = "C: /database.mdb"); выполнить ( обновление [Оригинал] Таблица как внутреннее соединение Updates, как б на a.ID = b.ID набор а. [Variable 1] = б. [Переменная 1] где год = "2000" ) по доступ; отключить доступ; quit; ' –

ответ

2

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

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

Вы можете избежать путаницы двигателя db, заключая в квадратные скобки 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, которые вы будете страдать. :-)

Для получения дополнительной информации о «вызовах именования» см. Problem names and reserved words in Access.

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

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

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

+0

Благодарим вас за это, но проблема существует и без использования предложения where, как указано в моем первоначальном вопросе. Проблема буквально возникает только тогда, когда имена полей в предложении set имеют пробелы. –

1

Этот запрос работал как есть для меня (изменение только имен таблиц), оба выполняются от доступа и запускаются из 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; 
+0

В итоге я просто переименовал поля в Access. Я не знаю, почему это не сработало раньше, но теперь это работает. –

1

Если вы хотите использовать ссылку Имя_библиотеки вместо доступа SAS, вы можете использовать опцию «dquote = AnSi» после того, как ваше заявление SQL Proc, как показано ниже. В этом примере я создал ссылку на библиотеку под названием 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;