Skip To Content

Aplicar las consultas SQL estandarizadas

ArcGIS Server incluye una opción de seguridad que obliga a los desarrolladores a usar consultas SQL estandarizadas para trabajar con servicios de mapas, entidades, imágenes y WFS a través de REST o SOAP. Esto facilita las consultas a los servicios de ArcGIS Server por parte de los desarrolladores y las aplicaciones y también ayuda a evitar los ataques por inyección de SQL. Las consultas estandarizadas están activadas de forma predeterminada, pero el administrador del servidor puede deshabilitarlas.

Consultas estandarizadas

Si las consultas estandarizadas están habilitadas, ArcGIS Server comprueba la sintaxis estándar y no permite sintaxis ni funciones específicas de la base de datos. Si, como desarrollador de aplicaciones, utiliza actualmente la sintaxis y las funciones específicas de la base de datos, deberá actualizar las cláusulas WHERE en el código de la aplicación para usar la sintaxis de SQL común admitida por ArcGIS. Como alternativa, puede deshabilitar que ArcGIS Server compruebe que las consultas sean estandarizadas.

Limitaciones de las consultas estandarizadas

Las consultas estandarizadas se aplican a todo el sitio de ArcGIS Server. No se pueden habilitar para algunos servicios y deshabilitar para los demás.

Las consultas estandarizadas no se admiten en uniones entre espacios de trabajo diferentes. Además, no se admiten las tablas de base de datos a las que se accede mediante un archivo de conexión OLE DB. Si sus datos de servicio contienen estos orígenes, tendrá que usar métodos alternativos para hacer referencia a sus datos.

Las subconsultas como cláusula WHERE, por ejemplo, POP_2010 = (SELECT min(POP_2010)) FROM counties, no son compatibles.

Escribir una consulta estandarizada

La tabla situada al final de este tema describe las funciones SQL compatibles con ArcGIS Server. Puede usar esta tabla como ayuda para saber qué funciones SQL se pueden usar para generar consultas estandarizadas que se puedan utilizar con servicios de mapas, entidades, imágenes y WFS en sus aplicaciones.

Determinar si ArcGIS Server usa consultas estandarizadas

Tal como se ha indicado anteriormente, las consultas estandarizadas están habilitadas de forma predeterminada y se aplican a todos los servicios de mapas, entidades, imágenes y WFS en el sitio de ArcGIS Server. Sin embargo, un administrador del servidor puede verificar que las consultas estandarizadas se utilizan iniciando sesión en el Directorio de administrador de ArcGIS Server y yendo a Sistema > Propiedades > Actualizar. Si no se muestra ninguna propiedad del sistema en el cuadro de diálogo Propiedades del sistema o aparece {"standardizedQueries": "true"}, significa que las consultas estandarizadas están habilitadas.

De forma alternativa, los administradores, desarrolladores de aplicaciones y clientes pueden verificar que las consultas estandarizadas se utilicen accediendo a un servicio a través del Directorio de servicios de ArcGIS Server y revisando la propiedad Usar consultas estandarizadas. Para servicios de mapas, entidades y WFS, la propiedad se puede revisar accediendo a una capa o tabla específicas del servicio, por ejemplo, https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/service type/0. Para servicios de imágenes, la propiedad está disponible en el extremo de servicio, por ejemplo, https://gisserver.domain.com:6443/arcgis/rest/services/folder/service/ImageServer.

Puede consultar las instrucciones para acceder al Directorio de administrador o información sobre cómo inhabilitar las consultas estandarizadas en la sección siguiente de este tema.

Deshabilitar las consultas estandarizadas

Si necesita utilizar expresiones con cláusulas WHERE específicas de la base de datos en su aplicación, puede deshabilitar las consultas estandarizadas accediendo al Directorio de administrador de ArcGIS Server. Para ello, siga las instrucciones siguientes.

Precaución:

Si inhabilita esta opción de seguridad, su sitio será más vulnerable a posibles ataques por inyección de SQL.

Nota:

En ArcGIS Enterprise, no es posible deshabilitar las consultas estandarizadas para servicios de entidades alojados.

  1. Abra el Directorio de administrador e inicie sesión con un usuario que tenga permisos administrativos para el sitio.

    Por lo general, el Directorio de administrador está disponible en https://gisserver.domain.com:6443/arcgis/admin.

  2. Haga clic en system > properties > update.
  3. En la página Operación - actualizar, introduzca la cadena siguiente en el cuadro de diálogo Propiedades del sistema:

    {"standardizedQueries": "false"}

  4. Haga clic en Actualizar.
  5. Reinicie ArcGIS Server.

Ahora el sitio está configurado para permitir a los usuarios enviar solicitudes a servicios de mapas, entidades, imágenes y WFS utilizando consultas no estándar. Para volver a habilitar las consultas estandarizadas, repita las instrucciones anteriores, pero asigne el valor true a la propiedad standardizedQueries.

Funciones SQL admitidas en ArcGIS Server

La siguiente lista muestra qué funciones SQL son compatibles con ArcGIS Server y la sintaxis de cada una de ellas. Cuando se utilicen las siguientes sintaxis y funciones en las aplicaciones, ArcGIS Server las convertirá para adaptarlas a la especificación de la base de datos utilizada por el servicio.

Estas funciones se aplican a los servicios web de ArcGIS Server, no a las capas web alojadas.

Tipo de funciónFunciónDescripciónEjemplo

Fecha

CURRENT_DATE

Devuelve la fecha actual en la zona horaria de la sesión.

Nota:

La zona horaria de la sesión alojada es siempre UTC.

Datefield < CURRENT_DATE

CURRENT_TIME

Devuelve la hora actual en la sesión de tiempo uno.

Nota:

La zona horaria de la sesión alojada es siempre UTC.

Timestampfield < CURRENT_TIME

CURRENT_TIMESTAMP

Devuelve la hora local actual.

Nota:

La zona horaria de la sesión alojada es siempre UTC.

Timestampfield < CURRENT_TIMESTAMP

EXTRACT(extract_field FROM extract_source)

Devuelve la porción extract_field de extract_source.

El argumento extract_field puede ser una de las siguientes palabras clave: YEAR, MONTH, DAY, HOUR, MINUTE o SECOND.

Buscar todas las filas del mes de noviembre:

EXTRACT(MONTH FROM Datefield) = 11

Matemática

ABS(numeric_exp)

Devuelve el valor absoluto (positivo) de la expresión numérica especificada.

ABS(-99)=90

ACOS(numeric_exp)

Devuelve el arcocoseno de numeric_exp como un ángulo expresado en radianes.

ASIN(numeric_exp)

Devuelve el arcoseno de numeric_exp como un ángulo expresado en radianes.

ATAN(numeric_exp)

Devuelve el arcotangente de numeric_exp como un ángulo expresado en radianes.

CEILING(numeric_exp)

Devuelve el número entero más pequeño que sea mayor o igual a la expresión numérica especificada.

Busca todas las filas en las que el entero máximo de numeric_exp sea igual al valor deseado:

CEILING(ratings)=90

COS(numeric_exp)

Devuelve el coseno de numeric_exp como un ángulo expresado en radianes.

COSH(numeric_exp)

Devuelve el coseno hiperbólico de numeric_exp como un ángulo expresado en radianes.

FLOOR(numeric_exp)

Devuelve el entero más grande menor o igual que la expresión numérica especificada.

Busca todas las filas en las que el entero más cercano de numeric_exp sea igual al valor deseado:

FLOOR(ratings)=75

LOG(float_exp)

Devuelve el logaritmo natural de la expresión flotante especificada.

LOG10(float_exp)

Devuelve el logaritmo en base 10 de la expresión flotante especificada.

MOD(integer_exp1, integer_exp2)

Devuelve el restante de integer_exp1 dividido por integer_exp2.

Busca todas las filas en las que integer_exp1 sea un número par:

MOD(userid,2)=0

POWER(numeric_exp, integer_exp)

Devuelve el valor de la expresión especificada a la potencia especificada.

POTENCIA(Numericfield, 2) = 16

ROUND(numeric_exp, integer_exp)

Devuelve un valor numérico redondeado a la longitud o precisión especificada.

SIGN(numeric_exp)

Devuelve un indicador del signo matemático de numeric_exp.

Ejemplos: 0 para cero, 1 para positivo, -1 para negativo.

Buscar todas las filas en las que numeric_exp es un número negativo:

SIGN(elevation)=-1

SIN(numeric_exp)

Devuelve el seno de numeric_exp como un ángulo expresado en radianes.

SINH(numeric_exp)

Devuelve el seno hiperbólico de numeric_exp como un ángulo expresado en radianes.

TAN(numeric_exp)

Devuelve la tangente de numeric_exp como un ángulo expresado en radianes.

TANH(numeric_exp)

Devuelve la tangente hiperbólico de numeric_exp como un ángulo expresado en radianes.

TRUNCATE(numeric_exp, integer_exp)

Devuelve un numeric_exp truncado a integer_exp lugares a la derecha del punto decimal sin redondear el valor.

TRUNCATE(0.5463111445,3)=0.546

Agregar

AVG(numeric_exp, integer_exp)

Devuelve la media calculada de los valores en numeric_exp.

outStatistics=[{"statisticType": "avg","onStatisticField": "pop1997","outStatisticFieldName": "avg_pop1997"}]

COUNT(string_exp OR ASTERISK)

Devuelve el número de filas que contienen una string_exp.

outStatistics=[{"statisticType": "count","onStatisticField": "p_females","outStatisticFieldName": "count_p_females"}]

MAX(numeric_exp)

MAX(string_exp)

MAX(datetime_exp)

Devuelve el valor más grande en numeric_exp, string_exp o datetime_exp.

Encuentre el valor máximo en todas las filas numeric_exp:

outStatistics=[{"statisticType": "max","onStatisticField": "p_males","outStatisticFieldName": "max_p_males"}]

MIN(numeric_exp)

MIN(numeric_exp)

MIN(numeric_exp)

Devuelve el valor más pequeño en numeric_exp, string_exp o datetime_exp.

Encuentre el valor mínimo en todas las filas numeric_exp:

outStatistics=[{"statisticType": "min","onStatisticField": "pop1990","outStatisticFieldName": "min_pop1990"}]

STDDEV(numeric_exp)

Devuelve la desviación estándar de los valores en numeric_exp.

Busca el valor de la desviación estándar en todas las filas numeric_exp:

outStatistics=[{"statisticType": "stddev","onStatisticField": "eval_score","outStatisticFieldName": "stddev_eval_score"}]

SUM(numeric_exp)

Devuelve la suma de los valores en numeric_exp.

Encuentra la suma de los valores en todas las filas numeric_exp:

outStatistics=[{"statisticType": "sum","onStatisticField": "p_females","outStatisticFieldName": "sum_p_females"}]

VAR(numeric_exp)

Devuelve la varianza de los valores en numeric_exp.

Encuentre el valor de la varianza en todas las filas numeric_exp:

outStatistics=[{"statisticType": "var","onStatisticField": "pop1980","outStatisticFieldName": "var_pop1980"}]

Cadena de caracteres

CHAR_LENGTH(string_exp)

Devuelve la longitud en caracteres de la cadena de entrada.

Busca todas las filas en las que la longitud de string_exp sea superior a 10:

CHAR_LENGTH(string_exp) > 10

CONCAT(string_exp1, string_exp2)

Devuelve una cadena de caracteres que es el resultado de concatenar dos o más valores de cadena de caracteres.

Genera una versión concatenada de string_exp1 y string_exp2 con un carácter de concatenación:

OutFields=CONCAT(id,CONCAT(I-,name))

LOWER(string_exp)

Devuelve una cadena de caracteres igual a string_exp con todos los caracteres en mayúsculas convertidos en minúsculas. La configuración regional predeterminada es la configuración regional de la base de datos.

Busca todas las filas donde el valor sea la cadena de caracteres deseada, sin importar si se trata de mayúsculas o minúsculas:

LOWER(string_field) = "lowered_string"

POSITION(cahracter_exp1 IN character_exp2)

Devuelve la posición entera del primer character_exp1 en character_exp2.

Buscar todas las filas cuyo primer carácter sea "I":

POSITION('I' IN state_name) = 1

SUBSTRING(string_exp FROM start FOR length)

SUBSTRING(string_exp, integer_exp_start, integer_exp_length)

Devuelve una cadena de caracteres derivada de string_exp, que comienza en la posición de carácter especificada por start y tiene length caracteres.

Buscar todas las filas cuyos dos primeros caracteres de los valores de Stringfield sean Ch:

SUBCADENA(Stringfield FROM 1 FOR 2)='Ch'

TRIM(BOTH|LEADING|TRAILING trim_character FROM string_exp)

Devuelve string_exp con trim_character quitado del extremo inicial, del extremo final o de ambos extremos de la cadena.

Salida string_field sin el prefijo y sufijo no deseados:

OutFields=TRIM(BOTH '__' FROM string_exp)

MAY.(string_exp)

Devuelve una cadena de caracteres equivalente a la de string_exp, con todos los caracteres en minúsculas convertidos en mayúsculas. La configuración regional predeterminada es la configuración regional de la base de datos.

UPPER(name) = "TEXAS"

Otro

CAST(expression AS target_data_type)

Devuelve una expresión convertida a target_data_type.

Busca todas las filas en las que la expresión convertida a un tipo de datos específico sea igual al valor deseado:

CAST(parcel_id AS INT)=38456

COALESCE(expression1,expression2,...)

Devuelve el primer valor no nulo de una lista de expresiones.

Buscar todas las filas en las que el primer valor no nulo sea el valor especificado:

COALESCE(preferred_name, nickname, first_name) = 'MyName'

CURRENT_USER

Devuelve el usuario que ha iniciado sesión actualmente.

Nota:

Esto no devuelve el usuario actual de la base de datos.

Buscar todas las filas en las que el usuario actualmente conectado sea el único trabajador.

workerfield=CURRENT_USER

Busque todas las filas en las que el usuario actualmente conectado aparece como trabajador, independientemente de si hay otros trabajadores.

position(CURRENT_USER in workerfield) > 0

NULLIF(expression1,expression2)

Compara dos expresiones. Si son iguales, devuelve NULL. Si no son iguales, devuelve expression1.

Muestra el resultado de NULLIF comparaciones entre la expression1 y la expression2:

outFields=NULLIF(units_sold, unit_sell_goal)