У меня есть хранимая процедура, которая вставляет в таблицу с пространственным индексом на одном из ее полей.
Когда я запускаю процедуру из SQL Server Management Studio, она работает нормально.
Когда я запускаю его из PHP, он возвращает ошибку:
«INSERT не удалось, потому что следующие параметры SET имеют неправильные настройки:« CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING ». Убедитесь, что параметры SET правильны для использования с индексированными представлениями и / или индексами по вычисляемым столбцам и / или отфильтрованным индексам и / или запросам уведомлений и / или методы типа данных XML и / или операции пространственного индекса «
Из Management Studio я пробовал много разных комбинаций настроек, пока не нашел список, который у меня есть в процедуре ниже.
В Managment Studio ошибка изменяется в зависимости от заданных мною опций, но PHP всегда отвечает: «CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING»
Я настроил PHP для использования того же пользователя SQL, что и Management Studio, и я пробовал и mssql_query, и mssql_execute со связанными параметрами.
Пространственный индекс находится на поле post.location
Если я удаляю пространственный индекс, он работает, но мне нужен пространственный индекс.
СОЗДАТЬ ПРОЦЕДУРУ insert_post
(
@subject AS VARCHAR (250),
@body AS VARCHAR (2000),
@ latitude AS FLOAT,
@longitude AS FLOAT
)
КАК НАЧАТЬ
SET NOCOUNT ON
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326)
INSERT INTO post
(
subject,
body,
location
) VALUES (
@subject,
@body,
@location
)
КОНЕЦ
Оказывается, что установка параметров внутри самой хранимой процедуры не имела никакого эффекта. Они должны быть установлены до вызова процедуры:
mssql_query('SET CONCAT_NULL_YIELDS_NULL ON');
mssql_query('SET ANSI_WARNINGS ON');
mssql_query('SET ANSI_PADDING ON');
$stmt = mssql_init('insert_post');
Других решений пока нет …