You are on page 1of 843

Contents

Información general
Agregado
AVG
CHECKSUM_AGG
COUNT
COUNT_BIG
GROUPING
GROUPING_ID
MAX
MIN
STDEV
STDEVP
SUM
VAR
VARP
Analytic
CUME_DIST
FIRST_VALUE
LAG
LAST_VALUE
LEAD
PERCENTILE_CONT
PERCENTILE_DISC
PERCENT_RANK
Intercalación
Intercalación: COLLATIONPROPERTY
Intercalación: TERTIARY_WEIGHTS
Configuración
@@DBTS
@@LANGID
@@LANGUAGE
@@LOCK_TIMEOUT
@@MAX_CONNECTIONS
@@MAX_PRECISION
@@NESTLEVEL
@@OPTIONS
@@REMSERVER
@@SERVERNAME
@@SERVICENAME
@@SPID
@@TEXTSIZE
@@VERSION
Conversión
CAST y CONVERT
PARSE
TRY_CAST
TRY_CONVERT
TRY_PARSE
Criptográficas
ASYMKEY_ID
ASYMKEYPROPERTY
CERTPROPERTY
CERT_ID
CRYPT_GEN_RANDOM
DECRYPTBYASYMKEY
DECRYPTBYCERT
DECRYPTBYKEY
DECRYPTBYKEYAUTOASYMKEY
DECRYPTBYKEYAUTOCERT
DECRYPTBYPASSPHRASE
ENCRYPTBYASYMKEY
ENCRYPTBYCERT
ENCRYPTBYKEY
ENCRYPTBYPASSPHRASE
HASHBYTES
IS_OBJECTSIGNED
KEY_GUID
KEY_ID
KEY_NAME
SIGNBYASYMKEY
SIGNBYCERT
SYMKEYPROPERTY
VERIFYSIGNEDBYCERT
VERIFYSIGNEDBYASYMKEY
Cursor
@@CURSOR_ROWS
@@FETCH_STATUS
CURSOR_STATUS
Tipo de datos
DATALENGTH
IDENT_CURRENT
IDENT_INCR
IDENT_SEED
IDENTITY (función)
SQL_VARIANT_PROPERTY
Fecha y hora
@@DATEFIRST
CURRENT_TIMESTAMP
DATEADD
DATEDIFF
DATEDIFF_BIG
DATEFROMPARTS
DATENAME
DATEPART
DATETIME2FROMPARTS
DATETIMEFROMPARTS
DATETIMEOFFSETFROMPARTS
DAY
EOMONTH
GETDATE
GETUTCDATE
ISDATE
MONTH
SMALLDATETIMEFROMPARTS
SWITCHOFFSET
SYSDATETIME
SYSDATETIMEOFFSET
SYSUTCDATETIME
TIMEFROMPARTS
TODATETIMEOFFSET
YEAR
JSON
ISJSON
JSON_VALUE
JSON_QUERY
JSON_MODIFY
Matemáticas
ABS
ACOS
ASIN
ATAN
ATN2
CEILING
COS
COT
DEGREES
EXP
FLOOR
LOG
LOG10
PI
POWER
RADIANS
RAND
ROUND
SIGN
SIN
SQRT
SQUARE
TAN
Lógico
CHOOSE
IIF
Metadatos
@@PROCID
APP_NAME
APPLOCK_MODE
APPLOCK_TEST
ASSEMBLYPROPERTY
COL_LENGTH
COL_NAME
COLUMNPROPERTY
DATABASE_PRINCIPAL_ID
DATABASEPROPERTYEX
DB_ID
DB_NAME
FILE_ID
FILE_IDEX
FILE_NAME
FILEGROUP_ID
FILEGROUP_NAME
FILEGROUPPROPERTY
FILEPROPERTY
FULLTEXTCATALOGPROPERTY
FULLTEXTSERVICEPROPERTY
INDEX_COL
INDEXKEY_PROPERTY
INDEXPROPERTY
NEXT VALUE FOR
OBJECT_DEFINITION
OBJECT_ID
OBJECT_NAME
OBJECT_SCHEMA_NAME
OBJECTPROPERTY
OBJECTPROPERTYEX
ORIGINAL_DB_NAME
PARSENAME
SCHEMA_ID
SCHEMA_NAME
SCOPE_IDENTITY
SERVERPROPERTY
STATS_DATE
TYPE_ID
TYPE_NAME
TYPEPROPERTY
VERSION
Funciones escalares de ODBC
Clasificación
DENSE_RANK
NTILE
RANK
ROW_NUMBER
REPLICATION
PUBLISHINGSERVERNAME
Conjunto de filas
OPENDATASOURCE
OPENJSON
OPENQUERY
OPENROWSET
OPENXML
Seguridad
CERTENCODED
CERTPRIVATEKEY
CURRENT_USER
HAS_DBACCESS
HAS_PERMS_BY_NAME
IS_MEMBER
IS_ROLEMEMBER
IS_SRVROLEMEMBER
LOGINPROPERTY
ORIGINAL_LOGIN
PERMISSIONS
PWDENCRYPT
PWDCOMPARE
SESSION_USER
SESSIONPROPERTY
SUSER_ID
SUSER_NAME
SUSER_SID
SUSER_SNAME
SYSTEM_USER
USER
USER_ID
USER_NAME
String
ASCII
CHAR
CHARINDEX
CONCAT
CONCAT_WS
DIFFERENCE
FORMAT
LEFT
LEN
LOWER
LTRIM
NCHAR
PATINDEX
QUOTENAME
REPLACE
REPLICATE
REVERSE
RIGHT
RTRIM
SOUNDEX
SPACE
STR
STRING_AGG
STRING_ESCAPE
STRING_SPLIT
STUFF
SUBSTRING
TRANSLATE
TRIM
UNICODE
UPPER
Sistema
$PARTITION
@@ERROR
@@IDENTITY
@@PACK_RECEIVED
@@ROWCOUNT
@@TRANCOUNT
BINARY_CHECKSUM
CHECKSUM
COMPRESS
CONNECTIONPROPERTY
CONTEXT_INFO
CURRENT_REQUEST_ID
CURRENT_TRANSACTION_ID
DECOMPRESS
ERROR_LINE
ERROR_MESSAGE
ERROR_NUMBER
ERROR_PROCEDURE
ERROR_SEVERITY
ERROR_STATE
FORMATMESSAGE
GET_FILESTREAM_TRANSACTION_CONTEXT
GETANSINULL
HOST_ID
HOST_NAME
ISNULL
ISNUMERIC
MIN_ACTIVE_ROWVERSION
NEWID
NEWSEQUENTIALID
ROWCOUNT_BIG
SESSION_CONTEXT
SESSION_ID
XACT_STATE
Funciones estadísticas del sistema
@@CONNECTIONS
@@CPU_BUSY
@@IDLE
@@IO_BUSY
@@PACK_SENT
@@PACKET_ERRORS
@@TIMETICKS
@@TOTAL_ERRORS
@@TOTAL_READ
@@TOTAL_WRITE
Texto e imagen
TEXTPTR
TEXTVALID
Desencadenador
COLUMNS_UPDATED
EVENTDATA
TRIGGER_NESTLEVEL
UPDATE()
¿Cuáles son las funciones de base de datos SQL?
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Obtenga información sobre las categorías de las funciones integradas que se pueden usar con las bases de
datos SQL. Puede usar las funciones integradas o crear las suyas propias.

Funciones de agregado
Las funciones de agregado realizan un cálculo sobre un conjunto de valores y devuelven un solo valor. Se
pueden usar en la lista de selección o en la cláusula HAVING de una instrucción SELECT. Puede usar una
agregación en combinación con la cláusula GROUP BY para calcular la agregación en las categorías de filas.
Use la cláusula OVER para calcular la agregación en un intervalo de valor específico. La cláusula OVER no
puede seguir las agregaciones GROUPING o GROUPING_ID.
Todas las funciones de agregación son deterministas; es decir, siempre devuelven el mismo resultado cuando se
ejecutan con los mismos valores de entrada. Para más información, vea Funciones deterministas y no
deterministas.

Funciones analíticas
Las funciones analíticas calculan un valor agregado basándose en un grupo de filas. A diferencia de las
funciones de agregado, estas funciones pueden devolver varias filas para cada grupo. Puede usar funciones
analíticas para calcular medias móviles, totales acumulados, porcentajes o resultados de N valores superiores
dentro de un grupo.

Funciones de categoría
Las funciones de categoría devuelven un valor de categoría para cada fila de una partición. Según la función
que se utilice, algunas filas pueden recibir el mismo valor que otras. Las funciones de categoría son no
deterministas.

Funciones de conjuntos de filas


Las funciones de conjuntos de filas devuelven un objeto que se puede usar como referencias de tabla en una
instrucción SQL.

Funciones escalares
Operan sobre un valor y después devuelven otro valor. Las funciones escalares se pueden utilizar donde la
expresión sea válida.
Categorías de las funciones escalares
CATEGORÍA DE LA FUNCIÓN DESCRIPCIÓN

Funciones de configuración Devuelven información acerca de la configuración actual.

Funciones de conversión Admiten conversión y conversión de tipos de datos.


CATEGORÍA DE LA FUNCIÓN DESCRIPCIÓN

Funciones del cursor Devuelven información acerca de los cursores.

Tipos de datos y funciones de fecha y hora Llevan a cabo operaciones sobre un valor de entrada de
fecha y hora, y devuelven un valor numérico, de cadena o de
fecha y hora.

Funciones JSON Validan, consultan o cambian datos JSON.

Funciones lógicas Realizan operaciones lógicas.

Funciones matemáticas Realizan cálculos basados en valores de entrada


proporcionados como parámetros a las funciones y
devuelven valores numéricos.

Funciones de metadatos Devuelven información acerca de la base de datos y los


objetos de la base de datos.

Funciones de seguridad Devuelven información acerca de usuarios y roles.

Funciones de cadena Realizan operaciones en el valor de entrada de una cadena


(char o varchar) y devuelven una cadena o un valor
numérico.

Funciones del sistema Realizan operaciones y devuelven información acerca de


valores, objetos y configuraciones de una instancia de SQL
Server.

Funciones estadísticas del sistema Devuelven información estadística acerca del sistema.

Funciones de texto e imagen Realizan operaciones sobre los valores de entrada o


columnas de texto o imagen, y devuelven información acerca
del valor.

Determinismo de función
Las funciones integradas de SQL Server son deterministas o no deterministas. Las funciones son deterministas
cuando devuelven siempre el mismo resultado cada vez que se llaman con un conjunto específico de valores de
entrada. Las funciones son no deterministas cuando es posible que devuelvan distintos resultados cada vez que
se llaman con un mismo conjunto específico de valores de entrada. Para más información, vea Funciones
deterministas y no deterministas.

Intercalación de funciones
Las funciones que toman una entrada de cadena de caracteres y devuelven una salida de cadena de caracteres
utilizan la intercalación de la cadena de entrada para la salida.
Las funciones que toman entradas que no son de caracteres y devuelven una cadena de caracteres utilizan la
intercalación predeterminada de la base de datos actual para la salida.
Las funciones que toman varias entradas de cadena de caracteres y devuelven una cadena de caracteres utilizan
las reglas de prioridad de intercalación para establecer la intercalación de la cadena de salida. Para más
información, vea Prioridad de intercalación (Transact-SQL ).
Ver también
CREATE FUNCTION (Transact-SQL )
Funciones deterministas y no deterministas
Using Stored Procedures (MDX) (Usar procedimientos almacenados [MDX])
Funciones de agregado (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Un función de agregado realiza un cálculo sobre un conjunto de valores y devuelve un solo valor. Con la
excepción de COUNT , las funciones de agregado ignoran los valores NULL. Las funciones de agregado se suelen
usar con la cláusula GROUP BY de la instrucción SELECT.
Todas las funciones de agregado son deterministas. En otras palabras, las funciones de agregado devuelven el
mismo valor cada vez que se las llama con un conjunto específico de valores de entrada. Vea Funciones
deterministas y no deterministas para obtener más información sobre el determinismo de las funciones. La
cláusula OVER puede seguir todas las funciones de agregado excepto GROUPING o GROUPING_ID.
Las funciones de agregado solo se pueden usar como expresiones en las situaciones siguientes:
La lista de selección de una instrucción SELECT (una subconsulta o una consulta externa).
Cláusula HAVING.
Transact-SQL proporciona las siguientes funciones de agregado:

AVG MIN

CHECKSUM_AGG SUM

COUNT STDEV

COUNT_BIG STDEVP

GROUPING STRING_AGG

GROUPING_ID VAR

MAX VARP

Vea también
Funciones integradas (Transact-SQL )
OVER (cláusula de Transact-SQL )
AVG (Transact-SQL)
17/07/2018 • 9 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el promedio de los valores de un grupo. Omite los valores NULL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
AVG ( [ ALL | DISTINCT ] expression )
[ OVER ( [ partition_by_clause ] order_by_clause ) ]

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que AVG opere solo en una instancia única de cada valor, independientemente del número de veces que
aparezca el valor.
expression
Una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit. No se permiten funciones de agregado ni subconsultas.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos de valores devueltos


El resultado evaluado de la expresión determina el tipo de valor devuelto.

RESULTADO DE LA EXPRESIÓN TIPO DE VALOR DEVUELTO

tinyint int

smallint int

int int

bigint bigint

Categoría decimal (p, s) decimal(38, s) dividido entre decimal(10, 0)


RESULTADO DE LA EXPRESIÓN TIPO DE VALOR DEVUELTO

Categorías money y smallmoney money

Categorías float y real float

Notas
Si el tipo de datos de expression es un tipo de datos de alias, el tipo de valor devuelto es también del tipo de datos
de alias. No obstante, si se asciende el tipo de datos base del tipo de datos de alias, por ejemplo, de tinyint a int, el
valor devuelto adquirirá el tipo de datos ascendido, no el tipo de datos de alias.
AVG () calcula la media de un conjunto de valores dividiendo la suma de estos valores por el recuento de valores
no NULL. Si la suma supera el valor máximo para el tipo de datos del valor devuelto, AVG () devolverá un error.
AVG es una función determinista cuando se utiliza con las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Usar las funciones SUM y AVG para los cálculos
En este ejemplo se calcula el promedio de horas de vacaciones y la suma de horas de baja por enfermedad que
han utilizado los vicepresidentes de Adventure Works Cycles. Cada una de estas funciones de agregado produce
un valor único de resumen para todas las filas recuperadas. En el ejemplo se usa la base de datos
AdventureWorks2012.

SELECT AVG(VacationHours)AS 'Average vacation hours',


SUM(SickLeaveHours) AS 'Total sick leave hours'
FROM HumanResources.Employee
WHERE JobTitle LIKE 'Vice President%';

El conjunto de resultados es el siguiente.

Average vacation hours Total sick leave hours


---------------------- ----------------------
25 97

(1 row(s) affected)

B. Usar las funciones SUM y AVG con una cláusula GROUP BY


Cuando se utiliza con una cláusula GROUP BY , cada función de agregado produce un solo valor que cubre cada
grupo, en vez un solo valor que cubra toda la tabla. En el ejemplo siguiente se obtienen valores de resumen para
cada territorio de ventas de la base de datos AdventureWorks2012. El resumen muestra el promedio de
bonificaciones recibidas por los vendedores de cada territorio y la suma de las ventas realizadas hasta la fecha en
cada territorio.

SELECT TerritoryID, AVG(Bonus)as 'Average bonus', SUM(SalesYTD) as 'YTD sales'


FROM Sales.SalesPerson
GROUP BY TerritoryID;
GO

El conjunto de resultados es el siguiente.


TerritoryID Average Bonus YTD Sales
----------- --------------------- ---------------------
NULL 0.00 1252127.9471
1 4133.3333 4502152.2674
2 4100.00 3763178.1787
3 2500.00 3189418.3662
4 2775.00 6709904.1666
5 6700.00 2315185.611
6 2750.00 4058260.1825
7 985.00 3121616.3202
8 75.00 1827066.7118
9 5650.00 1421810.9242
10 5150.00 4116871.2277

(11 row(s) affected)

C. Usar AVG con DISTINCT


En esta instrucción se devuelve el precio de venta promedio de los productos de la base de datos
AdventureWorks2012. Mediante el uso de DISTINCT, el cálculo tiene en cuenta solamente valores únicos.

SELECT AVG(DISTINCT ListPrice)


FROM Production.Product;

El conjunto de resultados es el siguiente.

------------------------------
437.4042

(1 row(s) affected)

D. Usar AVG sin DISTINCT


Sin DISTINCT, la función AVG busca el precio de venta promedio de todos los productos de la tabla Product de la
base de datos AdventureWorks2012, incluidos los valores duplicados.

SELECT AVG(ListPrice)
FROM Production.Product;

El conjunto de resultados es el siguiente.

------------------------------
438.6662

(1 row(s) affected)

E. Usar la cláusula OVER


En el ejemplo siguiente se usa la función AVG con la cláusula OVER para proporcionar una media móvil de ventas
anuales para cada territorio de la tabla Sales.SalesPerson de la base de datos AdventureWorks2012. Se crean
particiones de los datos por TerritoryID y se ordenan lógicamente por SalesYTD . Esto significa que la función
AVG se calcula para cada territorio en función del año de ventas. Tenga en cuenta que para TerritoryID 1, solo
hay dos filas para el año de ventas 2005, que representan los dos vendedores con ventas durante ese año. Se
calculan las ventas medias de estas dos filas y la tercera fila que representa las ventas durante el año 2006 se
incluye en el cálculo.
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;

El conjunto de resultados es el siguiente.

BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal


---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 559,697.56 559,697.56
287 NULL 2006 519,905.93 539,801.75 1,079,603.50
285 NULL 2007 172,524.45 417,375.98 1,252,127.95
283 1 2005 1,573,012.94 1,462,795.04 2,925,590.07
280 1 2005 1,352,577.13 1,462,795.04 2,925,590.07
284 1 2006 1,576,562.20 1,500,717.42 4,502,152.27
275 2 2005 3,763,178.18 3,763,178.18 3,763,178.18
277 3 2005 3,189,418.37 3,189,418.37 3,189,418.37
276 4 2005 4,251,368.55 3,354,952.08 6,709,904.17
281 4 2005 2,458,535.62 3,354,952.08 6,709,904.17

(10 row(s) affected)

En este ejemplo, la cláusula OVER no incluye PARTITION BY. Esto significa que la función se aplicará a todas las
filas devueltas por la consulta. La cláusula ORDER BY especificada en la cláusula OVER determina el orden lógico
al que se aplica la función AVG. La consulta devuelve una media móvil de ventas por año para todos los territorios
de ventas especificados en la cláusula WHERE. La cláusula ORDER BY especificada en la instrucción SELECT
determina el orden en que la instrucción SELECT muestra las filas de la consulta.

SELECT BusinessEntityID, TerritoryID


,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;

El conjunto de resultados es el siguiente.


BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 2,449,684.05 17,147,788.35
275 2 2005 3,763,178.18 2,449,684.05 17,147,788.35
276 4 2005 4,251,368.55 2,449,684.05 17,147,788.35
277 3 2005 3,189,418.37 2,449,684.05 17,147,788.35
280 1 2005 1,352,577.13 2,449,684.05 17,147,788.35
281 4 2005 2,458,535.62 2,449,684.05 17,147,788.35
283 1 2005 1,573,012.94 2,449,684.05 17,147,788.35
284 1 2006 1,576,562.20 2,138,250.72 19,244,256.47
287 NULL 2006 519,905.93 2,138,250.72 19,244,256.47
285 NULL 2007 172,524.45 1,941,678.09 19,416,780.93
(10 row(s) affected)

Vea también
Funciones de agregado (Transact-SQL )
OVER Clause (Transact-SQL ) (Cláusula OVER [Transact-SQL ])
CHECKSUM_AGG (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve la suma de comprobación de los valores de un grupo. CHECKSUM_AGG omite los valores
NULL. La cláusula OVER puede seguir a CHECKSUM_AGG .
Convenciones de sintaxis de Transact-SQL

Sintaxis
CHECKSUM_AGG ( [ ALL | DISTINCT ] expression )

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL es el argumento predeterminado.
DISTINCT
Especifica que CHECKSUM_AGG devuelve la suma de comprobación de valores únicos.
expression
Una expresión de entero. CHECKSUM_AGG no permite el uso de funciones de agregado ni subconsultas.

Tipos de valores devueltos


Devuelve la suma de comprobación de todos los valores de expression como int.

Notas
CHECKSUM_AGG puede detectar cambios en una tabla.
El resultado CHECKSUM_AGG no depende del orden de las filas de la tabla. Asimismo, las funciones CHECKSUM_AGG
permiten el uso de la palabra clave DISTINCT y de la cláusula GROUP BY.
Si se cambia un valor de una lista de expresiones, probablemente también cambiará la lista de valores de la suma
de comprobación de lista, aunque hay una pequeña posibilidad de que la suma de comprobación calculada no
cambie.
CHECKSUM_AGG tiene una funcionalidad similar a la de otras funciones de agregado. Para más información, vea
Funciones de agregado (Transact-SQL ).

Ejemplos
En estos ejemplos se usa CHECKSUM_AGG para detectar cambios en la columna Quantity de la tabla
ProductInventory en la base de datos AdventureWorks2012.
--Get the checksum value before the column value is changed.
SELECT CHECKSUM_AGG(CAST(Quantity AS int))
FROM Production.ProductInventory;
GO

El conjunto de resultados es el siguiente.

------------------------
262

UPDATE Production.ProductInventory
SET Quantity=125
WHERE Quantity=100;
GO
--Get the checksum of the modified column.
SELECT CHECKSUM_AGG(CAST(Quantity AS int))
FROM Production.ProductInventory;

El conjunto de resultados es el siguiente.

------------------------
287

Vea también
CHECKSUM (Transact-SQL )
Cláusula OVER (Transact-SQL )
COUNT (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de elementos encontrados en un grupo. COUNT funciona como la función
COUNT_BIG. Estas funciones difieren solo en los tipos de datos de sus valores devueltos. COUNT siempre
devuelve un valor de tipo de datos int. COUNT_BIG siempre devuelve un valor de tipo de datos bigint.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )


[ OVER (
[ partition_by_clause ]
[ order_by_clause ]
[ ROW_or_RANGE_clause ]
) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregation Function Syntax


COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )

-- Analytic Function Syntax


COUNT ( { expression | * } ) OVER ( [ <partition_by_clause> ] )

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL sirve como valor predeterminado.
DISTINCT
Especifica que COUNT devuelva el número de valores únicos no NULL.
expression
Es una expresión de cualquier tipo excepto image, ntext o text. Tenga en cuenta que COUNT no admite funciones
de agregado ni subconsultas en una expresión.
*
Especifica que COUNT debe contar todas las filas para determinar el total de filas de la tabla a devolver. COUNT(*)
no toma ningún parámetro y no admite el uso de DISTINCT. COUNT(*) no requiere el parámetro expression
porque, por definición, no usa información sobre ninguna columna concreta. COUNT(*) devuelve el número de
filas de una tabla especificada y conserva las filas duplicadas. Cuenta cada fila por separado. Esto incluye las filas
que contienen valores NULL.
OVER ( [ partition_by_clause ] [ order_by_clause ] [ ROW_or_RANGE_clause ] )
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función COUNT . Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta
como un único grupo. order_by_clause determina el orden lógico de la operación. Para más información, consulte
Cláusula OVER (Transact-SQL ).

Tipos de valores devueltos


int

Notas
COUNT(*) devuelve el número de elementos de un grupo. Esto incluye los valores NULL y los duplicados
COUNT(ALL expresión) evalúa expresión en todas las filas del grupo y devuelve el número de valores no NULL.
COUNT(DISTINCT expresión) evalúa expresión en todas las filas del grupo y devuelve el número de valores
únicos no NULL.
Para valores devueltos superiores a 2^31-1, COUNT devuelve un error. En estos casos, utilice COUNT_BIG en su
lugar.
COUNT es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para más información, consulte Funciones deterministas y no
deterministas.

Ejemplos
A. Usar COUNT y DISTINCT
Este ejemplo se muestra el número de diferentes cargos que puede tener un empleado de Adventure Works
Cycles.

SELECT COUNT(DISTINCT Title)


FROM HumanResources.Employee;
GO

El conjunto de resultados es el siguiente.

-----------
67

(1 row(s) affected)

B. Usar COUNT (*)


Este ejemplo devuelve el número total de empleados de Adventure Works Cycles.

SELECT COUNT(*)
FROM HumanResources.Employee;
GO

El conjunto de resultados es el siguiente.

-----------
290

(1 row(s) affected)
C. Usar COUNT (*) con otros agregados
En este ejemplo se muestra que COUNT(*) funciona con otras funciones agregadas en la lista SELECT . En el
ejemplo se usa la base de datos AdventureWorks2012.

SELECT COUNT(*), AVG(Bonus)


FROM Sales.SalesPerson
WHERE SalesQuota > 25000;
GO

El conjunto de resultados es el siguiente.

----------- ---------------------
14 3472.1428

(1 row(s) affected)

D. Usar la cláusula OVER


En este ejemplo se utilizan las funciones MIN , MAX , AVG y COUNT con la cláusula OVER para devolver valores
agregados para cada departamento en la tabla AdventureWorks2012 de la base de datos
HumanResources.Department .

SELECT DISTINCT Name


, MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary
, MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary
, AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary
,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept
FROM HumanResources.EmployeePayHistory AS eph
JOIN HumanResources.EmployeeDepartmentHistory AS edh
ON eph.BusinessEntityID = edh.BusinessEntityID
JOIN HumanResources.Department AS d
ON d.DepartmentID = edh.DepartmentID
WHERE edh.EndDate IS NULL
ORDER BY Name;

El conjunto de resultados es el siguiente.

Name MinSalary MaxSalary AvgSalary


EmployeesPerDept
----------------------------- --------------------- --------------------- --------------------- --------------
--
Document Control 10.25 17.7885 14.3884 5
Engineering 32.6923 63.4615 40.1442 6
Executive 39.06 125.50 68.3034 4
Facilities and Maintenance 9.25 24.0385 13.0316 7
Finance 13.4615 43.2692 23.935 10
Human Resources 13.9423 27.1394 18.0248 6
Information Services 27.4038 50.4808 34.1586 10
Marketing 13.4615 37.50 18.4318 11
Production 6.50 84.1346 13.5537 195
Production Control 8.62 24.5192 16.7746 8
Purchasing 9.86 30.00 18.0202 14
Quality Assurance 10.5769 28.8462 15.4647 6
Research and Development 40.8654 50.4808 43.6731 4
Sales 23.0769 72.1154 29.9719 18
Shipping and Receiving 9.00 19.2308 10.8718 6
Tool Design 8.62 29.8462 23.5054 6

(16 row(s) affected)


Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento
de datos paralelos
E. Usar COUNT y DISTINCT
Este ejemplo se muestra el número de diferentes cargos que puede tener un empleado de una empresa concreta.

USE ssawPDW;

SELECT COUNT(DISTINCT Title)


FROM dbo.DimEmployee;

El conjunto de resultados es el siguiente.

-----------
67

F. Usar COUNT (*)


Este ejemplo devuelve el número total de filas de la tabla dbo.DimEmployee .

USE ssawPDW;

SELECT COUNT(*)
FROM dbo.DimEmployee;

El conjunto de resultados es el siguiente.

-------------
296

G. Usar COUNT (*) con otros agregados


Este ejemplo combina COUNT(*) con otras funciones de agregado en la lista SELECT . Devuelve el número de los
representantes de ventas con una cuota de ventas anual superior a 500 000 dólares y el promedio de cuota de
ventas de dichos representantes.

USE ssawPDW;

SELECT COUNT(EmployeeKey) AS TotalCount, AVG(SalesAmountQuota) AS [Average Sales Quota]


FROM dbo.FactSalesQuota
WHERE SalesAmountQuota > 500000 AND CalendarYear = 2001;

El conjunto de resultados es el siguiente.

TotalCount Average Sales Quota


---------- -------------------
10 683800.0000

H. Usar COUNT con HAVING


En este ejemplo se utiliza COUNT con la cláusula HAVING para devolver los departamentos de una compañía, cada
uno de los cuales tiene más de 15 empleados.
USE ssawPDW;

SELECT DepartmentName,
COUNT(EmployeeKey)AS EmployeesInDept
FROM dbo.DimEmployee
GROUP BY DepartmentName
HAVING COUNT(EmployeeKey) > 15;

El conjunto de resultados es el siguiente.

DepartmentName EmployeesInDept
-------------- ---------------
Sales 18
Production 179

I. Usar COUNT con OVER


Este ejemplo usa COUNT con la cláusula OVER para devolver el número de productos que figura en cada uno de
los pedidos de ventas especificados.

USE ssawPDW;

SELECT DISTINCT COUNT(ProductKey) OVER(PARTITION BY SalesOrderNumber) AS ProductCount


,SalesOrderNumber
FROM dbo.FactInternetSales
WHERE SalesOrderNumber IN (N'SO53115',N'SO55981');

El conjunto de resultados es el siguiente.

ProductCount SalesOrderID`
------------ -----------------
3 SO53115
1 SO55981

Vea también
Funciones de agregado (Transact-SQL )
COUNT_BIG (Transact-SQL )
Cláusula OVER (Transact-SQL )
COUNT_BIG (-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de elementos encontrados en un grupo. COUNT_BIG funciona como la función
COUNT. Estas funciones difieren solo en los tipos de datos de sus valores devueltos. COUNT_BIG siempre
devuelve un valor de tipo de datos bigint. COUNT siempre devuelve un valor de tipo de datos int.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

COUNT_BIG ( { [ ALL | DISTINCT ] expression } | * )


[ OVER ( [ partition_by_clause ] [ order_by_clause ] ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregation Function Syntax


COUNT_BIG ( { [ [ ALL | DISTINCT ] expression ] | * } )

-- Analytic Function Syntax


COUNT_BIG ( { expression | * } ) OVER ( [ <partition_by_clause> ] )

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL sirve como valor predeterminado.
DISTINCT
Especifica que COUNT_BIG devuelva el número de valores únicos no NULL.
expression
Una expresión de cualquier tipo. Tenga en cuenta que COUNT_BIG no admite funciones de agregado ni
subconsultas en una expresión.
***
Especifica que COUNT_BIG debe contar todas las filas para determinar el total de filas de la tabla a devolver.
COUNT_BIG(*) no toma ningún parámetro y no admite el uso de DISTINCT. COUNT_BIG(*) no requiere el
parámetro expression porque, por definición, no usa información sobre ninguna columna concreta. COUNT_BIG(*)
devuelve el número de filas de una tabla especificada y conserva las filas duplicadas. Cuenta cada fila por
separado. Esto incluye las filas que contienen valores NULL.
OVER ( [ partition_by_clause ] [ order_by_clause ] )
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función COUNT_BIG . Si no se especifica, la función trata todas las filas del conjunto de resultados de la
consulta como un único grupo. order_by_clause determina el orden lógico de la operación. Para más información,
consulte Cláusula OVER (Transact-SQL ).
Tipos de valores devueltos
bigint

Notas
COUNT_BIG (*) devuelve el número de elementos de un grupo. Esto incluye los valores NULL y los duplicados
COUNT_BIG (ALL expresión) evalúa expresión en todas las filas del grupo y devuelve el número de valores no
NULL.
COUNT_BIG (DISTINCT expresión) evalúa expresión en todas las filas del grupo y devuelve el número de valores
únicos no NULL.
COUNT_BIG es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no
determinista si se especifica con las cláusulas OVER y ORDER BY. Para más información, consulte Funciones
deterministas y no deterministas.

Ejemplos
Para ver algunos ejemplos, consulte COUNT (Transact-SQL ).

Vea también
Funciones de agregado (Transact-SQL )
COUNT (Transact-SQL )
int, bigint, smallint y tinyint (Transact-SQL )
Cláusula OVER (Transact-SQL )
GROUPING (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Indica si una expresión de columna especificada en una lista GROUP BY es agregada o no. GROUPING devuelve
1 para agregado y 0 para no agregado, en el conjunto de resultados. GROUPING solo se puede usar en la lista de
SELECT <selección>, cláusulas HAVING y ORDER BY cuando se especifica GROUP BY.
Convenciones de sintaxis de Transact-SQL

Sintaxis
GROUPING ( <column_expression> )

Argumentos
<column_expression>
Es una columna o una expresión que contiene una columna en una cláusula GROUP BY.

Tipos devueltos
tinyint

Notas
GROUPING se utiliza para distinguir entre los valores NULL devueltos por ROLLUP, CUBE o GROUPING SETS
y los valores NULL normales. El valor NULL devuelto como resultado de una operación ROLLUP, CUBE o
GROUPING SETS es un uso especial de NULL. Actúa como marcador de posición de columna en el conjunto de
resultados y significa "todos".

Ejemplos
En el ejemplo siguiente se agrupa SalesQuota y se agregan las cantidades de SaleYTD en la base de datos
AdventureWorks2012. La función GROUPING se aplica a la columna SalesQuota .

SELECT SalesQuota, SUM(SalesYTD) 'TotalSalesYTD', GROUPING(SalesQuota) AS 'Grouping'


FROM Sales.SalesPerson
GROUP BY SalesQuota WITH ROLLUP;
GO

El conjunto de resultados muestra dos valores NULL bajo SalesQuota . El primer valor NULL representa el grupo
de valores NULL de esta columna en la tabla. El segundo valor NULL se encuentra en la fila de resumen que
agrega la operación ROLLUP. La fila de resumen indica las cantidades de TotalSalesYTD de todos los grupos
SalesQuota , como señala el valor 1 en la columna Grouping .

El conjunto de resultados es el siguiente.


SalesQuota TotalSalesYTD Grouping
------------ ----------------- --------
NULL 1533087.5999 0
250000.00 33461260.59 0
300000.00 9299677.9445 0
NULL 44294026.1344 1

(4 row(s) affected)

Ver también
GROUPING_ID (Transact-SQL )
GROUP BY (Transact-SQL )
GROUPING_ID (Transact-SQL)
17/07/2018 • 15 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Es una función que calcula el nivel de agrupación. GROUPING_ID solo se puede usar en la lista de <selección> de
SELECT, las cláusulas HAVING u ORDER BY cuando se especifica GROUP BY.
Convenciones de sintaxis de Transact-SQL

Sintaxis
GROUPING_ID ( <column_expression>[ ,...n ] )

Argumentos
<column_expression>
Es una column_expression en una cláusula GROUP BY.

Tipo devuelto
int

Notas
GROUPING_ID <column_expression> deben coincidir exactamente con la expresión en la lista GROUP BY. Por
ejemplo, si agrupa por DATEPART (yyyy, <nombre de columna>), use GROUPING_ID (DATEPART (yyyy,
<nombre de columna>)) o, si agrupa por <nombre de columna>, use GROUPING_ID (<nombre de columna>).

Comparar GROUPING_ID() con GROUPING()


GROUPING_ID (<column_expression> [ ,...n ]) introduce el equivalente del valor devuelto de GROUPING
(<column_expression>) de cada columna de su lista de columnas en cada fila de salida como una cadena de unos
y ceros. GROUPING_ID interpreta dicha cadena como un número de base 2 y devuelve el número entero
equivalente. Por ejemplo, considere la siguiente instrucción:
SELECT a, b, c, SUM(d),``GROUPING_ID(a,b,c)``FROM T GROUP BY <group by list> . La tabla siguiente muestra los
valores de entrada y salida de GROUPING_ID ().

ENTRADA DE GROUPING_ID (A, B, C) =


GROUPING(A) + GROUPING(B) +
COLUMNAS AGREGADAS GROUPING(C) RESULTADO DE GROUPING_ID()

a 100 4

b 010 2

c 001 1
ENTRADA DE GROUPING_ID (A, B, C) =
GROUPING(A) + GROUPING(B) +
COLUMNAS AGREGADAS GROUPING(C) RESULTADO DE GROUPING_ID()

ab 110 6

ac 101 5

bc 011 3

abc 111 7

Definición técnica de GROUPING_ID ()


Cada argumento de GROUPING_ID debe ser un elemento de la lista GROUP BY. GROUPING_ID () devuelve un
mapa de bits de integer cuyos bits N más bajos pueden ser literales. Un bit literal indica que el argumento
correspondiente no es una columna de agrupación en la fila de salida determinada. El bit de menor orden
corresponde al argumento N y el bit de menor orden de N -1ésimo, al argumento 1.

Equivalentes de GROUPING_ID ()
En una consulta de agrupación única, GROUPING (<column_expression>) equivale a GROUPING_ID
(<column_expression>) y ambos devuelven 0.
Por ejemplo, las siguientes instrucciones son equivalentes:
Instrucción A:

SELECT GROUPING_ID(A,B)
FROM T
GROUP BY CUBE(A,B)

Instrucción B:

SELECT 3 FROM T GROUP BY ()


UNION ALL
SELECT 1 FROM T GROUP BY A
UNION ALL
SELECT 2 FROM T GROUP BY B
UNION ALL
SELECT 0 FROM T GROUP BY A,B

Ejemplos
A. Usar GROUPING_ID para identificar niveles de agrupación
El ejemplo siguiente devuelve el recuento de empleados por Name y Title , Name, y total de la compañía de la
base de datos AdventureWorks2012. GROUPING_ID() se usa para crear un valor en cada fila de la columna Title
que identifica su nivel de agregación.
SELECT D.Name
,CASE
WHEN GROUPING_ID(D.Name, E.JobTitle) = 0 THEN E.JobTitle
WHEN GROUPING_ID(D.Name, E.JobTitle) = 1 THEN N'Total: ' + D.Name
WHEN GROUPING_ID(D.Name, E.JobTitle) = 3 THEN N'Company Total:'
ELSE N'Unknown'
END AS N'Job Title'
,COUNT(E.BusinessEntityID) AS N'Employee Count'
FROM HumanResources.Employee E
INNER JOIN HumanResources.EmployeeDepartmentHistory DH
ON E.BusinessEntityID = DH.BusinessEntityID
INNER JOIN HumanResources.Department D
ON D.DepartmentID = DH.DepartmentID
WHERE DH.EndDate IS NULL
AND D.DepartmentID IN (12,14)
GROUP BY ROLLUP(D.Name, E.JobTitle);

B. Usar GROUPING_ID para filtrar un conjunto de resultados


Ejemplo sencillo
En el código siguiente, para devolver solo las filas que tienen un recuento de empleados por cargo, quite los
caracteres de comentario de HAVING GROUPING_ID(D.Name, E.JobTitle); = 0 en la base de datos
AdventureWorks2012. Para devolver solo las filas que tienen un recuento de empleados por departamento, quite
los caracteres de comentario de HAVING GROUPING_ID(D.Name, E.JobTitle) = 1; .

SELECT D.Name
,E.JobTitle
,GROUPING_ID(D.Name, E.JobTitle) AS 'Grouping Level'
,COUNT(E.BusinessEntityID) AS N'Employee Count'
FROM HumanResources.Employee AS E
INNER JOIN HumanResources.EmployeeDepartmentHistory AS DH
ON E.BusinessEntityID = DH.BusinessEntityID
INNER JOIN HumanResources.Department AS D
ON D.DepartmentID = DH.DepartmentID
WHERE DH.EndDate IS NULL
AND D.DepartmentID IN (12,14)
GROUP BY ROLLUP(D.Name, E.JobTitle)
--HAVING GROUPING_ID(D.Name, E.JobTitle) = 0; --All titles
--HAVING GROUPING_ID(D.Name, E.JobTitle) = 1; --Group by Name;

A continuación se muestra el conjunto de resultados sin filtrar.

NOMBRE TITLE GROUPING LEVEL EMPLOYEE COUNT NOMBRE

Document Control Control Specialist 0 2 Document Control

Document Control Document Control 0 2 Document Control


Assistant

Document Control Document Control 0 1 Document Control


Manager

Document Control NULL 1 5 Document Control

Facilities and Facilities 0 1 Facilities and


Maintenance Administrative Maintenance
Assistant
NOMBRE TITLE GROUPING LEVEL EMPLOYEE COUNT NOMBRE

Facilities and Facilities Manager 0 1 Facilities and


Maintenance Maintenance

Facilities and Janitor 0 4 Facilities and


Maintenance Maintenance

Facilities and Maintenance 0 1 Facilities and


Maintenance Supervisor Maintenance

Facilities and NULL 1 7 Facilities and


Maintenance Maintenance

NULL NULL 3 12 NULL

Ejemplo complejo
En el ejemplo siguiente se usa GROUPING_ID() para filtrar un conjunto de resultados que contiene varios niveles de
agrupación por nivel de agrupación. Se puede usar un código similar para crear una vista con varios niveles de la
agrupación y un procedimiento almacenado que llame a la vista con un parámetro que filtre la vista por nivel de
agrupación. En el ejemplo se usa la base de datos AdventureWorks2012.

DECLARE @Grouping nvarchar(50);


DECLARE @GroupingLevel smallint;
SET @Grouping = N'CountryRegionCode Total';

SELECT @GroupingLevel = (
CASE @Grouping
WHEN N'Grand Total' THEN 15
WHEN N'SalesPerson Total' THEN 14
WHEN N'Store Total' THEN 13
WHEN N'Store SalesPerson Total' THEN 12
WHEN N'CountryRegionCode Total' THEN 11
WHEN N'Group Total' THEN 7
ELSE N'Unknown'
END);

SELECT
T.[Group]
,T.CountryRegionCode
,S.Name AS N'Store'
,(SELECT P.FirstName + ' ' + P.LastName
FROM Person.Person AS P
WHERE P.BusinessEntityID = H.SalesPersonID)
AS N'Sales Person'
,SUM(TotalDue)AS N'TotalSold'
,CAST(GROUPING(T.[Group])AS char(1)) +
CAST(GROUPING(T.CountryRegionCode)AS char(1)) +
CAST(GROUPING(S.Name)AS char(1)) +
CAST(GROUPING(H.SalesPersonID)AS char(1))
AS N'GROUPING base-2'
,GROUPING_ID((T.[Group])
,(T.CountryRegionCode),(S.Name),(H.SalesPersonID)
) AS N'GROUPING_ID'
,CASE
WHEN GROUPING_ID(
(T.[Group]),(T.CountryRegionCode)
,(S.Name),(H.SalesPersonID)
) = 15 THEN N'Grand Total'
WHEN GROUPING_ID(
(T.[Group]),(T.CountryRegionCode)
,(S.Name),(H.SalesPersonID)
) = 14 THEN N'SalesPerson Total'
) = 14 THEN N'SalesPerson Total'
WHEN GROUPING_ID(
(T.[Group]),(T.CountryRegionCode)
,(S.Name),(H.SalesPersonID)
) = 13 THEN N'Store Total'
WHEN GROUPING_ID(
(T.[Group]),(T.CountryRegionCode)
,(S.Name),(H.SalesPersonID)
) = 12 THEN N'Store SalesPerson Total'
WHEN GROUPING_ID(
(T.[Group]),(T.CountryRegionCode)
,(S.Name),(H.SalesPersonID)
) = 11 THEN N'CountryRegionCode Total'
WHEN GROUPING_ID(
(T.[Group]),(T.CountryRegionCode)
,(S.Name),(H.SalesPersonID)
) = 7 THEN N'Group Total'
ELSE N'Error'
END AS N'Level'
FROM Sales.Customer AS C
INNER JOIN Sales.Store AS S
ON C.StoreID = S.BusinessEntityID
INNER JOIN Sales.SalesTerritory AS T
ON C.TerritoryID = T.TerritoryID
INNER JOIN Sales.SalesOrderHeader AS H
ON C.CustomerID = H.CustomerID
GROUP BY GROUPING SETS ((S.Name,H.SalesPersonID)
,(H.SalesPersonID),(S.Name)
,(T.[Group]),(T.CountryRegionCode),()
)
HAVING GROUPING_ID(
(T.[Group]),(T.CountryRegionCode),(S.Name),(H.SalesPersonID)
) = @GroupingLevel
ORDER BY
GROUPING_ID(S.Name,H.SalesPersonID),GROUPING_ID((T.[Group])
,(T.CountryRegionCode)
,(S.Name)
,(H.SalesPersonID))ASC;

C. Usar GROUPING_ID () con ROLLUP y CUBE para identificar niveles de agrupación


El código de los ejemplos siguientes muestra el uso de GROUPING() para calcular la columna Bit Vector(base-2) .
GROUPING_ID() se usa para calcular la columna Integer Equivalent correspondiente. El orden de columnas en la
función GROUPING_ID() es el contrario del orden de las columnas que concatena la función GROUPING() .
En estos ejemplos, GROUPING_ID() se usa para crear un valor para cada fila de la columna Grouping Level que
identifica el nivel de agrupación. Los niveles de agrupación no son siempre una lista consecutiva de enteros que
comienzan por 1 (0, 1, 2,...n).

NOTE
GROUPING y GROUPING_ID se pueden usar en una cláusula HAVING para filtrar un conjunto de resultados.

Ejemplo de ROLLUP
En este ejemplo, no aparecen todos los niveles de agrupación como lo hacen en el ejemplo de CUBE siguiente. Si
se cambia el orden de las columnas en la lista de ROLLUP , los valores de nivel de la columna Grouping Level
también se tendrán que cambiar. En el ejemplo se usa la base de datos AdventureWorks2012.
SELECT DATEPART(yyyy,OrderDate) AS N'Year'
,DATEPART(mm,OrderDate) AS N'Month'
,DATEPART(dd,OrderDate) AS N'Day'
,SUM(TotalDue) AS N'Total Due'
,CAST(GROUPING(DATEPART(dd,OrderDate))AS char(1)) +
CAST(GROUPING(DATEPART(mm,OrderDate))AS char(1)) +
CAST(GROUPING(DATEPART(yyyy,OrderDate))AS char(1))
AS N'Bit Vector(base-2)'
,GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate))
AS N'Integer Equivalent'
,CASE
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 0 THEN N'Year Month Day'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 1 THEN N'Year Month'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 2 THEN N'not used'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 3 THEN N'Year'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 4 THEN N'not used'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 5 THEN N'not used'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 6 THEN N'not used'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 7 THEN N'Grand Total'
ELSE N'Error'
END AS N'Grouping Level'
FROM Sales.SalesOrderHeader
WHERE DATEPART(yyyy,OrderDate) IN(N'2007',N'2008')
AND DATEPART(mm,OrderDate) IN(1,2)
AND DATEPART(dd,OrderDate) IN(1,2)
GROUP BY ROLLUP(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate))
ORDER BY GROUPING_ID(DATEPART(mm,OrderDate)
,DATEPART(yyyy,OrderDate)
,DATEPART(dd,OrderDate)
)
,DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate);

A continuación se muestra un conjunto parcial de resultados.

BIT VECTOR INTEGER GROUPING


YEAR MONTH DAY TOTAL DUE (BASE-2) EQUIVALENT LEVEL

2007 1 1 1497452,606 000 0 Year Month


6 Day

2007 1 2 21772,3494 000 0 Year Month


Day
BIT VECTOR INTEGER GROUPING
YEAR MONTH DAY TOTAL DUE (BASE-2) EQUIVALENT LEVEL

2007 2 1 2705653,591 000 0 Year Month


3 Day

2007 2 2 21684,4068 000 0 Year Month


Day

2008 1 1 1908122,096 000 0 Year Month


7 Day

2008 1 2 46458,0691 000 0 Year Month


Day

2008 2 1 3108771,972 000 0 Year Month


9 Day

2008 2 2 54598,5488 000 0 Year Month


Day

2007 1 NULL 1519224,956 100 1 Year Month

2007 2 NULL 2727337,998 100 1 Year Month


1

2008 1 NULL 1954580,165 100 1 Year Month


8

2008 2 NULL 3163370,521 100 1 Year Month


7

2007 NULL NULL 4246562,954 110 3 Year


1

2008 NULL NULL 5117950,687 110 3 Year


5

NULL NULL NULL 9364513,641 111 7 Total general


6

Ejemplo de CUBE
En este ejemplo, la función GROUPING_ID() se usa para crear un valor para cada fila de la columna Grouping Level
que identifica el nivel de agrupación.
A diferencia de ROLLUP en el ejemplo anterior, CUBE genera todos los niveles de agrupación. Si se cambia el
orden de las columnas en la lista de CUBE , los valores de nivel de la columna Grouping Level también se tendrán
que cambiar. En el ejemplo se usa la base de datos AdventureWorks2012.
SELECT DATEPART(yyyy,OrderDate) AS N'Year'
,DATEPART(mm,OrderDate) AS N'Month'
,DATEPART(dd,OrderDate) AS N'Day'
,SUM(TotalDue) AS N'Total Due'
,CAST(GROUPING(DATEPART(dd,OrderDate))AS char(1)) +
CAST(GROUPING(DATEPART(mm,OrderDate))AS char(1)) +
CAST(GROUPING(DATEPART(yyyy,OrderDate))AS char(1))
AS N'Bit Vector(base-2)'
,GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate))
AS N'Integer Equivalent'
,CASE
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 0 THEN N'Year Month Day'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 1 THEN N'Year Month'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 2 THEN N'Year Day'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 3 THEN N'Year'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 4 THEN N'Month Day'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 5 THEN N'Month'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 6 THEN N'Day'
WHEN GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate),DATEPART(dd,OrderDate)
) = 7 THEN N'Grand Total'
ELSE N'Error'
END AS N'Grouping Level'
FROM Sales.SalesOrderHeader
WHERE DATEPART(yyyy,OrderDate) IN(N'2007',N'2008')
AND DATEPART(mm,OrderDate) IN(1,2)
AND DATEPART(dd,OrderDate) IN(1,2)
GROUP BY CUBE(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate))
ORDER BY GROUPING_ID(DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate)
)
,DATEPART(yyyy,OrderDate)
,DATEPART(mm,OrderDate)
,DATEPART(dd,OrderDate);

A continuación se muestra un conjunto parcial de resultados.

BIT VECTOR INTEGER GROUPING


YEAR MONTH DAY TOTAL DUE (BASE-2) EQUIVALENT LEVEL

2007 1 1 1497452,606 000 0 Year Month


6 Day

2007 1 2 21772,3494 000 0 Year Month


Day
BIT VECTOR INTEGER GROUPING
YEAR MONTH DAY TOTAL DUE (BASE-2) EQUIVALENT LEVEL

2007 2 1 2705653,591 000 0 Year Month


3 Day

2007 2 2 21684,4068 000 0 Year Month


Day

2008 1 1 1908122,096 000 0 Year Month


7 Day

2008 1 2 46458,0691 000 0 Year Month


Day

2008 2 1 3108771,972 000 0 Year Month


9 Day

2008 2 2 54598,5488 000 0 Year Month


Day

2007 1 NULL 1519224,956 100 1 Year Month

2007 2 NULL 2727337,998 100 1 Year Month


1

2008 1 NULL 1954580,165 100 1 Year Month


8

2008 2 NULL 3163370,521 100 1 Year Month


7

2007 NULL 1 4203106,197 010 2 Year Day


9

2007 NULL 2 43456.7562 010 2 Year Day

2008 NULL 1 5016894.069 010 2 Year Day


6

2008 NULL 2 101056.6179 010 2 Year Day

2007 NULL NULL 4246562,954 110 3 Year


1

2008 NULL NULL 5117950,687 110 3 Year


5

NULL 1 1 3405574.703 001 4 Month Day


3

NULL 1 2 68230.4185 001 4 Month Day

NULL 2 1 5814425.564 001 4 Month Day


2
BIT VECTOR INTEGER GROUPING
YEAR MONTH DAY TOTAL DUE (BASE-2) EQUIVALENT LEVEL

NULL 2 2 76282.9556 001 4 Month Day

NULL 1 NULL 3473805.121 101 5 Month


8

NULL 2 NULL 5890708.519 101 5 Month


8

NULL NULL 1 9220000.267 011 6 Day


5

NULL NULL 2 144513.3741 011 6 Day

NULL NULL NULL 9364513,641 111 7 Total general


6

Ver también
GROUPING (Transact-SQL )
GROUP BY (Transact-SQL )
MAX (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor máximo de la expresión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
MAX ( [ ALL | DISTINCT ] expression )
[ OVER ( [ partition_by_clause ] order_by_clause ) ]

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que se tiene en cuenta cada valor único. DISTINCT no tiene ningún significado con MAX y solo se
incluye para la compatibilidad con ISO.
expression
Se trata de una constante, nombre de columna o función y cualquier combinación de operadores aritméticos, bit a
bit y de cadena. MAX se puede usar con columnas numeric, character, uniqueidentifier y datetime, pero no
con columnas bits. No se permiten funciones de agregado ni subconsultas.
Para obtener más información, vea Expresiones (Transact-SQL ).
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
Devuelve un valor igual a expression.

Notas
MAX pasa por alto los valores NULL.
Para las columnas de caracteres, MAX busca el valor más alto de la secuencia de intercalación.
MAX es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.
Ejemplos
A. Ejemplo sencillo
El ejemplo siguiente devuelve el tipo impositivo mayor (máximo) de la base de datos AdventureWorks2012.

SELECT MAX(TaxRate)
FROM Sales.SalesTaxRate;
GO

El conjunto de resultados es el siguiente.

-------------------
19.60
Warning, null value eliminated from aggregate.

(1 row(s) affected)

B. Usar la cláusula OVER


En este ejemplo se usan las funciones MIN, MAX, AVG y COUNT con la cláusula OVER para proporcionar valores
agregados para cada departamento de la tabla HumanResources.Department de la base de datos
AdventureWorks2012.

SELECT DISTINCT Name


, MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary
, MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary
, AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary
,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept
FROM HumanResources.EmployeePayHistory AS eph
JOIN HumanResources.EmployeeDepartmentHistory AS edh
ON eph.BusinessEntityID = edh.BusinessEntityID
JOIN HumanResources.Department AS d
ON d.DepartmentID = edh.DepartmentID
WHERE edh.EndDate IS NULL
ORDER BY Name;

El conjunto de resultados es el siguiente.


Name MinSalary MaxSalary AvgSalary
EmployeesPerDept
----------------------------- --------------------- --------------------- --------------------- --------------
--
Document Control 10.25 17.7885 14.3884 5
Engineering 32.6923 63.4615 40.1442 6
Executive 39.06 125.50 68.3034 4
Facilities and Maintenance 9.25 24.0385 13.0316 7
Finance 13.4615 43.2692 23.935 10
Human Resources 13.9423 27.1394 18.0248 6
Information Services 27.4038 50.4808 34.1586 10
Marketing 13.4615 37.50 18.4318 11
Production 6.50 84.1346 13.5537 195
Production Control 8.62 24.5192 16.7746 8
Purchasing 9.86 30.00 18.0202 14
Quality Assurance 10.5769 28.8462 15.4647 6
Research and Development 40.8654 50.4808 43.6731 4
Sales 23.0769 72.1154 29.9719 18
Shipping and Receiving 9.00 19.2308 10.8718 6
Tool Design 8.62 29.8462 23.5054 6

(16 row(s) affected)

C. Usar MAX máximo con datos de caracteres


En este ejemplo se devuelve el nombre de base de datos que se ordena alfabéticamente como el último nombre.
En el ejemplo se usa WHERE database_id < 5 para tener en cuenta solo las bases de datos del sistema.

SELECT MAX(name) FROM sys.databases WHERE database_id < 5;

La última base de datos del sistema es tempdb .

Ver también
Funciones de agregado (Transact-SQL )
OVER (cláusula de Transact-SQL )
MIN (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor mínimo de la expresión. Puede ir seguida de la cláusula OVER.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

MIN ( [ ALL | DISTINCT ] expression )


[ OVER ( [ partition_by_clause ] order_by_clause ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregation Function Syntax


MIN ( [ ALL | DISTINCT ] expression )

-- Aggregation Function Syntax


MIN ( expression ) OVER ( [ <partition_by_clause> ] [ <order_by_clause> ] )

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que se tiene en cuenta cada valor único. DISTINCT no tiene ningún significado con MIN y solo se
incluye para la compatibilidad con ISO.
expression
Se trata de una constante, nombre de columna o función y cualquier combinación de operadores aritméticos, bit a
bit y de cadena. MIN se puede usar con columnas numeric, char, varchar, uniqueidentifier o datetime, pero no
con columnas bits. No se permiten funciones de agregado ni subconsultas.
Para obtener más información, vea Expresiones (Transact-SQL ).
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
Devuelve un valor igual a expression.
Notas
MIN pasa por alto los valores NULL.
En el caso de columnas de datos de caracteres, MIN busca el valor más bajo en la secuencia de ordenación.
MIN es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Ejemplo sencillo
En el ejemplo siguiente se devuelve la tasa de impuestos más baja (mínima). En el ejemplo se usa la base de datos
AdventureWorks2012.

SELECT MIN(TaxRate)
FROM Sales.SalesTaxRate;
GO

El conjunto de resultados es el siguiente.

-------------------

5.00

(1 row(s) affected)

B. Usar la cláusula OVER


En el ejemplo siguiente se usan las funciones MIN, MAX, AVG y COUNT con la cláusula OVER para proporcionar
los valores agregados de cada departamento de la tabla HumanResources.Department de la base de datos
AdventureWorks2012.

SELECT DISTINCT Name


, MIN(Rate) OVER (PARTITION BY edh.DepartmentID) AS MinSalary
, MAX(Rate) OVER (PARTITION BY edh.DepartmentID) AS MaxSalary
, AVG(Rate) OVER (PARTITION BY edh.DepartmentID) AS AvgSalary
,COUNT(edh.BusinessEntityID) OVER (PARTITION BY edh.DepartmentID) AS EmployeesPerDept
FROM HumanResources.EmployeePayHistory AS eph
JOIN HumanResources.EmployeeDepartmentHistory AS edh
ON eph.BusinessEntityID = edh.BusinessEntityID
JOIN HumanResources.Department AS d
ON d.DepartmentID = edh.DepartmentID
WHERE edh.EndDate IS NULL
ORDER BY Name;

El conjunto de resultados es el siguiente.


Name MinSalary MaxSalary AvgSalary
EmployeesPerDept
----------------------------- --------------------- --------------------- --------------------- --------------
--
Document Control 10.25 17.7885 14.3884 5
Engineering 32.6923 63.4615 40.1442 6
Executive 39.06 125.50 68.3034 4
Facilities and Maintenance 9.25 24.0385 13.0316 7
Finance 13.4615 43.2692 23.935 10
Human Resources 13.9423 27.1394 18.0248 6
Information Services 27.4038 50.4808 34.1586 10
Marketing 13.4615 37.50 18.4318 11
Production 6.50 84.1346 13.5537 195
Production Control 8.62 24.5192 16.7746 8
Purchasing 9.86 30.00 18.0202 14
Quality Assurance 10.5769 28.8462 15.4647 6
Research and Development 40.8654 50.4808 43.6731 4
Sales 23.0769 72.1154 29.9719 18
Shipping and Receiving 9.00 19.2308 10.8718 6
Tool Design 8.62 29.8462 23.5054 6

(16 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Usar MIN
En este ejemplo se usa la función de agregado MIN para devolver el precio del producto menos caro (mínimo) en
un conjunto especificado de pedidos de venta.

-- Uses AdventureWorks

SELECT DISTINCT MIN(UnitPrice)


FROM dbo.FactResellerSales
WHERE SalesOrderNumber IN (N'SO43659', N'SO43660', N'SO43664');

El conjunto de resultados es el siguiente.

------
5.1865

D. Usar MIN con OVER


En los siguientes ejemplos se usa la función analítica MIN OVER () para devolver el precio del producto menos
caro en cada pedido de ventas. El conjunto de resultados queda particionado por la columna SalesOrderID .

-- Uses AdventureWorks

SELECT DISTINCT MIN(UnitPrice) OVER(PARTITION BY SalesOrderNumber) AS LeastExpensiveProduct,


SalesOrderNumber
FROM dbo.FactResellerSales
WHERE SalesOrderNumber IN (N'SO43659', N'SO43660', N'SO43664')
ORDER BY SalesOrderNumber;

El conjunto de resultados es el siguiente.


LeastExpensiveProduct SalesOrderID
--------------------- ----------
5.1865 SO43659
419.4589 SO43660
28.8404 SO43664

Ver también
Funciones de agregado (Transact-SQL )
MAX (Transact-SQL )
OVER Clause (Transact-SQL ) [OVER (claúsula de Transact-SQL )]
STDEV (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la desviación típica estadística de todos los valores de la expresión especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

STDEV ( [ ALL | DISTINCT ] expression )


[ OVER ( [ partition_by_clause ] order_by_clause ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregate Function Syntax


STDEV ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax


STDEV (expression) OVER ( [ partition_by_clause ] order_by_clause)

Argumentos
ALL
Aplica la función a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que se tiene en cuenta cada valor único.
expression
Es una expresión numérica. No se permiten funciones de agregado ni subconsultas. expression es una expresión de
la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de datos bit.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
float

Notas
Si STDEV se utiliza en todos los elementos de una instrucción SELECT, en el cálculo se incluirán todos los valores
del conjunto de resultados. STDEV solo puede utilizarse con columnas numéricas. Se omiten los valores NULL.
STDEV es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Con STDEV
En el ejemplo siguiente se devuelve la desviación estándar de todos los valores de bonificación de la tabla
SalesPerson de la base de datos AdventureWorks2012.

SELECT STDEV(Bonus)
FROM Sales.SalesPerson;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Con STDEV
En el siguiente ejemplo se obtiene la desviación típica de los valores de cuota de ventas en la tabla
dbo.FactSalesQuota . La primera columna contiene la desviación estándar de todos los valores distintos y la
segunda columna contiene la desviación estándar de todos los valores, incluidos los valores duplicados.

-- Uses AdventureWorks

SELECT STDEV(DISTINCT SalesAmountQuota)AS Distinct_Values, STDEV(SalesAmountQuota) AS All_Values


FROM dbo.FactSalesQuota;

El conjunto de resultados es el siguiente.

Distinct_Values All_Values
---------------- ----------------
398974.27 398450.57

C. Con STDEVP y OVER


En este ejemplo se devuelve la desviación típica de los valores de cuota de ventas de cada trimestre de un año
natural. Observe que ORDER BY en la cláusula OVER ordena STDEV, mientras que ORDER BY de la instrucción
SELECT ordena el conjunto de resultados.

-- Uses AdventureWorks

SELECT CalendarYear AS Year, CalendarQuarter AS Quarter, SalesAmountQuota AS SalesQuota,


STDEV(SalesAmountQuota) OVER (ORDER BY CalendarYear, CalendarQuarter) AS StdDeviation
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear = 2002
ORDER BY CalendarQuarter;

El conjunto de resultados es el siguiente.


Year Quarter SalesQuota StdDeviation
---- ------- ---------------------- -------------------
2002 1 91000.0000 null
2002 2 140000.0000 34648.23
2002 3 70000.0000 35921.21
2002 4 154000.0000 39752.36

Ver también
Funciones de agregado (Transact-SQL )
OVER (cláusula de Transact-SQL )
STDEVP (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la desviación estadística estándar para la población de todos los valores de la expresión especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

STDEVP ( [ ALL | DISTINCT ] expression )


[ OVER ( [ partition_by_clause ] order_by_clause ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregate Function Syntax


STDEVP ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax


STDEVP (expression) OVER ( [ partition_by_clause ] order_by_clause)

Argumentos
ALL
Aplica la función a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que se tiene en cuenta cada valor único.
expression
Es una expresión numérica. No se permiten funciones de agregado ni subconsultas. expression es una expresión de
la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de datos bit.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
float

Notas
Si se utiliza STDEVP en todos los elementos de una instrucción SELECT, se incluirán en el cálculo todos los valores
del conjunto de resultados. STDEVP solo puede utilizarse con columnas numéricas. Se omiten los valores NULL.
STDEVP es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si
se especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Mediante STDEVP
En el ejemplo siguiente se devuelve la desviación estándar de la población de todos los valores de bonificación de
la tabla SalesPerson de la base de datos AdventureWorks2012.

SELECT STDEVP(Bonus)
FROM Sales.SalesPerson;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Mediante STDEVP
En el ejemplo siguiente se devuelve el valor STDEVP de los valores de la tabla dbo.FactSalesQuota . La primera
columna contiene la desviación estándar de todos los valores distintos y la segunda columna contiene la
desviación estándar de todos los valores, incluidos los valores duplicados.

-- Uses AdventureWorks

SELECT STDEVP(DISTINCT SalesAmountQuota)AS Distinct_Values, STDEVP(SalesAmountQuota) AS All_Values


FROM dbo.FactSalesQuota;SELECT STDEVP(DISTINCT Quantity)AS Distinct_Values, STDEVP(Quantity) AS All_Values
FROM ProductInventory;

El conjunto de resultados es el siguiente.

Distinct_Values All_Values
---------------- ----------------
397676.79 397226.44

C. Mediante STDEVP con OVER


En el siguiente ejemplo se devuelve el valor STDEVP de los valores de cuota de ventas de cada trimestre de un año
natural. Observe que ORDER BY de la cláusula OVER ordena STDEVP y ORDER BY de la instrucción SELECT ordena
el conjunto de resultados.

-- Uses AdventureWorks

SELECT CalendarYear AS Year, CalendarQuarter AS Quarter, SalesAmountQuota AS SalesQuota,


STDEVP(SalesAmountQuota) OVER (ORDER BY CalendarYear, CalendarQuarter) AS StdDeviation
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear = 2002
ORDER BY CalendarQuarter;

El conjunto de resultados es el siguiente.


Year Quarter SalesQuota StdDeviation
---- ------- ---------------------- -------------------
2002 1 91000.0000 0.00
2002 2 140000.0000 24500.00
2002 3 70000.0000 29329.55
2002 4 154000.0000 34426.55

Ver también
Funciones de agregado (Transact-SQL )
OVER (cláusula de Transact-SQL )
SUM (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la suma de todos los valores o solo de los valores DISTINCT de la expresión. SUM solo puede utilizarse
con columnas numéricas. Se omiten los valores NULL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

SUM ( [ ALL | DISTINCT ] expression )


[ OVER ( [ partition_by_clause ] order_by_clause ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SUM ( [ ALL | DISTINCT ] expression )

Argumentos
ALL
Aplica la función de agregado a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que SUM devuelve la suma de los valores únicos.
expression
Se trata de una constante, columna o función y cualquier combinación de operadores aritméticos, bit a bit y de
cadena. expression es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado,
excepto para el tipo de datos bit. No se permiten funciones de agregado ni subconsultas. Para obtener más
información, vea Expresiones (Transact-SQL ).
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
Devuelve la suma de todos los valores de expression en el tipo de datos de expression más preciso.

RESULTADO DE LA EXPRESIÓN TIPO DE VALOR DEVUELTO

tinyint int
RESULTADO DE LA EXPRESIÓN TIPO DE VALOR DEVUELTO

smallint int

int int

bigint bigint

Categoría decimal (p, s) decimal(38, s)

Categorías money y smallmoney money

Categorías float y real float

Notas
SUM es una función determinista cuando se utiliza con las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Usar SUM para devolver datos de resumen
En los ejemplos siguientes se muestra cómo usar la función SUM para devolver datos de resumen de la base de
datos AdventureWorks2012.

SELECT Color, SUM(ListPrice), SUM(StandardCost)


FROM Production.Product
WHERE Color IS NOT NULL
AND ListPrice != 0.00
AND Name LIKE 'Mountain%'
GROUP BY Color
ORDER BY Color;
GO

El conjunto de resultados es el siguiente.

Color
--------------- --------------------- ---------------------
Black 27404.84 5214.9616
Silver 26462.84 14665.6792
White 19.00 6.7926

(3 row(s) affected)

B. Usar la cláusula OVER


En el ejemplo siguiente se usa la función SUM con la cláusula OVER para proporcionar un total acumulado de
ventas anuales para cada territorio de la tabla Sales.SalesPerson de la base de datos AdventureWorks2012. Se
crean particiones de los datos por TerritoryID y se ordenan lógicamente por SalesYTD . Esto significa que la
función SUM se calcula para cada territorio en función del año de ventas. Observe que para TerritoryID 1, solo
hay dos filas para el año de ventas 2005, que representan los dos vendedores con ventas durante ese año. Se
calculan las ventas acumuladas de estas dos filas y la tercera fila que representa las ventas durante el año 2006 se
incluye en el cálculo.
SELECT BusinessEntityID, TerritoryID
,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (PARTITION BY TerritoryID
ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY TerritoryID,SalesYear;

El conjunto de resultados es el siguiente.

BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal


---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 559,697.56 559,697.56
287 NULL 2006 519,905.93 539,801.75 1,079,603.50
285 NULL 2007 172,524.45 417,375.98 1,252,127.95
283 1 2005 1,573,012.94 1,462,795.04 2,925,590.07
280 1 2005 1,352,577.13 1,462,795.04 2,925,590.07
284 1 2006 1,576,562.20 1,500,717.42 4,502,152.27
275 2 2005 3,763,178.18 3,763,178.18 3,763,178.18
277 3 2005 3,189,418.37 3,189,418.37 3,189,418.37
276 4 2005 4,251,368.55 3,354,952.08 6,709,904.17
281 4 2005 2,458,535.62 3,354,952.08 6,709,904.17

(10 row(s) affected)

En este ejemplo, la cláusula OVER no incluye PARTITION BY. Esto significa que la función se aplicará a todas las
filas devueltas por la consulta. La cláusula ORDER BY especificada en la cláusula OVER determina el orden lógico
al que se aplica la función SUM. La consulta devuelve un total acumulado de ventas por año para todos los
territorios de ventas especificados en la cláusula WHERE. La cláusula ORDER BY especificada en la instrucción
SELECT determina el orden en que se muestran las filas de la consulta.

SELECT BusinessEntityID, TerritoryID


,DATEPART(yy,ModifiedDate) AS SalesYear
,CONVERT(varchar(20),SalesYTD,1) AS SalesYTD
,CONVERT(varchar(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS MovingAvg
,CONVERT(varchar(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5
ORDER BY SalesYear;

El conjunto de resultados es el siguiente.


BusinessEntityID TerritoryID SalesYear SalesYTD MovingAvg CumulativeTotal
---------------- ----------- ----------- -------------------- -------------------- --------------------
274 NULL 2005 559,697.56 2,449,684.05 17,147,788.35
275 2 2005 3,763,178.18 2,449,684.05 17,147,788.35
276 4 2005 4,251,368.55 2,449,684.05 17,147,788.35
277 3 2005 3,189,418.37 2,449,684.05 17,147,788.35
280 1 2005 1,352,577.13 2,449,684.05 17,147,788.35
281 4 2005 2,458,535.62 2,449,684.05 17,147,788.35
283 1 2005 1,573,012.94 2,449,684.05 17,147,788.35
284 1 2006 1,576,562.20 2,138,250.72 19,244,256.47
287 NULL 2006 519,905.93 2,138,250.72 19,244,256.47
285 NULL 2007 172,524.45 1,941,678.09 19,416,780.93
(10 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Un sencillo ejemplo de SUM
En el siguiente ejemplo se devuelve el número total de cada producto vendido en el año 2003.

-- Uses AdventureWorks

SELECT ProductKey, SUM(SalesAmount) AS TotalPerProduct


FROM dbo.FactInternetSales
WHERE OrderDateKey >= '20030101'
AND OrderDateKey < '20040101'
GROUP BY ProductKey
ORDER BY ProductKey;

A continuación se muestra un conjunto parcial de resultados.

ProductKey TotalPerProduct
---------- ---------------
214 31421.0200
217 31176.0900
222 29986.4300
225 7956.1500

D. Calcular totales de grupo con más de una columna


En el siguiente ejemplo se calcula la suma de ListPrice y StandardCost por cada color que aparece en la tabla
Product .

-- Uses AdventureWorks

SELECT Color, SUM(ListPrice)AS TotalList,


SUM(StandardCost) AS TotalCost
FROM dbo.DimProduct
GROUP BY Color
ORDER BY Color;

Aquí se muestra la primera parte del conjunto de resultados:


Color TotalList TotalCost
---------- ------------- --------------
Black 101295.7191 57490.5378
Blue 24082.9484 14772.0524
Grey 125.0000 51.5625
Multi 880.7468 526.4095
NA 3162.3564 1360.6185

Ver también
Funciones de agregado (Transact-SQL )
OVER (cláusula de Transact-SQL )
VAR (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la varianza estadística de todos los valores de la expresión especificada. Puede ir seguida de la cláusula
OVER.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

VAR ( [ ALL | DISTINCT ] expression )


[ OVER ( [ partition_by_clause ] order_by_clause ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregate Function Syntax


VAR ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax


VAR (expression) OVER ( [ partition_by_clause ] order_by_clause)

Argumentos
ALL
Aplica la función a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que se tiene en cuenta cada valor único.
expression
Es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit. No se permiten funciones de agregado ni subconsultas.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
float

Notas
Si se utiliza VAR en todos los elementos de una instrucción SELECT, cada valor del conjunto de resultados se
incluye en el cálculo. VAR solo se puede utilizar con columnas numéricas. Se omiten los valores NULL.
VAR es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Usar VAR
El siguiente ejemplo devuelve la varianza para todos los valores de bonificación de la tabla SalesPerson de la base
de datos AdventureWorks2012.

SELECT VAR(Bonus)
FROM Sales.SalesPerson;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Usar VAR
En este ejemplo se devuelve la varianza estadística de los valores de cuota de ventas de la tabla
dbo.FactSalesQuota . La primera columna contiene la varianza de todos los valores distintos y la segunda columna
contiene la varianza de todos los valores, incluidos los valores duplicados.

-- Uses AdventureWorks

SELECT VAR(DISTINCT SalesAmountQuota)AS Distinct_Values, VAR(SalesAmountQuota) AS All_Values


FROM dbo.FactSalesQuota;

El conjunto de resultados es el siguiente.

Distinct_Values All_Values
---------------- ----------------
159180469909.18 158762853821.10

C. Usar VAR con OVER


En este ejemplo se devuelve la varianza estadística de las cuotas de ventas para cada trimestre de un año natural.
Observe que ORDER BY en la cláusula OVER ordena la varianza estadística y ORDER BY de la instrucción
SELECT ordena el conjunto de resultados.

-- Uses AdventureWorks

SELECT CalendarYear AS Year, CalendarQuarter AS Quarter, SalesAmountQuota AS SalesQuota,


VAR(SalesAmountQuota) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Variance
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear = 2002
ORDER BY CalendarQuarter;

El conjunto de resultados es el siguiente.


Year Quarter SalesQuota Variance
---- ------- ---------------------- -------------------
2002 1 91000.0000 null
2002 2 140000.0000 1200500000.00
2002 3 70000.0000 1290333333.33
2002 4 154000.0000 1580250000.00

Ver también
Funciones de agregado (Transact-SQL )
OVER (cláusula de Transact-SQL )
VARP (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la varianza estadística de la población para todos los valores de la expresión especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server and Azure SQL Database

VARP ( [ ALL | DISTINCT ] expression )


[ OVER ( [ partition_by_clause ] order_by_clause ) ]

-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

-- Aggregate Function Syntax


VARP ( [ ALL | DISTINCT ] expression )

-- Analytic Function Syntax


VARP (expression) OVER ( [ partition_by_clause ] order_by_clause)

Argumentos
ALL
Aplica la función a todos los valores. ALL es el valor predeterminado.
DISTINCT
Especifica que se tiene en cuenta cada valor único.
expression
Es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit. No se permiten funciones de agregado ni subconsultas.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
float

Notas
Si se utiliza VARP en todos los elementos de una instrucción SELECT, cada valor del conjunto de resultados se
incluye en el cálculo. VARP solo se puede utilizar con columnas numéricas. Se omiten los valores NULL.
VARP es una función determinista cuando se utiliza sin las cláusulas OVER y ORDER BY. Es no determinista si se
especifica con las cláusulas OVER y ORDER BY. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Con VARP
En el ejemplo siguiente se devuelve la varianza de la población de todos los valores de bonificación de la tabla
SalesPerson de la base de datos AdventureWorks2012.

SELECT VARP(Bonus)
FROM Sales.SalesPerson;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Con VARP
En el siguiente ejemplo se devuelve el valor VARP de los valores de cuota de ventas de la tabla dbo.FactSalesQuota
. La primera columna contiene la varianza de todos los valores distintos y la segunda columna contiene la varianza
de todos los valores, incluidos los valores duplicados.

-- Uses AdventureWorks

SELECT VARP(DISTINCT SalesAmountQuota)AS Distinct_Values, VARP(SalesAmountQuota) AS All_Values


FROM dbo.FactSalesQuota;

El conjunto de resultados es el siguiente.

Distinct_Values All_Values
---------------- ----------------
158146830494.18 157788848582.94

C. Con VARP y OVER


En el siguiente ejemplo se devuelve el valor VARP de los valores de cuota de ventas de cada trimestre de un año
natural. Observe que ORDER BY en la cláusula OVER ordena la varianza estadística y ORDER BY de la instrucción
SELECT ordena el conjunto de resultados.

-- Uses AdventureWorks

SELECT CalendarYear AS Year, CalendarQuarter AS Quarter, SalesAmountQuota AS SalesQuota,


VARP(SalesAmountQuota) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Variance
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear = 2002
ORDER BY CalendarQuarter;

El conjunto de resultados es el siguiente.


Year Quarter SalesQuota Variance
---- ------- ---------------------- -------------------
2002 1 91000.0000 0.00
2002 2 140000.0000 600250000.00
2002 3 70000.0000 860222222.22
2002 4 154000.0000 1185187500.00

Ver también
Funciones de agregado (Transact-SQL )
OVER (cláusula de Transact-SQL )
Funciones analíticas (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
SQL Server admite estas funciones analíticas:

CUME_DIST (Transact-SQL) LEAD (Transact-SQL)

FIRST_VALUE (Transact-SQL) PERCENTILE_CONT (Transact-SQL)

LAG (Transact-SQL) PERCENTILE_DISC (Transact-SQL)

LAST_VALUE (Transact-SQL) PERCENT_RANK (Transact-SQL)

Las funciones analíticas calculan un valor agregado a partir de un grupo de filas. A diferencia de las funciones de
agregado, estas funciones pueden devolver varias filas para cada grupo. Puede usar las funciones analíticas para
calcular medias móviles, totales acumulados, porcentajes o resultados de N valores superiores dentro de un grupo.

Vea también
OVER (cláusula de Transact-SQL )
CUME_DIST (Transact-SQL)
18/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Para SQL Server, esta función calcula la distribución acumulativa de un valor en un grupo de valores. Es decir,
CUME_DIST calcula la posición relativa de un valor especificado en un grupo de valores. Suponiendo un orden
ascendente, el CUME_DIST de un valor en la fila r se define como el número de filas con valores menores o iguales
que el valor de la fila r, dividido entre el número de filas evaluadas en la partición o el conjunto de resultados de la
consulta. CUME_DIST es similar a la función PERCENT_RANK .
Convenciones de sintaxis de Transact-SQL

Sintaxis
CUME_DIST( )
OVER ( [ partition_by_clause ] order_by_clause )

Argumentos
OVER ( [ partition_by_clause ] order_by_clause)
El argumento partition_by_clause divide el conjunto de resultados de la cláusula FROM en particiones, a las que se
aplica la función. Si no se especifica el argumento partition_by_clause, CUME_DIST trata todas las filas del conjunto
de resultados de la consulta como un único grupo. order_by_clause determina el orden lógico en el que tiene lugar
la operación. CUME_DIST requiere order_by_clause. CUME_DIST no aceptará las <filas o cláusula de rango> de la
sintaxis OVER. Para más información, consulte Cláusula OVER (Transact-SQL ).

Tipos de valores devueltos


float(53)

Notas
CUME_DIST devuelve un intervalo de valores mayor que 0 y menor o igual que 1. Los valores equivalentes siempre
se evalúan como el mismo valor de distribución acumulativa. CUME_DIST incluye valores NULL de forma
predeterminada y los trata como los posibles valores más bajos.
CUME_DIST sea no determinista. Para más información, consulte Funciones deterministas y no deterministas.

Ejemplos
En este ejemplo se usa la función CUME_DIST para calcular el percentil de salario de cada empleado dentro de un
departamento determinado. CUME_DIST devuelve un valor que representa el porcentaje de empleados que tienen
un salario menor o igual que el empleado actual del mismo departamento. La función PERCENT_RANK calcula el
intervalo de porcentaje de salario del empleado dentro de un departamento. Para crear particiones de las filas del
conjunto de resultados por departamento, el ejemplo especifica el valor de partition_by_clause. La cláusula
ORDER BY de la cláusula OVER ordena lógicamente las filas de cada partición. La cláusula ORDER BY de la
instrucción SELECT determina el orden de presentación del conjunto de resultados.
USE AdventureWorks2012;
GO
SELECT Department, LastName, Rate,
CUME_DIST () OVER (PARTITION BY Department ORDER BY Rate) AS CumeDist,
PERCENT_RANK() OVER (PARTITION BY Department ORDER BY Rate ) AS PctRank
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS e
ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services',N'Document Control')
ORDER BY Department, Rate DESC;

El conjunto de resultados es el siguiente.

Department LastName Rate CumeDist PctRank


---------------------- ---------------------- --------------------- ---------------------- -------------------
---
Document Control Arifin 17.7885 1 1
Document Control Norred 16.8269 0.8 0.5
Document Control Kharatishvili 16.8269 0.8 0.5
Document Control Chai 10.25 0.4 0
Document Control Berge 10.25 0.4 0
Information Services Trenary 50.4808 1 1
Information Services Conroy 39.6635 0.9 0.888888888888889
Information Services Ajenstat 38.4615 0.8 0.666666666666667
Information Services Wilson 38.4615 0.8 0.666666666666667
Information Services Sharma 32.4519 0.6 0.444444444444444
Information Services Connelly 32.4519 0.6 0.444444444444444
Information Services Berg 27.4038 0.4 0
Information Services Meyyappan 27.4038 0.4 0
Information Services Bacon 27.4038 0.4 0
Information Services Bueno 27.4038 0.4 0
(15 row(s) affected)

Vea también
PERCENT_RANK (Transact-SQL )
FIRST_VALUE (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el primer valor de un conjunto ordenado de valores de SQL Server 2017.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FIRST_VALUE ( [scalar_expression ] )
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

Argumentos
scalar_expression
Es el valor que se va devolver. scalar_expression puede ser una columna, una subconsulta u otra expresión
arbitraria que dé como resultado un solo valor. No se permiten otras funciones analíticas.
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es
obligatorio. rows_range_clause limita aún más las filas de la partición, ya que especifica puntos de inicio y final.
Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
Es el mismo tipo que scalar_expression.

Notas generales
FIRST_VALUE es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic
Functions.

Ejemplos
A. Usar FIRST_VALUE sobre un conjunto de resultados de consulta
En el ejemplo siguiente se usa FIRST_VALUE para devolver el nombre del producto menos costoso de una
categoría de productos determinada.

USE AdventureWorks2012;
GO
SELECT Name, ListPrice,
FIRST_VALUE(Name) OVER (ORDER BY ListPrice ASC) AS LeastExpensive
FROM Production.Product
WHERE ProductSubcategoryID = 37;
El conjunto de resultados es el siguiente.

Name ListPrice LeastExpensive


----------------------- --------------------- --------------------
Patch Kit/8 Patches 2.29 Patch Kit/8 Patches
Road Tire Tube 3.99 Patch Kit/8 Patches
Touring Tire Tube 4.99 Patch Kit/8 Patches
Mountain Tire Tube 4.99 Patch Kit/8 Patches
LL Road Tire 21.49 Patch Kit/8 Patches
ML Road Tire 24.99 Patch Kit/8 Patches
LL Mountain Tire 24.99 Patch Kit/8 Patches
Touring Tire 28.99 Patch Kit/8 Patches
ML Mountain Tire 29.99 Patch Kit/8 Patches
HL Road Tire 32.60 Patch Kit/8 Patches
HL Mountain Tire 35.00 Patch Kit/8 Patches

B. Usar FIRST_VALUE en particiones


En el ejemplo siguiente se usa FIRST_VALUE para devolver el empleado con el menor número de horas de
vacaciones en comparación con otros empleados del mismo puesto. La cláusula PARTITION BY divide los
empleados por puesto y la función FIRST_VALUE se aplica a cada partición independientemente. La cláusula
ORDER BY especificada en la cláusula OVER determina el orden lógico en el que se aplica la función
FIRST_VALUE a las filas de cada partición. La cláusula ROWS UNBOUNDED PRECEDING especifica que el
punto inicial de la ventana es la primera fila de cada partición.

USE AdventureWorks2012;
GO
SELECT JobTitle, LastName, VacationHours,
FIRST_VALUE(LastName) OVER (PARTITION BY JobTitle
ORDER BY VacationHours ASC
ROWS UNBOUNDED PRECEDING
) AS FewestVacationHours
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID
ORDER BY JobTitle;

A continuación se muestra un conjunto parcial de resultados.

JobTitle LastName VacationHours FewestVacationHours


----------------------------------- ------------------------- ------------- -------------------
Accountant Moreland 58 Moreland
Accountant Seamans 59 Moreland
Accounts Manager Liu 57 Liu
Accounts Payable Specialist Tomic 63 Tomic
Accounts Payable Specialist Sheperdigian 64 Tomic
Accounts Receivable Specialist Poe 60 Poe
Accounts Receivable Specialist Spoon 61 Poe
Accounts Receivable Specialist Walton 62 Poe

Ver también
OVER (cláusula de Transact-SQL )
LAG (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Tiene acceso a datos de una fila anterior en el mismo conjunto de resultados sin usar una autocombinación que
empiece por SQL Server 2012 (11.x). L AG proporciona acceso a una fila en un desplazamiento físico especificado
que hay antes de la fila actual. Use esta función analítica en una instrucción SELECT para comparar valores de la
fila actual con valores de una fila anterior.
Convenciones de sintaxis de Transact-SQL (Transact-SQL )

Sintaxis
LAG (scalar_expression [,offset] [,default])
OVER ( [ partition_by_clause ] order_by_clause )

Argumentos
scalar_expression
El valor que se va a devolver en función del desplazamiento especificado. Es una expresión de cualquier tipo que
devuelve un único valor (escalar). scalar_expression no puede ser una función analítica.
offset
El número de filas hacia atrás de la fila actual de la que se va a obtener un valor. Si no se especifica, el valor
predeterminado es 1. offset puede ser una columna, una subconsulta u otra expresión que se evalúa como un
entero positivo o que se puede convertir implícitamente en bigint. offset no puede ser un valor negativo o una
función analítica.
default
Valor que se devuelve cuando scalar_expression en offset es NULL. Si no se especifica ningún valor
predeterminado, se devuelve NULL. default puede ser una columna, una subconsulta u otra expresión, pero no
puede ser una función analítica. default debe tener un tipo compatible con scalar_expression.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden de los datos antes de que se aplique la función. Si se
especifica partition_by_clause, determina el orden de los datos en la partición. order_by_clause es obligatorio. Para
más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
El tipo de datos de la scalar_expression especificada. Se devuelve NULL si scalar_expression acepta valores NULL
o si default se establece en NULL.

Notas generales
L AG es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic Functions.
Ejemplos
A. Comparar valores entre años
En el ejemplo siguiente se usa la función L AG para devolver la diferencia en cuotas de venta para un empleado
concreto en años anteriores. Observe que como no hay ningún valor de intervalo disponible para la primera fila,
se devuelve el valor predeterminado de cero (0).

USE AdventureWorks2012;
GO
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,
LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');

El conjunto de resultados es el siguiente.

BusinessEntityID SalesYear CurrentQuota PreviousQuota


---------------- ----------- --------------------- ---------------------
275 2005 367000.00 0.00
275 2005 556000.00 367000.00
275 2006 502000.00 556000.00
275 2006 550000.00 502000.00
275 2006 1429000.00 550000.00
275 2006 1324000.00 1429000.00

B. Comparar valores dentro de particiones


En el ejemplo siguiente se usa la función L AG para comparar las ventas anuales hasta la fecha entre los
empleados. La cláusula PARTITION BY se especifica para dividir las filas del conjunto de resultados por territorio
de ventas. La función L AG se aplica a cada partición por separado y el cálculo se reinicia para cada partición. La
cláusula ORDER BY de la cláusula OVER ordena las filas de cada partición. La cláusula ORDER BY de la
instrucción SELECT ordena las filas del conjunto de resultados completo. Observe que como no hay ningún valor
de intervalo disponible para la primera fila de cada partición, se devuelve el valor predeterminado de cero (0).

USE AdventureWorks2012;
GO
SELECT TerritoryName, BusinessEntityID, SalesYTD,
LAG (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales
FROM Sales.vSalesPerson
WHERE TerritoryName IN (N'Northwest', N'Canada')
ORDER BY TerritoryName;

El conjunto de resultados es el siguiente.

TerritoryName BusinessEntityID SalesYTD PrevRepSales


----------------------- ---------------- --------------------- ---------------------
Canada 282 2604540.7172 0.00
Canada 278 1453719.4653 2604540.7172
Northwest 284 1576562.1966 0.00
Northwest 283 1573012.9383 1576562.1966
Northwest 280 1352577.1325 1573012.9383

C. Especificar expresiones arbitrarias


En el ejemplo siguiente se muestra cómo especificar una serie de expresiones arbitrarias en la sintaxis de la
función L AG.
CREATE TABLE T (a int, b int, c int);
GO
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);

SELECT b, c,
LAG(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i
FROM T;

El conjunto de resultados es el siguiente.

b c i
----------- ----------- -----------
1 -3 1
2 4 -2
1 NULL 8
3 1 -6
2 NULL NULL
1 5 NULL

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Comparar valores entre trimestres
En este ejemplo se muestra el uso de la función L AG. La consulta usa la función L AG para devolver la diferencia
en cuotas de ventas para un empleado concreto en trimestres anteriores. Observe que como no hay ningún valor
de intervalo disponible para la primera fila, se devuelve el valor predeterminado de cero (0).

-- Uses AdventureWorks

SELECT CalendarYear, CalendarQuarter, SalesAmountQuota AS SalesQuota,


LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS PrevQuota,
SalesAmountQuota - LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Diff
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear IN (2001, 2002)
ORDER BY CalendarYear, CalendarQuarter;

El conjunto de resultados es el siguiente.

Year Quarter SalesQuota PrevQuota Diff


---- ------- ---------- --------- -------------
2001 3 28000.0000 0.0000 28000.0000
2001 4 7000.0000 28000.0000 -21000.0000
2001 1 91000.0000 7000.0000 84000.0000
2002 2 140000.0000 91000.0000 49000.0000
2002 3 7000.0000 140000.0000 -70000.0000
2002 4 154000.0000 7000.0000 84000.0000

Ver también
LEAD (Transact-SQL )
LAST_VALUE (Transact-SQL)
18/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el último valor de un conjunto ordenado de valores de SQL Server 2017.
Convenciones de sintaxis de Transact-SQL

Sintaxis
LAST_VALUE ( [ scalar_expression ] )
OVER ( [ partition_by_clause ] order_by_clause rows_range_clause )

Argumentos
scalar_expression
Es el valor que se va devolver. scalar_expression puede ser una columna, una subconsulta u otra expresión que dé
como resultado un solo valor. No se permiten otras funciones analíticas.
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo.
order_by_clause determina el orden de los datos antes de que se aplique la función. order_by_clause es obligatorio.
rows_range_clause limita aún más las filas de la partición, ya que especifica puntos de inicio y final. Para más
información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
Es el mismo tipo que scalar_expression.

Notas generales
L AST_VALUE es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic
Functions.

Ejemplos
A. Usar LAST_VALUE en particiones
En el ejemplo siguiente se devuelve la fecha de contratación del último empleado de cada departamento para el
sueldo especificado (Rate). La cláusula PARTITION BY divide los empleados por departamento y la función de
L AST_VALUE se aplica a cada partición independientemente. La cláusula ORDER BY especificada en la cláusula
OVER determina el orden lógico en el que se aplica la función L AST_VALUE a las filas de cada partición.
USE AdventureWorks2012;
GO
SELECT Department, LastName, Rate, HireDate,
LAST_VALUE(HireDate) OVER (PARTITION BY Department ORDER BY Rate) AS LastValue
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS eph
ON eph.BusinessEntityID = edh.BusinessEntityID
INNER JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services',N'Document Control');

El conjunto de resultados es el siguiente.

Department LastName Rate HireDate LastValue


--------------------------- ----------------------- ------------ ---------- ----------
Document Control Chai 10.25 2003-02-23 2003-03-13
Document Control Berge 10.25 2003-03-13 2003-03-13
Document Control Norred 16.8269 2003-04-07 2003-01-17
Document Control Kharatishvili 16.8269 2003-01-17 2003-01-17
Document Control Arifin 17.7885 2003-02-05 2003-02-05
Information Services Berg 27.4038 2003-03-20 2003-01-24
Information Services Meyyappan 27.4038 2003-03-07 2003-01-24
Information Services Bacon 27.4038 2003-02-12 2003-01-24
Information Services Bueno 27.4038 2003-01-24 2003-01-24
Information Services Sharma 32.4519 2003-01-05 2003-03-27
Information Services Connelly 32.4519 2003-03-27 2003-03-27
Information Services Ajenstat 38.4615 2003-02-18 2003-02-23
Information Services Wilson 38.4615 2003-02-23 2003-02-23
Information Services Conroy 39.6635 2003-03-08 2003-03-08
Information Services Trenary 50.4808 2003-01-12 2003-01-12

B. Usar FIRST_VALUE y LAST_VALUE en una expresión calculada


En el ejemplo siguiente se usan las funciones FIRST_VALUE y L AST_VALUE en expresiones calculadas para
mostrar las diferencias entre los valores de cuota de ventas del trimestre actual y el primer y el último trimestre del
año respectivamente para un número determinado de empleados. La función FIRST_VALUE devuelve el valor de
la cuota de ventas del primer trimestre del año y la resta del valor de la cuota de ventas del trimestre actual. Se
devuelve en la columna derivada DifferenceFromFirstQuarter. Para el primer trimestre de un año, el valor de la
columna DifferenceFromFirstQuarter es 0. La función L AST_VALUE devuelve el valor de cuota de ventas para el
último trimestre del año y lo resta del valor de la cuota de ventas actual del trimestre actual. Se devuelve en la
columna derivada DifferenceFromLastQuarter. Para el último trimestre de un año, el valor de la columna
DifferenceFromLastQuarter es 0.
La cláusula "RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING" se requiere en este
ejemplo para los valores distintos de cero que se devuelve en la columna DifferenceFromLastQuarter, como se
muestra a continuación. El intervalo predeterminado es “RANGE BETWEEN UNBOUNDED PRECEDING AND
CURRENT ROW”. En este ejemplo, mediante ese intervalo predeterminado (o sin incluir un intervalo, lo que
produce el valor predeterminado que se utiliza) daría lugar a que en la columna DifferenceFromLastQuarter se
devolvieran ceros. Para más información, vea Cláusula OVER (Transact-SQL ).
USE AdventureWorks2012;
SELECT BusinessEntityID, DATEPART(QUARTER,QuotaDate)AS Quarter, YEAR(QuotaDate) AS SalesYear,
SalesQuota AS QuotaThisQuarter,
SalesQuota - FIRST_VALUE(SalesQuota)
OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate)
ORDER BY DATEPART(QUARTER,QuotaDate) ) AS DifferenceFromFirstQuarter,
SalesQuota - LAST_VALUE(SalesQuota)
OVER (PARTITION BY BusinessEntityID, YEAR(QuotaDate)
ORDER BY DATEPART(QUARTER,QuotaDate)
RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ) AS DifferenceFromLastQuarter
FROM Sales.SalesPersonQuotaHistory
WHERE YEAR(QuotaDate) > 2005
AND BusinessEntityID BETWEEN 274 AND 275
ORDER BY BusinessEntityID, SalesYear, Quarter;

El conjunto de resultados es el siguiente.

BusinessEntityID Quarter SalesYear QuotaThisQuarter DifferenceFromFirstQuarter


DifferenceFromLastQuarter
---------------- ----------- ----------- --------------------- --------------------------- -------------------
----
274 1 2006 91000.00 0.00 -63000.00
274 2 2006 140000.00 49000.00 -14000.00
274 3 2006 70000.00 -21000.00 -84000.00
274 4 2006 154000.00 63000.00 0.00
274 1 2007 107000.00 0.00 -9000.00
274 2 2007 58000.00 -49000.00 -58000.00
274 3 2007 263000.00 156000.00 147000.00
274 4 2007 116000.00 9000.00 0.00
274 1 2008 84000.00 0.00 -103000.00
274 2 2008 187000.00 103000.00 0.00
275 1 2006 502000.00 0.00 -822000.00
275 2 2006 550000.00 48000.00 -774000.00
275 3 2006 1429000.00 927000.00 105000.00
275 4 2006 1324000.00 822000.00 0.00
275 1 2007 729000.00 0.00 -489000.00
275 2 2007 1194000.00 465000.00 -24000.00
275 3 2007 1575000.00 846000.00 357000.00
275 4 2007 1218000.00 489000.00 0.00
275 1 2008 849000.00 0.00 -20000.00
275 2 2008 869000.00 20000.00 0.00

(20 row(s) affected)


LEAD (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Tiene acceso a datos de una fila posterior en el mismo conjunto de resultados sin usar una autocombinación que
empieza por SQL Server 2012 (11.x). LEAD proporciona acceso a una fila en un desplazamiento físico
especificado que hay después de la fila actual. Use esta función analítica en una instrucción SELECT para comparar
valores de la fila actual con valores de una fila posterior.
Convenciones de sintaxis de Transact-SQL (Transact-SQL )

Sintaxis
LEAD ( scalar_expression [ ,offset ] , [ default ] )
OVER ( [ partition_by_clause ] order_by_clause )

Argumentos
scalar_expression
El valor que se va a devolver en función del desplazamiento especificado. Es una expresión de cualquier tipo que
devuelve un único valor (escalar). scalar_expression no puede ser una función analítica.
offset
El número de filas hacia delante de la fila actual de la que se va a obtener un valor. Si no se especifica, el valor
predeterminado es 1. offset puede ser una columna, una subconsulta u otra expresión que se evalúa como un
entero positivo o que se puede convertir implícitamente en bigint. offset no puede ser un valor negativo o una
función analítica.
default
Valor que se devuelve cuando scalar_expression en offset es NULL. Si no se especifica ningún valor
predeterminado, se devuelve NULL. default puede ser una columna, una subconsulta u otra expresión, pero no
puede ser una función analítica. default debe tener un tipo compatible con scalar_expression.
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden de los datos antes de que se aplique la función. Cuando se
especifica partition_by_clause, determina el orden de los datos en cada partición. order_by_clause es obligatorio.
Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
El tipo de datos de la scalar_expression especificada. Se devuelve NULL si scalar_expression acepta valores NULL
o si default se establece en NULL.
LEAD es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic Functions.

Ejemplos
A. Comparar valores entre años
La consulta usa la función LEAD para devolver la diferencia en cuotas de venta para un empleado específico
durante años posteriores. Observe que como no hay ningún valor inicial disponible para la última fila, se devuelve
el valor predeterminado de cero (0).

USE AdventureWorks2012;
GO
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,
LEAD(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS NextQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 and YEAR(QuotaDate) IN ('2005','2006');

El conjunto de resultados es el siguiente.

BusinessEntityID SalesYear CurrentQuota NextQuota


---------------- ----------- --------------------- ---------------------
275 2005 367000.00 556000.00
275 2005 556000.00 502000.00
275 2006 502000.00 550000.00
275 2006 550000.00 1429000.00
275 2006 1429000.00 1324000.00
275 2006 1324000.00 0.00

B. Comparar valores dentro de particiones


En el ejemplo siguiente se usa la función LEAD para comparar las ventas anuales hasta la fecha entre los
empleados. La cláusula PARTITION BY se especifica para crear particiones de las filas del conjunto de resultados
por territorio de ventas. La función LEAD se aplica a cada partición por separado y el cálculo se reinicia para cada
partición. La cláusula ORDER BY especificada en la cláusula OVER ordena las filas de cada partición antes de que
se aplique la función. La cláusula ORDER BY de la instrucción SELECT ordena las filas del conjunto de resultados
completo. Observe que como no hay ningún valor inicial disponible para la última fila de cada partición, se
devuelve el valor predeterminado de cero (0).

USE AdventureWorks2012;
GO
SELECT TerritoryName, BusinessEntityID, SalesYTD,
LEAD (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS NextRepSales
FROM Sales.vSalesPerson
WHERE TerritoryName IN (N'Northwest', N'Canada')
ORDER BY TerritoryName;

El conjunto de resultados es el siguiente.

TerritoryName BusinessEntityID SalesYTD NextRepSales


----------------------- ---------------- --------------------- ---------------------
Canada 282 2604540.7172 1453719.4653
Canada 278 1453719.4653 0.00
Northwest 284 1576562.1966 1573012.9383
Northwest 283 1573012.9383 1352577.1325
Northwest 280 1352577.1325 0.00

C. Especificar expresiones arbitrarias


En el ejemplo siguiente se muestra cómo especificar una serie de expresiones arbitrarias en la sintaxis de la
función LEAD.
CREATE TABLE T (a int, b int, c int);
GO
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);

SELECT b, c,
LEAD(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i
FROM T;

El conjunto de resultados es el siguiente.

b c i
----------- ----------- -----------
1 -3 8
2 4 2
1 NULL 2
3 1 0
2 NULL NULL
1 5 -2

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Comparar valores entre trimestres
En este ejemplo se muestra el uso de la función LEAD. La consulta obtiene la diferencia en los valores de cuota de
ventas para un determinado empleado durante trimestres naturales consecutivos. Observe que, como no hay
ningún valor inicial disponible después de la última fila, se usa el valor predeterminado cero (0).

-- Uses AdventureWorks

SELECT CalendarYear AS Year, CalendarQuarter AS Quarter, SalesAmountQuota AS SalesQuota,


LEAD(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS NextQuota,
SalesAmountQuota - LEAD(Sale sAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Diff
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear IN (2001,2002)
ORDER BY CalendarYear, CalendarQuarter;

El conjunto de resultados es el siguiente.

Year Quarter SalesQuota NextQuota Diff


---- ------- ---------- --------- -------------
2001 3 28000.0000 7000.0000 21000.0000
2001 4 7000.0000 91000.0000 -84000.0000
2001 1 91000.0000 140000.0000 -49000.0000
2002 2 140000.0000 7000.0000 7000.0000
2002 3 7000.0000 154000.0000 84000.0000
2002 4 154000.0000 0.0000 154000.0000

Ver también
L AG (Transact-SQL )
PERCENTILE_CONT (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Calcula un percentil basándose en una distribución continua de valores de columna en SQL Server. El resultado se
interpola y puede no ser igual que ninguno de los valores concretos de la columna.
Convenciones de sintaxis de Transact-SQL (Transact-SQL )

Sintaxis
PERCENTILE_CONT ( numeric_literal )
WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )
OVER ( [ <partition_by_clause> ] )

Argumentos
numeric_literal
El percentil que se va a calcular. El valor debe estar entre 0,0 y 1,0.
WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ])
Especifica una lista de valores numéricos para ordenar y cuyo percentil se va a calcular. Solo se permite una
order_by_expression. La expresión debe evaluarse como un tipo numérico exacto int, bigint, smallint, tinyint,
numeric, bit, decimal, smallmoney, money) o un tipo numérico aproximado (float, real). No se permiten otros
tipos de datos. El criterio de ordenación predeterminado es ascendente.
OVER ( <partition_by_clause> )
Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función de
percentil. Para más información, vea Cláusula OVER (Transact-SQL ). Los parámetros <ORDER BY clause> y
<rows or range clause> de la sintaxis OVER no se pueden especificar en una función PERCENTILE_CONT.

Tipos devueltos
float(53)

Soporte de compatibilidad
En el nivel de compatibilidad 110 y posteriores, WITHIN GROUP es una palabra clave reservada. Para obtener
más información, vea Nivel de compatibilidad de ALTER DATABASE (Transact-SQL ).

Notas generales
Se omite cualquier valor NULL del conjunto de datos.
PERCENTILE_CONT es no determinista. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Ejemplo de sintaxis básica
En el ejemplo siguiente se usa PERCENTILE_CONT y PERCENTILE_DISC para buscar el salario medio de los
empleados de cada departamento. Tenga en cuenta que estas funciones pueden no devolver el mismo valor. Esto
se debe a que PERCENTILE_CONT interpola el valor adecuado, tanto si existe en el conjunto de datos como si no
existe, mientras que PERCENTILE_DISC siempre devuelve un valor real del conjunto.

USE AdventureWorks2012;

SELECT DISTINCT Name AS DepartmentName


,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianDisc
FROM HumanResources.Department AS d
INNER JOIN HumanResources.EmployeeDepartmentHistory AS dh
ON dh.DepartmentID = d.DepartmentID
INNER JOIN HumanResources.EmployeePayHistory AS ph
ON ph.BusinessEntityID = dh.BusinessEntityID
WHERE dh.EndDate IS NULL;

A continuación se muestra un conjunto parcial de resultados.

DepartmentName MedianCont MedianDisc


-------------------- ---------- ----------
Document Control 16.8269 16.8269
Engineering 34.375 32.6923
Executive 54.32695 48.5577
Human Resources 17.427850 16.5865

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Ejemplo de sintaxis básica
En el ejemplo siguiente se usa PERCENTILE_CONT y PERCENTILE_DISC para buscar el salario medio de los
empleados de cada departamento. Tenga en cuenta que estas funciones pueden no devolver el mismo valor. Esto
se debe a que PERCENTILE_CONT interpola el valor adecuado, tanto si existe en el conjunto de datos como si no
existe, mientras que PERCENTILE_DISC siempre devuelve un valor real del conjunto.

-- Uses AdventureWorks

SELECT DISTINCT DepartmentName


,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY BaseRate)
OVER (PARTITION BY DepartmentName) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY BaseRate)
OVER (PARTITION BY DepartmentName) AS MedianDisc
FROM dbo.DimEmployee;

A continuación se muestra un conjunto parcial de resultados.

DepartmentName MedianCont MedianDisc


-------------------- ---------- ----------
Document Control 16.826900 16.8269
Engineering 34.375000 32.6923
Human Resources 17.427850 16.5865
Shipping and Receiving 9.250000 9.0000
Ver también
PERCENTILE_DISC (Transact-SQL )
PERCENTILE_DISC (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Calcula un percentil concreto para los valores ordenados de un conjunto de filas completo o dentro de particiones
distintas de un conjunto de filas de SQL Server. Para un valor de percentil P dado, PERCENTILE_DISC ordena los
valores de la expresión de la cláusula ORDER BY y devuelve el valor que tiene el menor valor de CUME_DIST (con
respecto a la misma especificación de ordenación) que es mayor o igual que P. Por ejemplo, PERCENTILE_DISC
(0.5) calculará el cincuentavo percentil (es decir, la mediana) de una expresión. PERCENTILE_DISC calcula el
percentil basándose en una distribución discreta de los valores de columna; el resultado es igual a un valor
específico de la columna.
Convenciones de sintaxis de Transact-SQL (Transact-SQL )

Sintaxis
PERCENTILE_DISC ( numeric_literal ) WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ] )
OVER ( [ <partition_by_clause> ] )

Argumentos
literal
El percentil que se va a calcular. El valor debe estar entre 0,0 y 1,0.
WITHIN GROUP ( ORDER BY order_by_expression [ ASC | DESC ])
Especifica una lista de valores para ordenar y cuyo percentil se va a calcular. Solo se permite una
order_by_expression. El criterio de ordenación predeterminado es ascendente. La lista de valores puede ser de
cualquiera de los tipos de datos válidos para la operación de ordenación.
OVER ( <partition_by_clause> )
Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función de
percentil. Para más información, vea Cláusula OVER (Transact-SQL ). Las cláusulas <ORDER BY clause> y <rows
or range clause> no se pueden especificar en una función PERCENTILE_DISC.

Tipos devueltos
El tipo de valor devuelto viene determinado por el tipo order_by_expression.

Soporte de compatibilidad
En el nivel de compatibilidad 110 y posteriores, WITHIN GROUP es una palabra clave reservada. Para obtener
más información, vea Nivel de compatibilidad de ALTER DATABASE (Transact-SQL ).

Notas generales
Se omite cualquier valor NULL del conjunto de datos.
PERCENTILE_DISC es no determinista. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Ejemplo de sintaxis básica
En el ejemplo siguiente se usa PERCENTILE_CONT y PERCENTILE_DISC para buscar el salario medio de los
empleados de cada departamento. Tenga en cuenta que estas funciones pueden no devolver el mismo valor. Esto
se debe a que PERCENTILE_CONT interpola el valor adecuado, tanto si existe en el conjunto de datos como si no
existe, mientras que PERCENTILE_DISC siempre devuelve un valor real del conjunto.

USE AdventureWorks2012;

SELECT DISTINCT Name AS DepartmentName


,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY ph.Rate)
OVER (PARTITION BY Name) AS MedianDisc
FROM HumanResources.Department AS d
INNER JOIN HumanResources.EmployeeDepartmentHistory AS dh
ON dh.DepartmentID = d.DepartmentID
INNER JOIN HumanResources.EmployeePayHistory AS ph
ON ph.BusinessEntityID = dh.BusinessEntityID
WHERE dh.EndDate IS NULL;

A continuación se muestra un conjunto parcial de resultados.

DepartmentName MedianCont MedianDisc


-------------------- ---------- ----------
Document Control 16.8269 16.8269
Engineering 34.375 32.6923
Executive 54.32695 48.5577
Human Resources 17.427850 16.5865

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Ejemplo de sintaxis básica
En el ejemplo siguiente se usa PERCENTILE_CONT y PERCENTILE_DISC para buscar el salario medio de los
empleados de cada departamento. Tenga en cuenta que estas funciones pueden no devolver el mismo valor. Esto
se debe a que PERCENTILE_CONT interpola el valor adecuado, tanto si existe en el conjunto de datos como si no
existe, mientras que PERCENTILE_DISC siempre devuelve un valor real del conjunto.

-- Uses AdventureWorks

SELECT DISTINCT DepartmentName


,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY BaseRate)
OVER (PARTITION BY DepartmentName) AS MedianCont
,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY BaseRate)
OVER (PARTITION BY DepartmentName) AS MedianDisc
FROM dbo.DimEmployee;

A continuación se muestra un conjunto parcial de resultados.


DepartmentName MedianCont MedianDisc
-------------------- ---------- ----------
Document Control 16.826900 16.8269
Engineering 34.375000 32.6923
Human Resources 17.427850 16.5865
Shipping and Receiving 9.250000 9.0000

Ver también
PERCENTILE_CONT (Transact-SQL )
PERCENT_RANK (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Calcula el rango relativo de una fila dentro de un grupo de filas de SQL Server 2017. Use PERCENT_RANK para
evaluar la situación relativa de un valor dentro de un conjunto de resultados de la consulta o de una partición.
PERCENT_RANK es similar a la función CUME_DIST.

Sintaxis
PERCENT_RANK( )
OVER ( [ partition_by_clause ] order_by_clause )

Argumentos
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden lógico en el que se realiza la operación. El parámetro
order_by_clause es obligatorio. La <cláusula rows o range> de la sintaxis OVER no se puede especificar en una
función PERCENT_RANK. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
float(53)

Notas generales
El intervalo de valores devueltos por PERCENT_RANK es mayor que 0 y menor o igual que 1. La primera fila de
cualquier conjunto tiene un PERCENT_RANK de 0. Se incluyen valores NULL de forma predeterminada y se
tratan como los posibles valores más bajos.
PERCENT_RANK es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic
Functions.

Ejemplos
En el ejemplo siguiente se usa la función CUME_DIST para calcular el percentil de salario de cada empleado
dentro de un departamento determinado. El valor devuelto por la función CUME_DIST representa el porcentaje
de empleados que tienen un salario menor o igual que el empleado actual del mismo departamento. La función
PERCENT_RANK calcula el rango de salario del empleado dentro de un departamento como un porcentaje. La
cláusula PARTITION BY se especifica para crear particiones de las filas del conjunto de resultados por
departamento. La cláusula ORDER BY de la cláusula OVER ordena las filas de cada partición. La cláusula ORDER
BY de la instrucción SELECT ordena las filas del conjunto de resultados completo.
USE AdventureWorks2012;
GO
SELECT Department, LastName, Rate,
CUME_DIST () OVER (PARTITION BY Department ORDER BY Rate) AS CumeDist,
PERCENT_RANK() OVER (PARTITION BY Department ORDER BY Rate ) AS PctRank
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS e
ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services',N'Document Control')
ORDER BY Department, Rate DESC;

El conjunto de resultados es el siguiente.

Department LastName Rate CumeDist PctRank


---------------------- ---------------------- --------------------- ---------------------- -------------------
---
Document Control Arifin 17.7885 1 1
Document Control Norred 16.8269 0.8 0.5
Document Control Kharatishvili 16.8269 0.8 0.5
Document Control Chai 10.25 0.4 0
Document Control Berge 10.25 0.4 0
Information Services Trenary 50.4808 1 1
Information Services Conroy 39.6635 0.9 0.888888888888889
Information Services Ajenstat 38.4615 0.8 0.666666666666667
Information Services Wilson 38.4615 0.8 0.666666666666667
Information Services Sharma 32.4519 0.6 0.444444444444444
Information Services Connelly 32.4519 0.6 0.444444444444444
Information Services Berg 27.4038 0.4 0
Information Services Meyyappan 27.4038 0.4 0
Information Services Bacon 27.4038 0.4 0
Information Services Bueno 27.4038 0.4 0
(15 row(s) affected)

Ver también
CUME_DIST (Transact-SQL )
Funciones de intercalación: COLLATIONPROPERTY
(Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve la propiedad de una intercalación especificada en SQL Server 2017.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COLLATIONPROPERTY( collation_name , property )

Argumentos
collation_name
El nombre de la intercalación. El argumento nombre_de_la_intercalación tiene un tipo de datos nvarchar (128), sin
valor predeterminado.
property
La propiedad de intercalación. El argumento propiedad tiene un tipo de datos varchar (128) y puede tener uno de
los valores siguientes:

NOMBRE DE PROPIEDAD DESCRIPCIÓN

CodePage La página de códigos no Unicode de la intercalación. Vea


Appendix G DBCS/Unicode Mapping Tables (Apéndice G:
tablas de asignaciones DBCS/Unicode) y Appendix H Code
Pages (Apéndice H: páginas de código) para traducir estos
valores y ver sus asignaciones de caracteres.

LCID LCID de Windows de la intercalación. Vea LCID Structure


(Estructura de LCID) para traducir estos valores (primero hay
que convertirlos a varbinary).
NOMBRE DE PROPIEDAD DESCRIPCIÓN

ComparisonStyle Estilo de comparación de Windows de la intercalación.


Devuelve 0 para todas las intercalaciones binarias, tanto (_BIN)
como (_BIN2), así como cuando todas las propiedades
distinguen entre mayúsculas y minúsculas. Valores de máscara
de bits:

Omitir mayúsculas y minúsculas: 1

Omitir acento: 2

Omitir Kana: 65536

Omitir ancho: 131072

Nota: La opción de distinción de selector de variación (_VSS)


no se representa en este valor, aunque afecta al
comportamiento de las comparaciones.

Versión La versión de la intercalación, derivada del campo Id. de


versión de la intercalación. Devuelve un valor entero
comprendido entre 0 y 3.

Las intercalaciones con "140" en el nombre devuelven 3.

Las intercalaciones con "100" en el nombre devuelven 2.

Las intercalaciones con "90" en el nombre devuelven 1.

Todas las demás intercalaciones devuelven 0.

Tipos de valores devueltos


sql_variant

Ejemplos
SELECT COLLATIONPROPERTY('Traditional_Spanish_CS_AS_KS_WS', 'CodePage');

El conjunto de resultados es el siguiente.

1252

Almacenamiento de datos SQL de Azure y Almacenamiento de datos paralelos

SELECT COLLATIONPROPERTY('Traditional_Spanish_CS_AS_KS_WS', 'CodePage')

El conjunto de resultados es el siguiente.

1252

Vea también
sys.fn_helpcollations (Transact-SQL )
Funciones de intercalación: TERTIARY_WEIGHTS
(Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Para cada carácter en una expresión de cadena no Unicode definida con una intercalación terciaria de SQL, esta
función devuelve una cadena binaria de pesos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TERTIARY_WEIGHTS( non_Unicode_character_string_expression )

Argumentos
non_Unicode_character_string_expression
Una expresión de cadena de tipo char, varchar o varchar(max) definida en una intercalación SQL terciaria. Para
obtener una lista de estas intercalaciones, vea la sección Notas.

Tipos de valores devueltos


TERTIARY_WEIGHTS devuelve varbinary cuando non_Unicode_character_string_expression es char o varchar, y
devuelve varbinary(max) cuando non_Unicode_character_string_expression tiene un tipo de datos varchar(max).

Notas
TERTIARY_WEIGHTSdevuelve NULL cuando una colección terciaria de SQL no define
non_Unicode_character_string_expression. En esta tabla se muestran las intercalaciones terciarias de SQL:

ID. DE ORDEN INTERCALACIÓN DE SQL

33 SQL_Latin1_General_Pref_CP437_CI_AS

34 SQL_Latin1_General_CP437_CI_AI

43 SQL_Latin1_General_Pref_CP850_CI_AS

44 SQL_Latin1_General_CP850_CI_AI

49 SQL_1xCompat_CP850_CI_AS

53 SQL_Latin1_General_Pref_CP1_CI_AS

54 SQL_Latin1_General_CP1_CI_AI
ID. DE ORDEN INTERCALACIÓN DE SQL

56 SQL_AltDiction_Pref_CP850_CI_AS

57 SQL_AltDiction_CP850_CI_AI

58 SQL_Scandinavian_Pref_CP850_CI_AS

82 SQL_Latin1_General_CP1250_CI_AS

84 SQL_Czech_CP1250_CI_AS

86 SQL_Hungarian_CP1250_CI_AS

88 SQL_Polish_CP1250_CI_AS

90 SQL_Romanian_CP1250_CI_AS

92 SQL_Croatian_CP1250_CI_AS

94 SQL_Slovak_CP1250_CI_AS

96 SQL_Slovenian_CP1250_CI_AS

106 SQL_Latin1_General_CP1251_CI_AS

108 SQL_Ukrainian_CP1251_CI_AS

113 SQL_Latin1_General_CP1253_CS_AS

114 SQL_Latin1_General_CP1253_CI_AS

130 SQL_Latin1_General_CP1254_CI_AS

146 SQL_Latin1_General_CP1256_CI_AS

154 SQL_Latin1_General_CP1257_CI_AS

156 SQL_Estonian_CP1257_CI_AS

158 SQL_Latvian_CP1257_CI_AS

160 SQL_Lithuanian_CP1257_CI_AS

183 SQL_Danish_Pref_CP1_CI_AS

184 SQL_SwedishPhone_Pref_CP1_CI_AS

185 SQL_SwedishStd_Pref_CP1_CI_AS

186 SQL_Icelandic_Pref_CP1_CI_AS

Use TERTIARY_WEIGHTS para la definición de una columna calculada que se define en los valores de una columna
char, varchar o varchar(max). Definir un índice tanto en la columna calculada como en la columna char, varchar
o varchar(max) puede mejorar el rendimiento cuando se especifica esa columna char, varchar o varchar(max)
en la cláusula ORDER BY de una consulta.

Ejemplos
En este ejemplo se crea una columna calculada en una tabla que aplica la función TERTIARY_WEIGHTS a los valores
de una columna char :

CREATE TABLE TertColTable


(Col1 char(15) COLLATE SQL_Latin1_General_Pref_CP437_CI_AS,
Col2 AS TERTIARY_WEIGHTS(Col1));
GO

Vea también
ORDER BY Clause (Transact-SQL )
Funciones de configuración (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Estas funciones escalares devuelven información acerca de las opciones de configuración actuales:

@@DATEFIRST @@OPTIONS

@@DBTS @@REMSERVER

@@LANGID @@SERVERNAME

@@LANGUAGE @@SERVICENAME

@@LOCK_TIMEOUT @@SPID

@@MAX_CONNECTIONS @@TEXTSIZE

@@MAX_PRECISION @@VERSION

@@NESTLEVEL

Todas las funciones de configuración funcionan de forma no determinista. En otras palabras, estas funciones no
siempre devuelven el mismo resultado cada vez que se llamen, incluso con el mismo conjunto de valores de
entrada. Vea Funciones deterministas y no deterministas para obtener más información sobre el determinismo
de las funciones.

Vea también
Funciones (Transact-SQL )
@@DBTS (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el valor del tipo de datos timestamp actual de la base de datos actual. La base de datos
actual tendrá un valor de marca de tiempo único garantizado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@DBTS

Tipos de valores devueltos


varbinary

Notas
@@DBTS devuelve el último valor de marca de tiempo de la base de datos actual que se ha usado. Cuando se
inserta o actualiza una fila con una columna de tipo timestamp se genera un valor de marca de tiempo nuevo.
Los cambios en los niveles de aislamiento de transacción no afectan a la función @@DBTS.

Ejemplos
En este ejemplo se devuelve el valor actual de timestamp de la base de datos AdventureWorks2012.

USE AdventureWorks2012;
GO
SELECT @@DBTS;

Vea también
Funciones de configuración (Transact-SQL )
Cursor Concurrency (ODBC ) (Simultaneidad de cursor [ODBC ])
Tipos de datos (Transact-SQL )
MIN_ACTIVE_ROWVERSION (Transact-SQL )
@@LANGID (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el identificador (Id.) de idioma local del idioma que se está utilizando actualmente.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@LANGID

Tipos devueltos
smallint

Notas
Para ver información sobre la configuración de idioma, incluidos los números de identificador de idioma, ejecute
sp_helplanguage sin especificar parámetros.

Ejemplos
El siguiente ejemplo establece Italian como idioma de la sesión actual y a continuación utiliza @@LANGID para
obtener el Id. de italiano.

SET LANGUAGE 'Italian'


SELECT @@LANGID AS 'Language ID'

El conjunto de resultados es el siguiente.

Changed language setting to Italiano.


Language ID
-----------
6

Ver también
Funciones de configuración (Transact-SQL )
SET L ANGUAGE (Transact-SQL )
sp_helplanguage (Transact-SQL )
@@LANGUAGE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre del idioma en uso.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@LANGUAGE

Tipos devueltos
nvarchar

Notas
Para ver información sobre la configuración de idioma, incluidos los nombres de idiomas oficiales válidos, ejecute
sp_helplanguage sin especificar ningún parámetro.

Ejemplos
En el siguiente ejemplo se devuelve el idioma de la sesión actual.

SELECT @@LANGUAGE AS 'Language Name';

El conjunto de resultados es el siguiente.

Language Name
------------------------------
us_english

Ver también
Funciones de configuración (Transact-SQL )
SET L ANGUAGE (Transact-SQL )
sp_helplanguage (Transact-SQL )
@@LOCK_TIMEOUT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor actual de tiempo de espera de bloqueo en milisegundos para la sesión actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@LOCK_TIMEOUT

Tipos devueltos
integer

Notas
SET LOCK_TIMEOUT permite a una aplicación establecer el tiempo máximo que espera una instrucción en un
recurso bloqueado. Cuando una instrucción ha esperado más tiempo que el indicado en LOCK_TIMEOUT, la
instrucción bloqueada se cancela automáticamente y se devuelve un mensaje de error a la aplicación.
@@LOCK_TIMEOUT devuelve un valor de -1 si SET LOCK_TIMEOUT aún no se ha ejecutado en la sesión actual.

Ejemplos
En este ejemplo se muestra el conjunto de resultados cuando no se establece un valor en LOCK_TIMEOUT.

SELECT @@LOCK_TIMEOUT AS [Lock Timeout];


GO

El conjunto de resultados es:

Lock Timeout
------------
-1

En este ejemplo se establece LOCK_TIMEOUT en 1800 milisegundos y, luego, se llama a @@LOCK_TIMEOUT.

SET LOCK_TIMEOUT 1800;


SELECT @@LOCK_TIMEOUT AS [Lock Timeout];
GO

El conjunto de resultados es:


Lock Timeout
------------
1800

Ver también
Funciones de configuración (Transact-SQL )
SET LOCK_TIMEOUT (Transact-SQL )
@@MAX_CONNECTIONS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número máximo de conexiones de usuario simultáneas que se permiten en una instancia de SQL
Server. El número devuelto no es necesariamente el número configurado actualmente.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@MAX_CONNECTIONS

Tipos devueltos
integer

Notas
El número real de conexiones de usuario permitidas depende también de la versión de SQL Server que está
instalada y de los límites de las aplicaciones y del hardware.
Para volver a configurar SQL Server de modo que admita menos conexiones, use sp_configure.

Ejemplos
En el ejemplo siguiente se muestra cómo devolver el número máximo de conexiones de usuario simultáneas en
una instancia de SQL Server. En el ejemplo se considera que SQL Server no se ha configurado de nuevo para
utilizar menos conexiones de usuario.

SELECT @@MAX_CONNECTIONS AS 'Max Connections';

El conjunto de resultados es el siguiente.

Max Connections
---------------
32767

Ver también
sp_configure
Funciones de configuración
Establecer la opción de configuración del servidor Conexiones de usuario
@@MAX_PRECISION (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nivel de precisión usado por los tipos de datos decimales y numéricos según la configuración actual
del servidor.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@MAX_PRECISION

Tipos devueltos
tinyint

Notas
De manera predeterminada, la precisión máxima devuelve 38.

Ejemplos
SELECT @@MAX_PRECISION AS 'Max Precision'

Ver también
Funciones de configuración (Transact-SQL )
decimal y numeric (Transact-SQL )
Precisión, escala y longitud (Transact-SQL )
@@NESTLEVEL (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nivel de anidamiento de la ejecución del procedimiento almacenado actual (inicialmente 0) en el
servidor local.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@NESTLEVEL

Tipos devueltos
int

Notas
Cada vez que un procedimiento almacenado llama a otro procedimiento almacenado o ejecuta un código
administrado haciendo referencia a una rutina Common Language Runtime (CLR ), un tipo o un agregado, se
incrementa el nivel de anidamiento. Cuando se sobrepasa el máximo de 32, se termina la transacción.
Cuando @@NESTLEVEL se ejecuta en una cadena de Transact-SQL, el valor devuelto es 1 + el nivel de
anidamiento actual. Cuando @@NESTLEVEL se ejecuta de forma dinámica con sp_executesql, el valor devuelto es
2 + el nivel de anidamiento actual.

Ejemplos
A. Usar @@NESTLEVEL en un procedimiento
En el ejemplo siguiente se crean dos procedimientos: uno que llama al otro y uno que muestra el valor
@@NESTLEVEL de cada uno.

USE AdventureWorks2012;
GO
IF OBJECT_ID (N'usp_OuterProc', N'P')IS NOT NULL
DROP PROCEDURE usp_OuterProc;
GO
IF OBJECT_ID (N'usp_InnerProc', N'P')IS NOT NULL
DROP PROCEDURE usp_InnerProc;
GO
CREATE PROCEDURE usp_InnerProc AS
SELECT @@NESTLEVEL AS 'Inner Level';
GO
CREATE PROCEDURE usp_OuterProc AS
SELECT @@NESTLEVEL AS 'Outer Level';
EXEC usp_InnerProc;
GO
EXECUTE usp_OuterProc;
GO
El conjunto de resultados es el siguiente.

Outer Level
-----------
1

Inner Level
-----------
2

B. Llamar a @@NESTLEVEL
En el siguiente ejemplo se muestra la diferencia en los valores devueltos por SELECT , EXEC y sp_executesql
cuando cada uno de ellos llama a @@NESTLEVEL .

CREATE PROC usp_NestLevelValues AS


SELECT @@NESTLEVEL AS 'Current Nest Level';
EXEC ('SELECT @@NESTLEVEL AS OneGreater');
EXEC sp_executesql N'SELECT @@NESTLEVEL as TwoGreater' ;
GO
EXEC usp_NestLevelValues;
GO

El conjunto de resultados es el siguiente.

Current Nest Level


------------------
1

(1 row(s) affected)

OneGreater
-----------
2

(1 row(s) affected)

TwoGreater
-----------
3

(1 row(s) affected)

Ver también
Funciones de configuración (Transact-SQL )
Crear un procedimiento almacenado
@@TRANCOUNT (Transact-SQL )
@@OPTIONS (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de las opciones SET actuales.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@OPTIONS

Tipos devueltos
integer

Notas
Las opciones pueden proceder del empleo del comando SET o del valor sp_configure user options. Los valores
para la sesión que se hayan configurado con el comando SET invalidan las opciones de sp_configure. Muchas
herramientas, como Management Studio configuran opciones automáticamente. Cada usuario tiene una función
@@OPTIONS que representa la configuración.
Con la instrucción SET puede cambiar el idioma y las opciones de procesamiento de consultas para una sesión de
usuario específica. @@OPTIONS solo puede detectar las opciones establecidas en ON o en OFF.
La función @@OPTIONS devuelve un mapa de bits de las opciones, convertido a un entero de base 10 (decimal).
La configuración de bits se almacena en las ubicaciones descritas en una tabla en el tema Establecer la opción de
configuración del servidor Opciones de usuario.
Para descodificar el valor @@OPTIONS, convierta el entero que ha devuelto @@OPTIONS a binario y, después,
busque los valores en la tabla del tema Establecer la opción de configuración del servidor Opciones de usuario. Por
ejemplo, si SELECT @@OPTIONS; devuelve el valor 5496 , use la calculadora del programador de Windows (calc.exe)
para convertir el valor decimal 5496 a binario. El resultado es 1010101111000 . Los caracteres en el extremo
derecho (binario 1, 2 y 4) son 0, lo cual indica que los tres primeros elementos de la tabla están establecidos en
OFF. Al consultar la tabla, ve que esos elementos son DISABLE_DEF_CNST_CHK, IMPLICIT_TRANSACTIONS
y CURSOR_CLOSE_ON_COMMIT. El siguiente elemento (ANSI_WARNINGS en la posición 1000 ) está
establecido en ON. Siga examinando hacia la izquierda en el mapa de bits y trabaje en dirección descendente en la
lista de opciones. Cuando las opciones en el extremo izquierdo sean 0, se indica que están truncadas por el tipo de
conversión. El mapa de bits 1010101111000 es en realidad 001010101111000 para poder representar la totalidad de
las 15 opciones.

Ejemplos
A. Demostración de cómo los cambios repercuten en el comportamiento
En el siguiente ejemplo se muestran las diferencias en el comportamiento de concatenación con dos
configuraciones distintas de la opción CONCAT_NULL_YIELDS_NULL.
SELECT @@OPTIONS AS OriginalOptionsValue;
SET CONCAT_NULL_YIELDS_NULL OFF;
SELECT 'abc' + NULL AS ResultWhen_OFF, @@OPTIONS AS OptionsValueWhen_OFF;

SET CONCAT_NULL_YIELDS_NULL ON;


SELECT 'abc' + NULL AS ResultWhen_ON, @@OPTIONS AS OptionsValueWhen_ON;

B. Probar una configuración NOCOUNT de cliente


En el siguiente ejemplo se especifica NOCOUNT``ON y, después, se prueba el valor de @@OPTIONS . La opción
NOCOUNT``ON impide que se envíe al cliente que hace la solicitud el mensaje sobre el número de filas afectadas por
cada instrucción de una sesión. El valor de @@OPTIONS se establece en 512 (0x0200). Esto representa la opción
NOCOUNT. En este ejemplo se prueba si la opción NOCOUNT está habilitada en el cliente. Por ejemplo, puede
ayudar a hacer un seguimiento de las diferencias de rendimiento de un cliente.

SET NOCOUNT ON
IF @@OPTIONS & 512 > 0
RAISERROR ('Current user has SET NOCOUNT turned on.', 1, 1)

Ver también
Funciones de configuración (Transact-SQL )
sp_configure (Transact-SQL )
Establecer la opción de configuración del servidor Opciones de usuario
@@REMSERVER (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos

IMPORTANT
Esta característica se quitará en la versión siguiente de Microsoft SQL Server. No utilice esta característica en nuevos trabajos
de desarrollo y modifique lo antes posible las aplicaciones que actualmente la utilizan. Utilice servidores vinculados y
procedimientos almacenados de servidores vinculados en su lugar.

Devuelve el nombre del servidor de base de datos remoto de SQL Server, tal y como aparece en el registro de
inicio de sesión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@REMSERVER

Tipos devueltos
nvarchar(128)

Notas
@@REMSERVER permite a un procedimiento almacenado comprobar el nombre del servidor de base de datos
desde el que se ejecuta.

Ejemplos
En el siguiente ejemplo se crea el procedimiento usp_CheckServer que devuelve el nombre del servidor remoto.

CREATE PROCEDURE usp_CheckServer


AS
SELECT @@REMSERVER;

El siguiente procedimiento almacenado se crea en el servidor local SEATTLE1 . El usuario inicia una sesión en un
servidor remoto, LONDON2 , y ejecuta usp_CheckServer .

EXEC SEATTLE1...usp_CheckServer;

El conjunto de resultados es el siguiente.

---------------
LONDON2
Ver también
Funciones de configuración (Transact-SQL )
Servidores remotos
@@SERVERNAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre del servidor local en el que se ejecuta SQL Server.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los
cambios de comportamiento de T-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis
@@SERVERNAME

Tipos devueltos
nvarchar

Notas
El programa de instalación de SQL Server establece durante la instalación el nombre del equipo como nombre de
servidor. Para cambiar el nombre del servidor, use sp_addserver y después reinicie SQL Server.
Si tiene instaladas varias instancias de SQL Server, @@SERVERNAME devuelve la siguiente información del
nombre del servidor local, siempre que el nombre no se haya cambiado desde la instalación.

INSTANCIA INFORMACIÓN DE SERVIDOR

Instancia predeterminada 'servername'

Instancia con nombre 'servername\instancename'

instancia en clúster de conmutación por error: instancia 'virtualservername'


predeterminada

instancia en clúster de conmutación por error: instancia con 'virtualservername\instancename'


nombre

Aunque la función @@SERVERNAME y la propiedad SERVERNAME de la función SERVERPROPERTY puedan


devolver cadenas con formatos similares, la información puede ser distinta. La propiedad SERVERNAME informa
automáticamente de los cambios en el nombre de red del equipo.
Por el contrario, @@SERVERNAME no informa de estos cambios. @@SERVERNAME informa de los cambios
realizados en el nombre del servidor local utilizando el procedimiento almacenado sp_addserver o
sp_dropserver.

Ejemplos
En el siguiente ejemplo se muestra la forma de utilizar @@SERVERNAME .

SELECT @@SERVERNAME AS 'Server Name'

A continuación se muestra un conjunto de resultados de ejemplo.

Server Name
---------------------------------
ACCTG

Ver también
Funciones de configuración (Transact-SQL )
SERVERPROPERTY (Transact-SQL )
sp_addserver (Transact-SQL )
@@SERVICENAME (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de la versión 2008) Azure SQL Database (solo Instancia
Administrada) Azure SQL Data Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de la clave del Registro bajo la cual se ejecuta SQL Server. @@SERVICENAME devuelve
'MSSQLSERVER' si la instancia actual es la predeterminada; esta función devuelve el nombre de la instancia si la
instancia actual es una instancia con nombre.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los cambios
de comportamiento de T-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis
@@SERVICENAME

Tipos devueltos
nvarchar

Notas
SQL Server se ejecuta como un servicio denominado MSSQLServer.

Ejemplos
En el siguiente ejemplo se muestra la forma de utilizar @@SERVICENAME .

SELECT @@SERVICENAME AS 'Service Name';

El conjunto de resultados es el siguiente.

Service Name
------------------------------
MSSQLSERVER

Ver también
Funciones de configuración (Transact-SQL )
Administrar el servicio del motor de base de datos
@@SPID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el Id. de sesión del proceso de usuario actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@SPID

Tipos devueltos
smallint

Notas
@@SPID se puede usar para identificar el proceso de usuario actual en la salida de sp_who.

Ejemplos
Este ejemplo devuelve el Id. de sesión, el nombre de inicio de sesión y el nombre de usuario del proceso de
usuario actual.

SELECT @@SPID AS 'ID', SYSTEM_USER AS 'Login Name', USER AS 'User Name';

El conjunto de resultados es el siguiente.

ID Login Name User Name


------ ------------------------------ ------------------------------
54 SEATTLE\joanna dbo

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
Este ejemplo devuelve el identificador de sesión de Almacenamiento de datos SQL, el identificador de sesión del
nodo de control de SQL Server, el nombre de inicio de sesión y el nombre de usuario del proceso de usuario
actual.

SELECT SESSION_ID() AS ID, @@SPID AS 'Control ID', SYSTEM_USER AS 'Login Name', USER AS 'User Name';

Ver también
Funciones de configuración
sp_lock (Transact-SQL )
sp_who
@@TEXTSIZE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor actual de la opción TEXTSIZE.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@TEXTSIZE

Tipos devueltos
integer

Ejemplos
En el ejemplo siguiente se utiliza SELECT para mostrar el valor de @@TEXTSIZE antes y después de su modificación
con la instrucción SET``TEXTSIZE .

-- Set the TEXTSIZE option to the default size of 4096 bytes.


SET TEXTSIZE 0
SELECT @@TEXTSIZE AS 'Text Size'
SET TEXTSIZE 2048
SELECT @@TEXTSIZE AS 'Text Size'

El conjunto de resultados es el siguiente.

Text Size
-----------
4096
Text Size
-----------
2048

Ver también
Funciones de configuración (Transact-SQL )
SET TEXTSIZE (Transact-SQL )
@@Version - Funciones de configuración Transact
SQL
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información del sistema y la compilación para la instalación actual de SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@VERSION

Tipos devueltos
nvarchar

Notas
Los resultados de @@VERSION se presentan como una cadena nvarchar. Puede usar la función
SERVERPROPERTY (Transact-SQL ) para recuperar los valores de propiedad individuales.
En SQL Server, se devuelve la siguiente información.
Versión de SQL Server
Arquitectura del procesador
Fecha de compilación de SQL Server
Instrucción de copyright
Edición de SQL Server
Versión del sistema operativo
En Base de datos SQL de Azure, se devuelve la siguiente información.
Edición: "Microsoft SQL Azure"
Nivel de producto: "(RTM )"
Versión del producto
Fecha de compilación
Instrucción de copyright
NOTE
Somos conscientes de que hay un problema con el número de versión de producto en Azure SQL Database del que nos ha
informado @@VERSION. La versión del motor de base de datos de SQL Server que ejecuta Azure SQL Database va siempre
por delante de la versión local de SQL Server e incluye las correcciones de seguridad más recientes. Esto significa que el nivel
de revisión siempre va a la par de la versión local de SQL Server, o incluso por delante, y que las características más recientes
disponibles en SQL Server están disponibles en Azure SQL Database.
Para determinar mediante programación la edición del motor, use SELECT SERVERPROPERTY('EngineEdition'). Esta consulta
devolverá "5" para las bases de datos independiente y "8" para las instancias administradas en Azure SQL Database.
Una vez que se resuelva este problema, se actualizará la documentación.

Ejemplos
A. Devolver la versión actual de SQL Server
En el ejemplo siguiente se muestra cómo devolver la información de versión de la instalación actual.

SELECT @@VERSION AS 'SQL Server Version';

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Devolver la versión actual de Almacenamiento de datos SQL

SELECT @@VERSION AS 'SQL Server PDW Version';

Ver también
SERVERPROPERTY (Transact-SQL )
Funciones de conversión (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Estas funciones admiten la conversión del tipo de datos:

En esta sección
CAST y CONVERT (Transact-SQL )
PARSE (Transact-SQL )
TRY_CAST (Transact-SQL )
TRY_CONVERT (Transact-SQL )
TRY_PARSE (Transact-SQL )

Vea también
Funciones
Tipos de datos (Transact-SQL )
CAST y CONVERT (Transact-SQL)
17/07/2018 • 43 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL
Data Warehouse Almacenamiento de datos paralelos
Estas funciones convierten una expresión de un tipo de datos a otro.
Ejemplo: cambio del tipo de datos de entrada
Cast

SELECT 9.5 AS Original, CAST(9.5 AS int) AS int,


CAST(9.5 AS decimal(6,4)) AS decimal;

Convertir

SELECT 9.5 AS Original, CONVERT(int, 9.5) AS int,


CONVERT(decimal(6,4), 9.5) AS decimal;

El conjunto de resultados es el siguiente.

ORIGINAL INT DECIMAL

9.5 9 9.5000

Vea los ejemplos que aparecen a continuación en este tema.


Convenciones de sintaxis de Transact-SQL

Sintaxis
-- CAST Syntax:
CAST ( expression AS data_type [ ( length ) ] )

-- CONVERT Syntax:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

Argumentos
expression
Cualquier expression válida.
data_type
El tipo de datos de destino. Esto engloba xml, bigint y sql_variant. No se pueden utilizar tipos de datos
de alias.
length
Un número entero opcional que especifica la longitud del tipo de datos de destino. El valor
predeterminado es 30.
style
Una expresión de tipo entero que especifica cómo traducirá la función CONVERT expression. Para un
valor de estilo NULL, se devuelve NULL. data_type determina el intervalo.

Tipos de valores devueltos


Devuelve expression, traducido a data_type.

Estilos de fecha y hora


Para una expression que tenga el tipo de datos de fecha u hora, style puede tener uno de los valores que
se muestran en la siguiente tabla. Otros valores se procesan como 0. A partir de SQL Server 2012 (11.x),
los únicos estilos que se admiten al convertir de tipos de fecha y hora a datetimeoffset son 0 o 1. Todos
los demás estilos de conversión devuelven el error 9809.

NOTE
SQL Server admite el formato de fecha, en estilo árabe, con el algoritmo kuwaití.

SIN EL SIGLO (AA) (1) CON EL SIGLO (AAAA) ESTÁNDAR ENTRADA/SALIDA (3)

- 0 o 100 (1,2 ) Valor predeterminado mes dd aaaa hh:mia.m. (o


para datetime y p.m.)
smalldatetime

1 101 EE. UU. 1 = mm/dd/aa


101 = mm/dd/aaaa

2 102 ANSI 2 = aa.mm.dd


102 = aaaa.mm.dd

3 103 Británico/Francés 3 = dd/mm/aa


103 = dd/mm/aaaa

4 104 German 4 = dd.mm.aa


104 = dd.mm.aaaa

5 105 Italiano 5 = dd-mm-aa


105 = dd-mm-aaaa

6 106 (1) - 6 = dd mes aa


106 = dd mes aaaa

7 107 (1) - 7 = Mes dd, aa


107 = Mes dd, aaaa

8 108 - hh:mi:ss

- 9 o 109 (1,2 ) Valor predeterminado + mes dd aaaa


milisegundos hh:mi:ss:mmma.m. (o
p.m.)

10 110 EE. UU. 10 = mm-dd-aa


110 = mm-dd-aaaa
SIN EL SIGLO (AA) ( ) CON EL SIGLO (AAAA) ESTÁNDAR ENTRADA/SALIDA ( )

11 111 JAPÓN 11 = aa/mm/dd


111 = aaaa/mm/dd

12 112 ISO 12 = aammdd


112 = aaaammdd

- 13 o 113 (1,2 ) Europeo predeterminado dd mes aaaa


+ milisegundos hh:mi:ss:mmm(24h)

14 114 - hh:mi:ss:mmm(24h)

- 20 o 120 (2 ) ODBC canónico aaaa-mm-dd


hh:mi:ss(24h)

- 21 o 121 (2 ) ODBC canónico (con aaaa-mm-dd


milisegundos), valor hh:mi:ss.mmm(24h)
predeterminado para
time, date, datetime2 y
datetimeoffset

- 126 (4 ) ISO8601 aaaa-mm-


ddThh:mi:ss.mmm (sin
espacios)

Nota: en el caso de un
valor 0 en milisegundos
(mmm), el valor de
fracción decimal en
milisegundos no se
mostrará. Por ejemplo, el
valor "2012-11-
07T18:26:20.000" se
muestra como "2012-11-
07T18:26:20".

- 127(6, 7 ) ISO8601 con zona horaria aaaa-mm-


Z. ddThh:mi:ss.mmmZ (sin
espacios)

Nota: en el caso de un
valor 0 en milisegundos
(mmm), el valor decimal
en milisegundos no se
mostrará. Por ejemplo, el
valor "2012-11-
07T18:26:20.000" se
mostrará como "2012-
11-07T18:26:20".
SIN EL SIGLO (AA) ( ) CON EL SIGLO (AAAA) ESTÁNDAR ENTRADA/SALIDA ( )

- 130 (1,2 ) Hijri (5 ) dd mes aaaa


hh:mi:ss:mmma.m.

En este estilo, mon es una


representación Unicode
Hijri multitoken del
nombre completo del
mes. Este valor no se
representa correctamente
en una instalación
estadounidense
predeterminada de SSMS.

- 131 (2 ) Hijri (5 ) dd/mm/aaaa


hh:mi:ss:mmma.m.

1 Estos valores de estilo devuelven resultados no deterministas. Incluye todos los estilos (aa) (sin el siglo)

y un subconjunto de estilos (aaaa) (con el siglo).


2 Los valores predeterminados (0 o 100, 9 o 109, 13 o 113, 20 o 120 y 21 o 121) siempre devuelven el

siglo (aaaa).
3 Entrada cuando se convierte en datetime; salida cuando se convierte en datos de caracteres.

4 Diseñado para usarse con XML. Para convertir datos datetime o smalldatetime en datos de
caracteres, consulte la tabla anterior para ver el formato de salida.
5 Hijri es un sistema del calendario con varias variaciones. SQL Server utiliza el algoritmo kuwaití.

IMPORTANT
De forma predeterminada, SQL Server interpreta los años de dos dígitos según el año límite 2049. Esto significa
que SQL Server interpreta el año de dos dígitos 49 como 2049 y el año de dos dígitos 50 como 1950. Muchas
aplicaciones cliente, como las que se basan en objetos de Automation, usan el año límite de 2030. SQL Server
proporciona la opción de configuración de año límite de dos dígitos para cambiar el año límite usado por SQL
Server. Esto permite tratar las fechas de manera coherente. Se recomienda especificar años de cuatro dígitos.

6 Solo se admite en la conversión de datos de caracteres a datetime


o smalldatetime. Al convertir datos
de caracteres que representan componentes de solo fecha o solo hora al tipo de datos datetime o
smalldatetime, el componente de hora no especificado se establece en 00:00:00.000 y el componente de
fecha no especificado se establece en 1900-01-01.
7Use el indicador opcional de zona horaria Z para facilitar la asignación de valores XML de tipo datetime
que contienen información de zona horaria a valores de tipo SQL Server datetime que no tienen zona
horaria. Z indica la zona horaria UTC -0. El desplazamiento HH:MM, en sentido + o -, indica otras zonas
horarias. Por ejemplo: 2006-12-12T23:45:12-08:00 .
Al convertir datos smalldatetime en datos de caracteres, los estilos que incluyen segundos o
milisegundos muestran ceros en dichas posiciones. Al convertir valores datetime o smalldatetime, use
una longitud adecuada de valor de datos char o varchar para truncar las partes de la fecha que no
quiera.
Al convertir datos de caracteres en datos datetimeoffset con un estilo que incluye una hora, se anexa un
desplazamiento de zona horaria al resultado.
Estilos float y real
En el caso de una expression float o real, style puede tener uno de los valores que se muestran en la
siguiente tabla. Otros valores se procesan como 0.

VALOR SALIDA

0 (valor predeterminado) Un máximo de 6 dígitos. Utilícelo en notación científica


cuando proceda.

1 Siempre 8 dígitos. Utilícelo siempre en notación científica.

2 Siempre 16 dígitos. Utilícelo siempre en notación


científica.

3 Siempre 17 dígitos. Se usa para la conversión sin pérdida


de información. Con este estilo, se garantiza que cada
valor de float o real distinto se va a convertir en una
cadena de caracteres distinta.

: Base de datos SQL de Azure y a partir de SQL Server


2016 (13.x).

126, 128, 129 Se incluye por razones heredadas. Una versión futura
podría dejar estos valores en desuso.

Estilos money y smallmoney


En el caso de una expression money o smallmoney, style puede tener uno de los valores que se
muestran en la siguiente tabla. Otros valores se procesan como 0.

VALOR SALIDA

0 (valor predeterminado) Sin separadores de millar cada tres dígitos a la izquierda


del separador decimal y dos dígitos a la derecha del
separador decimal

Ejemplo: 4235,98.

1 Separadores de millar cada tres dígitos a la izquierda del


separador decimal y dos dígitos a la derecha del
separador decimal

Ejemplo: 3.510,92.

2 Sin separadores de millar cada tres dígitos a la izquierda


del separador decimal y cuatro dígitos a la derecha del
separador decimal

Ejemplo: 4235.9819.

126 Equivalente al estilo 2 al convertir a char(n) o varchar(n)

Estilos xml
En el caso de una expression xml, style puede tener uno de los valores que se muestran en la siguiente
tabla. Otros valores se procesan como 0.

VALOR SALIDA

0 (valor predeterminado) Usa el comportamiento de análisis predeterminado que


descarta los espacios en blanco insignificantes y no
permite un subconjunto DTD interno.

Nota: Al convertir al tipo de datos xml, los espacios en


blanco insignificantes de SQL Server se controlan de
forma distinta que en XML 1.0. Para más información,
vea Crear instancias de datos XML.

1 Conserva los espacios en blanco insignificantes. Esta


configuración de estilo establece el control
predeterminado de xml:space para emular el
comportamiento de xml:space="preserve".

2 Habilita el procesamiento limitado de subconjuntos DTD


internos.

Si está habilitado, el servidor puede usar la siguiente


información proporcionada en un subconjunto DTD
interno para realizar operaciones de análisis que no se
validan.

- Se aplican los valores predeterminados de los atributos


- Las referencias a entidades internas se resuelven y se
amplían
- Se comprueba la corrección sintáctica del modelo de
contenido DTD

El analizador pasa por alto los subconjuntos DTD


externos. Además, no evalúa la declaración XML para
comprobar si el atributo standalone tiene el valor yes o
no. En su lugar, analiza la instancia XML como
documento independiente.

3 Conserva los espacios en blanco insignificantes y habilita


el procesamiento limitado de los subconjuntos DTD
internos.

Estilos binarios
En el caso de una expression binary(n), char(n), varbinary(n) o varchar(n), style puede tener uno de
los valores que se muestran en la siguiente tabla. Los valores de estilo que no figuran en la tabla
devolverán un error.

VALOR SALIDA

0 (valor predeterminado) Traduce caracteres ASCII a bytes binarios o bytes binarios


a caracteres ASCII. Cada carácter o byte se convierte con
una proporción 1:1.

En el caso de un data_type binario, los caracteres 0x se


agregan a la izquierda del resultado.
VALOR SALIDA

1, 2 Para un data_type binario, la expresión debe ser de


caracteres. expression debe tener un número par de
dígitos hexadecimales (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D,
E, F, a, b, c, d, e, f ). Si style se establece en 1, los dos
primeros caracteres deben ser 0x. Si la expresión contiene
un número impar de caracteres o si alguno de los
caracteres no es válido, se producirá un error.

Si la longitud de la expresión convertida supera la


longitud de data_type, el resultado se truncará a la
derecha.

Los data_type de longitud fija que sean mayores que el


resultado convertido tienen ceros agregados a la derecha
del resultado.

Los data_type con el tipo carácter necesitan una


expresión binaria. Cada carácter binario se convierte en
dos caracteres hexadecimales. Si la longitud de la
expresión convertida supera la longitud de data_type, se
truncará a la derecha.

En el caso de que data_type sea un tipo de caracteres de


tamaño fijo y de que la longitud del resultado convertido
sea menor que la longitud de data_type, se agregan
espacios a la derecha de la expresión convertida para
mantener un número par de dígitos hexadecimales.

Los caracteres 0x se agregarán a la izquierda del


resultado convertido para style 1.

Conversiones implícitas
Las conversiones implícitas no requieren la especificación de la función CAST ni de la función CONVERT.
Las conversiones explícitas requieren la especificación de la función CAST o de la función CONVERT. En
la siguiente ilustración se muestran todas las conversiones de tipos de datos explícitas e implícitas
permitidas para los tipos de datos proporcionados por el sistema de SQL Server. Algunas de ellas son
bigint, sql_variant y xml. No existe una conversión implícita en la asignación del tipo de datos
sql_variant, pero sí hay una conversión implícita en sql_variant.

TIP
En el Centro de descarga de Microsoft está disponible este gráfico como archivo PDF para su descarga.
Al convertir entre datetimeoffset y los tipos de caracteres char, nchar, nvarchar y varchar, la parte del
ajuste de zona horaria convertida siempre debe tener dígitos dobles para HH y MM. Por ejemplo: -08:00.

NOTE
Puesto que los datos Unicode siempre usan un número par de bytes, preste atención al convertir datos binary o
varbinary en o desde tipos de datos compatibles con Unicode. Por ejemplo, la siguiente conversión no devuelve
el valor hexadecimal 41. Devuelve un valor hexadecimal de 4100:
SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary) .

Tipos de datos de valor grande


Los tipos de datos de valor grande tienen el mismo comportamiento de conversión implícita y explícita
que sus equivalentes más pequeños, en concreto los tipos de datos nvarchar, varbinary y varchar. Aun
así, tenga en cuenta las directrices siguientes:
La conversión de datos image a datos varbinary(max) y viceversa funciona como una conversión
implícita, al igual que las conversiones entre text y varchar(max) y entre ntext y nvarchar(max).
La conversión de tipos de datos de valor grande, como varchar(max), a un tipo de datos equivalente
más pequeño, como varchar, es una conversión implícita, aunque se produce un truncamiento si el
tamaño del valor grande supera la longitud especificada del tipo de datos más pequeño.
La conversión de nvarchar, varbinary o varchar a sus tipos de datos correspondientes de valor
grande tiene lugar de forma implícita.
La conversión del tipo de datos sql_variant en los tipos de datos de valor grande es una conversión
explícita.
Los tipos de datos de valor grande no se pueden convertir en el tipo de datos sql_variant.
Para más información sobre la conversión del tipo de datos xml, vea Crear instancias de datos XML.

Tipo de datos XML


Cuando se convierte de forma explícita o implícita el tipo de datos xml en un tipo de datos de cadena o
binario, el contenido del tipo de datos xml se serializa en función de un conjunto de reglas definido. Para
más información sobre estas reglas, vea Definir la serialización de datos XML. Para más información
sobre la conversión de otros tipos de datos al tipo de datos xml, vea Crear instancias de datos XML.

Tipos de datos text e image


Los tipos de datos text e image no admiten la conversión automática de tipos de datos. Puede convertir
explícitamente datos text en datos de caracteres y datos image en binary o varbinary, pero la longitud
máxima es de 8000 bytes. Si intenta una conversión incorrecta (por ejemplo, intentando convertir una
expresión de caracteres que incluye letras) a un tipo int, SQL Server devolverá un mensaje de error.

Intercalación de salida
Si las funciones CAST o CONVERT generan una cadena de caracteres y reciben una entrada de una
cadena de caracteres, la salida tiene la misma intercalación y la misma etiqueta de intercalación que la
entrada. Si la entrada no es una cadena de caracteres, la salida tiene la intercalación predeterminada de la
base de datos y una etiqueta de intercalación coaccionable-predeterminada. Para más información, vea
Prioridad de intercalación (Transact-SQL ).
Para asignar otra intercalación a la salida, aplique la cláusula COLL ATE a la expresión de resultado de las
funciones CAST o CONVERT. Por ejemplo:
SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

Truncar y redondear resultados


Al convertir expresiones binarias o de caracteres (binary, char, nchar, nvarchar, varbinary o varchar)
en una expresión de otro tipo de datos, la operación de conversión podría truncar los datos de salida,
mostrar solo parcialmente los datos de salida o devolver un error. Estos casos se producen si el resultado
es demasiado corto para mostrarse. Las conversiones a binary, char, nchar, nvarchar, varbinary o
varchar se truncan, excepto aquellas que se muestran en la siguiente tabla.

DE TIPO DE DATOS EN TIPO DE DATOS RESULTADO

int, smallint o tinyint char *

varchar *

nchar E
DE TIPO DE DATOS EN TIPO DE DATOS RESULTADO

nvarchar E

money, smallmoney, numeric, char E


decimal, float o real

varchar E

nchar E

nvarchar E

* = Resultado demasiado corto para ser mostrado

E = Error devuelto porque el resultado es demasiado corto para ser mostrado.


SQL Server garantiza que solo las conversiones circulares (dicho de otra manera, las conversiones que
convierten un tipo de datos en otro y después vuelven a convertirlo en el tipo de datos original)
devuelvan los mismos valores en versiones diferentes. En el siguiente ejemplo se muestra una conversión
circular:

DECLARE @myval decimal (5, 2);


SET @myval = 193.57;
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5));
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval));

NOTE
No cree valores binary. Después, conviértalos a un tipo de datos de la categoría de datos numéricos. SQL Server
no garantiza que el resultado de una conversión de tipos de datos decimal o numeric a binary sea idéntica en
las distintas versiones de SQL Server.

En el siguiente ejemplo se muestra una expresión resultante demasiado corta para ser mostrada.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, SUBSTRING(p.Title, 1, 25) AS Title,
CAST(e.SickLeaveHours AS char(1)) AS [Sick Leave]
FROM HumanResources.Employee e JOIN Person.Person p
ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID >5;

El conjunto de resultados es el siguiente.

FirstName LastName Title Sick Leave


--------- ------------- ------- --------`
Ken Sanchez NULL *
Terri Duffy NULL *
Roberto Tamburello NULL *
Rob Walters NULL *
Gail Erickson Ms. *
(5 row(s) affected)
Al convertir tipos de datos que difieren en los decimales, SQL Server devolverá a veces un valor de
resultado truncado y otras veces devolverá un valor redondeado. En esta tabla se muestra el
comportamiento.

DE A COMPORTAMIENTO

numeric numeric Redondear

numeric int Truncamiento

numeric money Redondear

money int Redondear

money numeric Redondear

float int Truncamiento

float numeric Redondear

La conversión de los valores float


que usan la notación científica a
decimal o numeric se restringe
únicamente a los valores con una
precisión de 17 dígitos. Cualquier
valor con una precisión mayor de 17
se redondea a cero.

float datetime Redondear

datetime int Redondear

Por ejemplo, los valores 10,6496 y-10,6496 se pueden truncar o redondear durante la conversión a los
tipos int o numeric:

SELECT CAST(10.6496 AS int) as trunc1,


CAST(-10.6496 AS int) as trunc2,
CAST(10.6496 AS numeric) as round1,
CAST(-10.6496 AS numeric) as round2;

Los resultados de la consulta se muestran en la siguiente tabla:

TRUNC1 TRUNC2 ROUND1 ROUND2

10 -10 11 -11

Al convertir tipos de datos donde el tipo de datos de destino tiene menos decimales que el tipo de datos
de origen, el valor se redondea. Por ejemplo, esta conversión devuelve $10.3497 :
SELECT CAST(10.3496847 AS money);

SQL Server devuelve un mensaje de error al convertir datos char, nchar, nvarchar o varchar no
numéricos en datos decimal, float, int o numeric. SQL Server también devuelve un error cuando se
convierte una cadena vacía (" ") en los tipos de datos numeric o decimal.
Determinadas conversiones de fecha y hora son no deterministas
En la siguiente tabla se muestran los estilos para los que la conversión de cadena a fecha y hora es no
determinista.

Todos los estilos por debajo de 1001 106

107 109

113 130

1 Con la excepción de los estilos 20 y 21

Caracteres adicionales (pares suplentes)


A partir de SQL Server 2012 (11.x), si se usan intercalaciones de caracteres complementarios (SC ), lasa
operaciones CAST de nchar o nvarchar a un tipo nchar o nvarchar de menor longitud no se truncarán
dentro de un par suplente, sino que lo hará antes del carácter suplementario. Por ejemplo, el fragmento
de código siguiente deja @x con solo 'ab' . No hay espacio suficiente para albergar el carácter
suplementario.

DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);


SELECT CAST (@x AS NVARCHAR(3));

Al usar intercalaciones de SC, el comportamiento de CONVERT es análogo al de CAST .

Soporte de compatibilidad
En versiones anteriores a SQL Server, el estilo predeterminado de las operaciones CAST y CONVERT en
tipos de datos time y datetime2 es 121, a menos que se use otro tipo en una expresión de columna
calculada. Para las columnas calculadas, el estilo predeterminado es 0. Este comportamiento afecta a las
columnas calculadas cuando se crean, cuando se utilizan en las consultas que implican parametrización
automática o cuando se usan en definiciones de restricciones.
En el nivel de compatibilidad 110 y posteriores, las operaciones CAST y CONVERT en los tipos de datos
time y datetime2 siempre tienen el estilo predeterminado 121. Si una consulta se basa en el
comportamiento anterior, use un nivel de compatibilidad menor de 110, o especifique explícitamente el
estilo 0 en la consulta correspondiente.
Actualizar la base de datos al nivel de compatibilidad 110 y posteriores no cambiará los datos de usuario
que se hayan almacenado en disco. Debe corregir manualmente estos datos según convenga. Por
ejemplo, si usara SELECT INTO para crear una tabla de un origen que contuviera una expresión de
columna calculada como la descrita anteriormente, se almacenarían los datos (si se usa el estilo 0) en
lugar de la propia definición de columna calculada. Debe actualizar manualmente estos datos para que
coincidan con el estilo 121.

Ejemplos
A. Utilizar CAST y CONVERT
En estos ejemplos se recupera el nombre de aquellos productos que tienen un 3 como primer dígito del
precio y se convierte sus valores ListPrice en int .
-- Use CAST
USE AdventureWorks2012;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO

-- Use CONVERT.
USE AdventureWorks2012;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CONVERT(int, ListPrice) LIKE '3%';
GO

B. Utilizar CAST con operadores aritméticos


En este ejemplo se calcula una única columna ( Computed ) mediante la división de las ventas anuales hasta
la fecha ( SalesYTD ) entre el porcentaje de la comisión ( CommissionPCT ). Este valor se redondea al número
entero más cercano y luego se convierte (CAST) en un tipo de datos int .

USE AdventureWorks2012;
GO
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS Computed
FROM Sales.SalesPerson
WHERE CommissionPCT != 0;
GO

El conjunto de resultados es el siguiente.

Computed
------
379753754
346698349
257144242
176493899
281101272
0
301872549
212623750
298948202
250784119
239246890
101664220
124511336
97688107
(14 row(s) affected)

C. Utilizar CAST para concatenar


En este ejemplo se concatenan expresiones que no son de caracteres usando CAST. Usa la base de datos
AdventureWorksDW.

SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice


FROM dbo.DimProduct
WHERE ListPrice BETWEEN 350.00 AND 400.00;

El conjunto de resultados es el siguiente.


ListPrice
------------------------
The list price is 357.06
The list price is 364.09
The list price is 364.09
The list price is 364.09
The list price is 364.09

D. Utilizar CAST para obtener texto más legible


En este siguiente ejemplo se usa CAST en la lista SELECT para convertir la columna Name en una
columna de tipo char(10). Usa la base de datos AdventureWorksDW.

SELECT DISTINCT CAST(EnglishProductName AS char(10)) AS Name, ListPrice


FROM dbo.DimProduct
WHERE EnglishProductName LIKE 'Long-Sleeve Logo Jersey, M';

El conjunto de resultados es el siguiente.

Name ListPrice
---------- ---------
Long-Sleev 31.2437
Long-Sleev 32.4935
Long-Sleev 49.99

E. Utilizar CAST con la cláusula LIKE


En este ejemplo se convierten los valores SalesYTD de la columna money al tipo de datos int y,
después, al tipo de datos char(20) , de modo que la cláusula LIKE pueda usarlo.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID
FROM Person.Person AS p
JOIN Sales.SalesPerson AS s
ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
GO

El conjunto de resultados es el siguiente.

FirstName LastName SalesYTD BusinessEntityID


---------------- ------------------- ---------------- -------------
Tsvi Reiter 2811012.7151 279
Syed Abbas 219088.8836 288
Rachel Valdez 2241204.0424 289
(3 row(s) affected)

F. Utilizar CONVERT o CAST con XML con tipo


En estos ejemplos se muestra el uso de CONVERT para convertir datos a XML con tipo mediante Tipo de
datos XML y columnas (SQL Server).
En este ejemplo se convierte una cadena con espacios en blanco, texto y marcado en XML con tipo y se
quitan todos los espacios en blanco insignificantes (espacios en blanco de límite entre los nodos):

SELECT CONVERT(XML, '<root><child/></root>')


En este ejemplo se convierte una cadena similar con espacios en blanco, texto y marcado en XML con
tipo y se conservan los espacios en blanco insignificantes (espacios en blanco de límite entre los nodos):

SELECT CONVERT(XML, '<root> <child/> </root>', 1)

En este ejemplo se convierte una cadena con espacios en blanco, texto y marcado en XML con tipo:

SELECT CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML)

Vea Crear instancias de datos XML para ver más ejemplos.


G. Utilizar CAST y CONVERT con datos de fecha y hora
A partir de los valores GETDATE (), en este ejemplo se muestran la fecha y la hora actuales, se usa CAST
para cambiarlas a un tipo de datos de caracteres y, después, se usa CONVERT para mostrar la fecha y la
hora en el formato ISO 8901 .

SELECT
GETDATE() AS UnconvertedDateTime,
CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601 ;
GO

El conjunto de resultados es el siguiente.

UnconvertedDateTime UsingCast UsingConvertTo_ISO8601


----------------------- ---------------------- ------------------------------
2006-04-18 09:58:04.570 Apr 18 2006 9:58AM 2006-04-18T09:58:04.570
(1 row(s) affected)

Este ejemplo es lo opuesto, aproximadamente, al ejemplo anterior. En este ejemplo se muestra la fecha y
la hora como datos de caracteres, se usa CAST para cambiar los datos de caracteres al tipo de datos
datetime y, luego, se usa CONVERT para cambiar los datos de caracteres al tipo de datos datetime .

SELECT
'2006-04-25T15:50:59.997' AS UnconvertedText,
CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,
CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
GO

El conjunto de resultados es el siguiente.

UnconvertedText UsingCast UsingConvertFrom_ISO8601


----------------------- ----------------------- ------------------------
2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997
(1 row(s) affected)

H. Usar CONVERT con datos binarios y de caracteres


En estos ejemplos se muestran los resultados de la conversión de datos binarios y de caracteres usando
estilos diferentes.

--Convert the binary value 0x4E616d65 to a character value.


SELECT CONVERT(char(8), 0x4E616d65, 0) AS [Style 0, binary to character];
El conjunto de resultados es el siguiente.

Style 0, binary to character


----------------------------
Name
(1 row(s) affected)

En este ejemplo se muestra que Style 1 puede forzar el truncamiento del resultado. Los caracteres 0x del
conjunto de resultados fuerzan el truncamiento.

SELECT CONVERT(char(8), 0x4E616d65, 1) AS [Style 1, binary to character];

El conjunto de resultados es el siguiente.

Style 1, binary to character


------------------------------
0x4E616D
(1 row(s) affected)

En este ejemplo se muestra que Style 2 no trunca el resultado, ya que este no incluye los caracteres 0x.

SELECT CONVERT(char(8), 0x4E616d65, 2) AS [Style 2, binary to character];

El conjunto de resultados es el siguiente.

Style 2, binary to character


------------------------------
4E616D65
(1 row(s) affected)

Convierta el valor del carácter 'Name' en un valor binario.

SELECT CONVERT(binary(8), 'Name', 0) AS [Style 0, character to binary];

El conjunto de resultados es el siguiente.

Style 0, character to binary


----------------------------
0x4E616D6500000000
(1 row(s) affected)

SELECT CONVERT(binary(4), '0x4E616D65', 1) AS [Style 1, character to binary];

El conjunto de resultados es el siguiente.

Style 1, character to binary


----------------------------
0x4E616D65
(1 row(s) affected)
SELECT CONVERT(binary(4), '4E616D65', 2) AS [Style 2, character to binary];

El conjunto de resultados es el siguiente.

Style 2, character to binary


----------------------------------
0x4E616D65
(1 row(s) affected)

I. Convierte tipos de datos de fecha y hora


En este ejemplo se muestra la conversión de los tipos de datos date, time y datetime.

DECLARE @d1 date, @t1 time, @dt1 datetime;


SET @d1 = GETDATE();
SET @t1 = GETDATE();
SET @dt1 = GETDATE();
SET @d1 = GETDATE();
-- When converting date to datetime the minutes portion becomes zero.
SELECT @d1 AS [date], CAST (@d1 AS datetime) AS [date as datetime];
-- When converting time to datetime the date portion becomes zero
-- which converts to January 1, 1900.
SELECT @t1 AS [time], CAST (@t1 AS datetime) AS [time as datetime];
-- When converting datetime to date or time non-applicable portion is dropped.
SELECT @dt1 AS [datetime], CAST (@dt1 AS date) AS [datetime as date],
CAST (@dt1 AS time) AS [datetime as time];

Ejemplos: Almacenamiento de datos SQL de Azure y


Almacenamiento de datos paralelos
J. Usar CAST y CONVERT
En este ejemplo se recupera el nombre de aquellos productos que tienen un 3 como primer dígito del
precio y se convierte su ListPrice en int. Usa la base de datos AdventureWorksDW.

SELECT EnglishProductName AS ProductName, ListPrice


FROM dbo.DimProduct
WHERE CAST(ListPrice AS int) LIKE '3%';

En este ejemplo se muestra la misma consulta, pero usando CONVERT en vez de CAST. Usa la base de
datos AdventureWorksDW.

SELECT EnglishProductName AS ProductName, ListPrice


FROM dbo.DimProduct
WHERE CONVERT(int, ListPrice) LIKE '3%';

K. Utilizar CAST con operadores aritméticos


En este ejemplo se calcula un único valor de columna dividiendo el precio por unidad de producto (
UnitPrice ) entre el porcentaje de descuento ( UnitPriceDiscountPct ). Este resultado se redondea al
número entero más cercano y, por último, se convierte al tipo de datos int . En este ejemplo se usa la
base de datos AdventureWorksDW.
SELECT ProductKey, UnitPrice,UnitPriceDiscountPct,
CAST(ROUND (UnitPrice*UnitPriceDiscountPct,0) AS int) AS DiscountPrice
FROM dbo.FactResellerSales
WHERE SalesOrderNumber = 'SO47355'
AND UnitPriceDiscountPct > .02;

El conjunto de resultados es el siguiente.

ProductKey UnitPrice UnitPriceDiscountPct DiscountPrice


---------- --------- -------------------- -------------
323 430.6445 0.05 22
213 18.5043 0.05 1
456 37.4950 0.10 4
456 37.4950 0.10 4
216 18.5043 0.05 1

L. Utilizar CAST con la cláusula LIKE


En este ejemplo se convierte ListPrice de la columna money a un tipo int y, luego, a un tipo char(20),
de modo que la cláusula LIKE pueda usarla. En este ejemplo se usa la base de datos AdventureWorksDW.

SELECT EnglishProductName AS Name, ListPrice


FROM dbo.DimProduct
WHERE CAST(CAST(ListPrice AS int) AS char(20)) LIKE '2%';

M. Utilizar CAST y CONVERT con datos de fecha y hora


En este ejemplo se muestra la fecha y la hora actuales, se usa CAST para cambiarlas a un tipo de datos de
caracteres y, por último, se usa CONVERT para mostrar la fecha y la hora en el formato ISO 8601. En
este ejemplo se usa la base de datos AdventureWorksDW.

SELECT TOP(1)
SYSDATETIME() AS UnconvertedDateTime,
CAST(SYSDATETIME() AS nvarchar(30)) AS UsingCast,
CONVERT(nvarchar(30), SYSDATETIME(), 126) AS UsingConvertTo_ISO8601
FROM dbo.DimCustomer;

El conjunto de resultados es el siguiente.

UnconvertedDateTime UsingCast UsingConvertTo_ISO8601


--------------------- --------------------------- ---------------------------
07/20/2010 1:44:31 PM 2010-07-20 13:44:31.5879025 2010-07-20T13:44:31.5879025

Este ejemplo es lo opuesto, aproximadamente, al ejemplo anterior. En este ejemplo se muestra la fecha y
la hora como datos de caracteres, se usa CAST para cambiar los datos de caracteres al tipo de datos
datetime y, luego, se usa CONVERT para cambiar los datos de caracteres al tipo de datos datetime. En
este ejemplo se usa la base de datos AdventureWorksDW.

SELECT TOP(1)
'2010-07-25T13:50:38.544' AS UnconvertedText,
CAST('2010-07-25T13:50:38.544' AS datetime) AS UsingCast,
CONVERT(datetime, '2010-07-25T13:50:38.544', 126) AS UsingConvertFrom_ISO8601
FROM dbo.DimCustomer;

El conjunto de resultados es el siguiente.


UnconvertedText UsingCast UsingConvertFrom_ISO8601
----------------------- ----------------------- ------------------------
2010-07-25T13:50:38.544 07/25/2010 1:50:38 PM 07/25/2010 1:50:38 PM

Vea también
Conversiones de tipos de datos (motor de base de datos)
FORMAT (Transact-SQL )
STR (Transact-SQL )
SELECT (Transact-SQL )
Funciones del sistema (Transact-SQL )
Escribir instrucciones Transact-SQL internacionales
PARSE (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el resultado de una expresión, traducido al tipo de datos solicitado en SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PARSE ( string_value AS data_type [ USING culture ] )

Argumentos
string_value
Valor nvarchar(4000) que representa el valor con formato que se va a analizar en el tipo de datos especificado.
string_value debe ser una representación válida del tipo de datos solicitado; de lo contrario, PARSE produce un
error.
data_type
Valor literal que representa el tipo de datos solicitado para el resultado.
culture
Cadena opcional que identifica la referencia cultural en la que se da formato a string_value.
Si no se proporciona el argumento culture, se usará el idioma de la sesión actual. Este idioma se establece
implícitamente, o explícitamente mediante la instrucción SET L ANGUAGE. culture acepta cualquier referencia
cultural compatible con .NET Framework; no se limita a los idiomas admitidos explícitamente por SQL Server. Si
el argumento culture no es válido, PARSE desencadena un error.

Tipos devueltos
Devuelve el resultado de la expresión, traducido al tipo de datos solicitado.

Notas
Los valores NULL que se pasan como argumentos a PARSE se tratan de dos maneras:
1. Si se pasa una constante NULL, se produce un error. Un valor NULL no se puede analizar en otro tipo de
datos diferente teniendo en cuenta la referencia cultural.
2. Si se pasa un parámetro con un valor NULL en tiempo de ejecución, se devuelve un valor NULL para evitar
que se cancele todo el lote.
Use PARSE solo para convertir de tipos de cadena a tipos de fecha y hora y de número. Para las
conversiones de tipos generales, siga usando CAST o CONVERT. Tenga en cuenta que hay cierta
sobrecarga de rendimiento al analizar el valor de cadena.
PARSE se basa en la presencia de Common Language Runtime (CLR ) de .NET Framework.
Esta función no se enviará de forma remota puesto que depende de la presencia del CLR. El envío remoto
de una función que necesita el CLR produciría un error en el servidor remoto.
Más información sobre el parámetro data_type
Los valores del parámetro data_type están restringidos a los tipos que aparecen en la tabla siguiente, junto
con estilos. La información de estilo se proporciona como ayuda para determinar los tipos de modelos
permitidos. Para más información sobre los estilos, vea la documentación de .NET Framework para las
enumeraciones System.Globalization.NumberStyles y DateTimeStyles .

CATEGORÍA TIPO TIPO DE .NET FRAMEWORK ESTILOS USADOS

Numérico bigint Int64 NumberStyles.Number

Numérico INT Int32 NumberStyles.Number

Numérico SMALLINT Int16 NumberStyles.Number

Numérico TINYINT Byte NumberStyles.Number

Numérico Decimal Decimal NumberStyles.Number

Numérico NUMERIC Decimal NumberStyles.Number

Numérico FLOAT Doble NumberStyles.Float

Numérico REAL Único NumberStyles.Float

Numérico SMALLMONEY Decimal NumberStyles.Currency

Numérico money Decimal NumberStyles.Currency

Fecha y hora Date DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora time Timespan DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora DATETIME DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora smalldatetime DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal
CATEGORÍA TIPO TIPO DE .NET FRAMEWORK ESTILOS USADOS

Fecha y hora datetime2 DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora datetimeoffset DateTimeOffset DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Más información sobre el parámetro culture


En la tabla siguiente se muestran las asignaciones de los idiomas de SQL Server a las referencias culturales de
.NET Framework.

REFERENCIA CULTURAL
NOMBRE COMPLETO ALIAS LCID ESPECÍFICA

us_english Inglés 3082 es-ES

Deutsch German 1031 de-DE

Français Francés 1036 fr-FR

日本語 Japonés 1041 ja-JP

Dansk Danish 1030 da-DK

Español Español 3082 es-ES

Italiano Italiano 1040 it-IT

Nederlands Neerlandés 1043 nl-NL

Norsk Noruego 2068 nn-NO

Português Portugués 2070 pt-PT

Suomi Finlandés 1035 fi

Svenska Sueco 1053 sv-SE

čeština Czech 1029 Cs-CZ

magyar Húngaro 1038 Hu-HU

polski Polaco 1045 Pl-PL

română Rumano 1048 Ro-RO

hrvatski Croata 1050 hr-HR


REFERENCIA CULTURAL
NOMBRE COMPLETO ALIAS LCID ESPECÍFICA

slovenčina Eslovaco 1051 Sk-SK

slovenski Esloveno 1060 Sl-SI

ελληνικά Greek 1032 El-GR

български Búlgaro 1026 bg-BG

русский Ruso 1049 Ru-RU

Türkçe Turco 1055 Tr-TR

British British English 2057 en-GB

eesti Estonio 1061 Et-EE

latviešu Letón 1062 lv-LV

lietuvių Lituano 1063 lt-LT

Português (Brasil) Portugués (Brasil) 1046 pt-BR

繁體中文 Chino tradicional 1028 zh-TW

한국어 Coreano 1042 Ko-KR

简体中文 Chino simplificado 2052 zh-CN

Árabe Árabe 1025 ar-SA

ไทย Tailandés 1054 Th-TH

Ejemplos
A. PARSE en datetime2

SELECT PARSE('Monday, 13 December 2010' AS datetime2 USING 'en-US') AS Result;

El conjunto de resultados es el siguiente.

Result
---------------
2010-12-13 00:00:00.0000000

(1 row(s) affected)

B. PARSE con símbolo de moneda

SELECT PARSE('€345,98' AS money USING 'de-DE') AS Result;


El conjunto de resultados es el siguiente.

Result
---------------
345.98

(1 row(s) affected)

C. PARSE con configuración implícita de idioma

-- The English language is mapped to en-US specific culture


SET LANGUAGE 'English';
SELECT PARSE('12/16/2010' AS datetime2) AS Result;

El conjunto de resultados es el siguiente.

Result
---------------
2010-12-16 00:00:00.0000000

(1 row(s) affected)
TRY_CAST (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una conversión de valor al tipo de datos especificado si la conversión se realiza correctamente; de lo
contrario, devuelve NULL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TRY_CAST ( expression AS data_type [ ( length ) ] )

Argumentos
expression
Valor que se va a convertir. Cualquier expresión válida.
data_type
Tipo de datos al que se va a convertir expression.
length
Número entero opcional que especifica la longitud del tipo de datos de destino.
El intervalo de valores aceptables está determinado por el valor de data_type.

Tipos devueltos
Devuelve una conversión de valor al tipo de datos especificado si la conversión se realiza correctamente; de lo
contrario, devuelve NULL.

Notas
TRY_CAST toma el valor que se le ha pasado e intenta convertirlo al data_type especificado. Si la conversión se
realiza correctamente, TRY_CAST devuelve el valor como el data_type especificado; si se produce un error, se
devuelve NULL. Pero si se solicita una conversión que no se permite explícitamente, TRY_CAST generará un error.
TRY_CAST no es una palabra clave reservada y está disponible en todos los niveles de compatibilidad.
TRY_CAST tiene la misma semántica que TRY_CONVERT al conectarse a los servidores remotos.

Ejemplos
A. TRY_CAST devuelve NULL
En el ejemplo siguiente se muestra que TRY_CAST devuelve NULL cuando se produce un error en la conversión.
SELECT
CASE WHEN TRY_CAST('test' AS float) IS NULL
THEN 'Cast failed'
ELSE 'Cast succeeded'
END AS Result;
GO

El conjunto de resultados es el siguiente.

Result
------------
Cast failed

(1 row(s) affected)

En el ejemplo siguiente se demuestra que la expresión debe tener el formato esperado.

SET DATEFORMAT dmy;


SELECT TRY_CAST('12/31/2010' AS datetime2) AS Result;
GO

El conjunto de resultados es el siguiente.

Result
----------------------
NULL

(1 row(s) affected)

B. TRY_CAST genera un error


En el ejemplo siguiente, se muestra que TRY_CAST devuelve un error cuando la conversión no está explícitamente
permitida.

SELECT TRY_CAST(4 AS xml) AS Result;


GO

El resultado de esta instrucción es un error, ya que un entero no se puede convertir en un tipo de datos xml.

Explicit conversion from data type int to xml is not allowed.

C. TRY_CAST se realiza correctamente


Este ejemplo demuestra que la expresión debe tener el formato esperado.

SET DATEFORMAT mdy;


SELECT TRY_CAST('12/31/2010' AS datetime2) AS Result;
GO

El conjunto de resultados es el siguiente.


Result
----------------------------------
2010-12-31 00:00:00.0000000

(1 row(s) affected)

Ver también
TRY_CONVERT (Transact-SQL )
CAST y CONVERT (Transact-SQL )
TRY_CONVERT (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una conversión de valor al tipo de datos especificado si la conversión se realiza correctamente; de lo
contrario, devuelve NULL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TRY_CONVERT ( data_type [ ( length ) ], expression [, style ] )

Argumentos
data_type [ ( length ) ]
Tipo de datos al que se va a convertir expression.
expression
Valor que se va a convertir.
style
Expresión opcional de tipo entero que especifica el modo en que la función TRY_CONVERT va a traducir
expression.
style acepta los mismos valores que el parámetro style de la función CONVERT. Para obtener más información,
vea CAST y CONVERT (Transact-SQL ).
El intervalo de valores aceptables está determinado por el valor de data_type. Si style es NULL, TRY_CONVERT
devuelve NULL.

Tipos devueltos
Devuelve una conversión de valor al tipo de datos especificado si la conversión se realiza correctamente; de lo
contrario, devuelve NULL.

Notas
TRY_CONVERT toma el valor que se le ha pasado e intenta convertirlo al data_type especificado. Si la
conversión se realiza correctamente, TRY_CONVERT devuelve el valor como el data_type especificado; si se
produce un error, se devuelve NULL. Pero si se solicita una conversión que no se permite explícitamente,
TRY_CONVERT generará un error.
TRY_CONVERT es una palabra clave reservada en el nivel de compatibilidad 110 y posteriores.
Esta función se puede enviar de forma remota a servidores que tengan una versión de SQL Server 2012 (11.x) y
superior. No se puede enviar de forma remota a servidores que tengan una versión inferior a SQL Server 2012
(11.x).
Ejemplos
A. TRY_CONVERT devuelve NULL
En el ejemplo siguiente se muestra que TRY_CONVERT devuelve NULL cuando se produce un error en la
conversión.

SELECT
CASE WHEN TRY_CONVERT(float, 'test') IS NULL
THEN 'Cast failed'
ELSE 'Cast succeeded'
END AS Result;
GO

El conjunto de resultados es el siguiente.

Result
------------
Cast failed

(1 row(s) affected)

En el ejemplo siguiente se demuestra que la expresión debe tener el formato esperado.

SET DATEFORMAT dmy;


SELECT TRY_CONVERT(datetime2, '12/31/2010') AS Result;
GO

El conjunto de resultados es el siguiente.

Result
----------------------
NULL

(1 row(s) affected)

B. TRY_CONVERT genera un error


En el ejemplo siguiente, se muestra que TRY_CONVERT devuelve un error cuando la conversión no está
explícitamente permitida.

SELECT TRY_CONVERT(xml, 4) AS Result;


GO

El resultado de esta instrucción es un error, ya que un entero no se puede convertir en un tipo de datos xml.

Explicit conversion from data type int to xml is not allowed.

C. TRY_CONVERT se realiza correctamente


Este ejemplo demuestra que la expresión debe tener el formato esperado.

SET DATEFORMAT mdy;


SELECT TRY_CONVERT(datetime2, '12/31/2010') AS Result;
GO
El conjunto de resultados es el siguiente.

Result
----------------------------------
2010-12-31 00:00:00.0000000

(1 row(s) affected)

Ver también
CAST y CONVERT (Transact-SQL )
TRY_PARSE (Transact-SQL)
18/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el resultado de una expresión, traducido al tipo de datos solicitado, o NULL si se produce un error en la
conversión en SQL Server. Use TRY_PARSE solo para convertir de tipos de cadena a tipos de fecha y hora y de
número.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TRY_PARSE ( string_value AS data_type [ USING culture ] )

Argumentos
string_value
Valor nvarchar(4000) que representa el valor con formato que se va a analizar en el tipo de datos especificado.
string_value debe ser una representación válida del tipo de datos solicitado; en caso contrario, TRY_PARSE
devuelve NULL.
data_type
Literal que representa el tipo de datos solicitado para el resultado.
culture
Cadena opcional que identifica la referencia cultural en la que se da formato a string_value.
Si no se proporciona el argumento culture, se usará el idioma de la sesión actual. Este idioma se establece
implícitamente o explícitamente mediante la instrucción SET L ANGUAGE. culture acepta cualquier referencia
cultural compatible con .NET Framework; no se limita a los idiomas admitidos explícitamente por SQL Server. Si
el argumento culture no es válido, PARSE desencadena un error.

Tipos devueltos
Devuelve el resultado de la expresión, traducido al tipo de datos solicitado, o NULL si se produce un error en la
conversión.

Notas
Use TRY_PARSE solo para convertir de tipos de cadena a tipos de fecha y hora y de número. Para las conversiones
de tipos generales, siga usando CAST o CONVERT. Tenga en cuenta que hay cierta sobrecarga de rendimiento al
analizar el valor de cadena.
TRY_PARSE se basa en la presencia de Common Language Runtime (CLR ) de .NET Framework.
Esta función no se enviará de forma remota puesto que depende de la presencia del CLR. El envío remoto de una
función que necesita el CLR produciría un error en el servidor remoto.
Más información sobre el parámetro data_type
Los valores del parámetro data_type están restringidos a los tipos que aparecen en la tabla siguiente, junto con
estilos. La información de estilo se proporciona como ayuda para determinar los tipos de modelos permitidos. Para
más información sobre los estilos, vea la documentación de .NET Framework para las enumeraciones
System.Globalization.NumberStyles y DateTimeStyles .

CATEGORÍA TIPO TIPO DE .NET ESTILOS USADOS

Numérico bigint Int64 NumberStyles.Number

Numérico INT Int32 NumberStyles.Number

Numérico SMALLINT Int16 NumberStyles.Number

Numérico TINYINT Byte NumberStyles.Number

Numérico Decimal Decimal NumberStyles.Number

Numérico NUMERIC Decimal NumberStyles.Number

Numérico FLOAT Doble NumberStyles.Float

Numérico REAL Único NumberStyles.Float

Numérico SMALLMONEY Decimal NumberStyles.Currency

Numérico money Decimal NumberStyles.Currency

Fecha y hora Date DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora time Timespan DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora DATETIME DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora smalldatetime DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Fecha y hora datetime2 DateTime DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal
CATEGORÍA TIPO TIPO DE .NET ESTILOS USADOS

Fecha y hora datetimeoffset DateTimeOffset DateTimeStyles.AllowWhiteS


paces |
DateTimeStyles.AssumeUniv
ersal

Más información sobre el parámetro culture


En la tabla siguiente se muestran las asignaciones de los idiomas de SQL Server a las referencias culturales de
.NET Framework.

REFERENCIA CULTURAL
NOMBRE COMPLETO ALIAS LCID ESPECÍFICA

us_english Inglés 3082 es-ES

Deutsch German 1031 de-DE

Français Francés 1036 fr-FR

日本語 Japonés 1041 ja-JP

Dansk Danish 1030 da-DK

Español Español 3082 es-ES

Italiano Italiano 1040 it-IT

Nederlands Neerlandés 1043 nl-NL

Norsk Noruego 2068 nn-NO

Português Portugués 2070 pt-PT

Suomi Finlandés 1035 fi

Svenska Sueco 1053 sv-SE

čeština Czech 1029 Cs-CZ

magyar Húngaro 1038 Hu-HU

polski Polaco 1045 Pl-PL

română Rumano 1048 Ro-RO

hrvatski Croata 1050 hr-HR

slovenčina Eslovaco 1051 Sk-SK

slovenski Esloveno 1060 Sl-SI

ελληνικά Greek 1032 El-GR


REFERENCIA CULTURAL
NOMBRE COMPLETO ALIAS LCID ESPECÍFICA

български Búlgaro 1026 bg-BG

русский Ruso 1049 Ru-RU

Türkçe Turco 1055 Tr-TR

British British English 2057 en-GB

eesti Estonio 1061 Et-EE

latviešu Letón 1062 lv-LV

lietuvių Lituano 1063 lt-LT

Português (Brasil) Portugués (Brasil) 1046 pt-BR

繁體中文 Chino tradicional 1028 zh-TW

한국어 Coreano 1042 Ko-KR

简体中文 Chino simplificado 2052 zh-CN

Árabe Árabe 1025 ar-SA

ไทย Tailandés 1054 Th-TH

Ejemplos
A. Ejemplo simple de TRY_PARSE

SELECT TRY_PARSE('Jabberwokkie' AS datetime2 USING 'en-US') AS Result;

El conjunto de resultados es el siguiente.

Result
---------------
NULL

(1 row(s) affected)

B. Detectar valores NULL con TRY_PARSE

SELECT
CASE WHEN TRY_PARSE('Aragorn' AS decimal USING 'sr-Latn-CS') IS NULL
THEN 'True'
ELSE 'False'
END
AS Result;
El conjunto de resultados es el siguiente.

Result
---------------
True

(1 row(s) affected)

C. Usar IIF con TRY_PARSE y la configuración implícita de referencia cultural

SET LANGUAGE English;


SELECT IIF(TRY_PARSE('01/01/2011' AS datetime2) IS NULL, 'True', 'False') AS Result;

El conjunto de resultados es el siguiente.

Result
---------------
False

(1 row(s) affected)

Ver también
PARSE (Transact-SQL )
Conversion Functions (Transact-SQL ) [Funciones de conversión (Transact-SQL )]
TRY_CONVERT (Transact-SQL )
CAST y CONVERT (Transact-SQL )
Funciones criptográficas (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Estas funciones admiten la firma digital, la validación de firma digital, el cifrado y el descifrado.

Cifrado y descifrado simétricos

ENCRYPTBYKEY DECRYPTBYKEY

ENCRYPTBYPASSPHRASE DECRYPTBYPASSPHRASE

KEY_ID KEY_GUID

DECRYPTBYKEYAUTOASYMKEY KEY_NAME

SYMKEYPROPERTY

Cifrado y descifrado asimétricos

ENCRYPTBYASYMKEY DECRYPTBYASYMKEY

ENCRYPTBYCert DECRYPTBYCERT

ASYMKEYPROPERTY ASYMKEY_ID

Firma y comprobación de firma

SIGNBYASYMKEY VERIFYSIGNEDBYASMKEY

SIGNBYCERT VERIGYSIGNEDBYCERT

IS_OBJECTSIGNED

Descifrado simétrico con control de clave automático

DecryptByKeyAutoCert

Hash de cifrado
HASHBYTES

Copia de certificados

CERTENCODED (Transact-SQL)

CERTPRIVATEKEY (Transact-SQL)

Vea también
Funciones
Jerarquía de cifrado
Jerarquía de permisos (motor de base de datos)
CREATE CERTIFICATE (Transact-SQL )
CREATE SYMMETRIC KEY (Transact-SQL )
CREATE ASYMMETRIC KEY (Transact-SQL )
Vistas de catálogo de seguridad (Transact-SQL )
ASYMKEY_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el Id. de una clave asimétrica.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ASYMKEY_ID ( 'Asym_Key_Name' )

Argumentos
Asym_Key_Name
Nombre de una clave asimétrica en la base de datos.

Tipos de valores devueltos


int

Permisos
Es necesario tener los permisos apropiados sobre la clave asimétrica y que el autor de la llamada no tenga
denegado el permiso VIEW sobre la clave asimétrica. Para obtener más información sobre los permisos de la
clave asimétrica, vea CREATE ASYMMETRIC KEY (Transact-SQL ).

Ejemplos
En este ejemplo se devuelve el Id. de la clave asimétrica ABerglundKey11 .

SELECT ASYMKEY_ID('ABerglundKey11');
GO

Vea también
CREATE ASYMMETRIC KEY (Transact-SQL )
ALTER ASYMMETRIC KEY (Transact-SQL )
DROP ASYMMETRIC KEY (Transact-SQL )
SIGNBYASYMKEY (Transact-SQL )
VERIFYSIGNEDBYASYMKEY (Transact-SQL )
Jerarquía de cifrado
sys.asymmetric_keys (Transact-SQL )
Vistas de catálogo de seguridad (Transact-SQL )
ASYMKEYPROPERTY (Transact-SQL )
KEY_ID (Transact-SQL )
ASYMKEYPROPERTY (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve las propiedades de una clave asimétrica.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ASYMKEYPROPERTY (Key_ID , 'algorithm_desc' | 'string_sid' | 'sid')

Argumentos
Key_ID
Valor Key_ID de una clave asimétrica en la base de datos. Para buscar el valor Key_ID cuando solo se conoce el
nombre de la clave, utilice ASYMKEY_ID. Key_ID tiene un tipo de datos int.
' algorithm_desc '
Especifica que la salida devuelve la descripción del algoritmo de la clave asimétrica. Solo está disponible para las
claves asimétricas creadas a partir de un módulo EKM.
' string_sid '
Especifica que la salida devuelve el SID de la clave asimétrica en formato nvarchar().
' sid '
Especifica que la salida devuelve el SID de la clave asimétrica en formato binario.

Tipos de valores devueltos


sql_variant

Permisos
Es necesario tener los permisos apropiados sobre la clave asimétrica y que el autor de la llamada no tenga
denegado el permiso VIEW sobre la clave asimétrica. Para obtener más información sobre los permisos de la clave
asimétrica, vea CREATE ASYMMETRIC KEY (Transact-SQL ).

Ejemplos
En el ejemplo siguiente se devuelven las propiedades de la clave asimétrica con un valor 256 para Key_ID.

SELECT
ASYMKEYPROPERTY(256, 'algorithm_desc') AS Algorithm,
ASYMKEYPROPERTY(256, 'string_sid') AS String_SID,
ASYMKEYPROPERTY(256, 'sid') AS SID ;
GO
Vea también
CREATE ASYMMETRIC KEY (Transact-SQL )
ALTER ASYMMETRIC KEY (Transact-SQL )
DROP ASYMMETRIC KEY (Transact-SQL )
SIGNBYASYMKEY (Transact-SQL )
VERIFYSIGNEDBYASYMKEY (Transact-SQL )
Jerarquía de cifrado
sys.asymmetric_keys (Transact-SQL )
Vistas de catálogo de seguridad (Transact-SQL )
ASYMKEY_ID (Transact-SQL )
SYMKEYPROPERTY (Transact-SQL )
CERTPROPERTY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de una propiedad de certificado especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CertProperty ( Cert_ID , '<PropertyName>' )

<PropertyName> ::=
Expiry_Date | Start_Date | Issuer_Name
| Cert_Serial_Number | Subject | SID | String_SID

Argumentos
Cert_ID
El valor del identificador de certificado, con el tipo de datos int.
Expiry_Date
La fecha de expiración del certificado.
Start_Date
La fecha en la que el certificado pasa a ser válido.
Issuer_Name
El nombre del emisor de certificado.
Cert_Serial_Number
El número de serie del certificado.
Asunto
El asunto del certificado.
SID
El SID del certificado. También es el SID de cualquier inicio de sesión o usuario asignado a este certificado.
String_SID
El SID del certificado como una cadena de caracteres. También es el SID de cualquier inicio de sesión o usuario
asignado al certificado.

Tipos de valores devueltos


La especificación de propiedad debe estar entre comillas simples.
El tipo de valor devuelto depende de la propiedad especificada en la llamada de función. El tipo de valor devuelto
sql_variant encapsula todos los valores devueltos.
Expiry_Date y Start_Date devuelven datetime.
Cert_Serial_Number, Issuer_Name, String_SID y Subject devuelven nvarchar.
SID devuelve varbinary.

Notas
Consulte la información de los certificados en la vista de catálogo sys.certificates.

Permisos
Es necesario tener los permisos apropiados en el certificado y que el autor de la llamada no tenga denegado el
permiso VIEW en el certificado. Vea CREATE CERTIFICATE (Transact-SQL ) y GRANT CERTIFICATE
PERMISSIONS (Transact-SQL ) para obtener más información sobre los permisos de certificado.

Ejemplos
En el siguiente ejemplo se devuelve el asunto del certificado.

-- First create a certificate.


CREATE CERTIFICATE Marketing19 WITH
START_DATE = '04/04/2004' ,
EXPIRY_DATE = '07/07/2040' ,
SUBJECT = 'Marketing Print Division';
GO

-- Now use CertProperty to examine certificate


-- Marketing19's properties.
DECLARE @CertSubject sql_variant;
set @CertSubject = CertProperty( Cert_ID('Marketing19'), 'Subject');
PRINT CONVERT(nvarchar, @CertSubject);
GO

Vea también
CREATE CERTIFICATE (Transact-SQL )
ALTER CERTIFICATE (Transact-SQL )
CERT_ID (Transact-SQL ) Jerarquía de cifrado sys.certificates (Transact-SQL ) Vistas de catálogo de seguridad
(Transact-SQL )
CERT_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el valor de identificador de un certificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
Cert_ID ( 'cert_name' )

Argumentos
' cert_name '
El nombre de un certificado de la base de datos.

Tipos de valores devueltos


int

Notas
La vista de catálogo sys.certificates muestra los nombres de certificados.

Permisos
Es necesario tener los permisos apropiados en el certificado y que el autor de la llamada no tenga denegado el
permiso VIEW DEFINITION en el certificado. Vea CREATE CERTIFICATE (Transact-SQL ) para obtener más
información sobre los permisos de certificados.

Ejemplos
Este ejemplo devuelve el Id. de un certificado denominado ABerglundCert3 .

SELECT Cert_ID('ABerglundCert3');
GO

Vea también
sys.certificates (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL )
Jerarquía de cifrado
CRYPT_GEN_RANDOM (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un número criptográfico y aleatorio, generado por Crypto API (CAPI). CRYPT_GEN_RANDOM
devuelve un número hexadecimal con una longitud de un número especificado de bytes.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CRYPT_GEN_RANDOM ( length [ , seed ] )

Argumentos
length
La longitud, en bytes, del número que CRYPT_GEN_RANDOM va a crear. El argumento length tiene un tipo de datos int
y un rango de valores entre 1 y 8000. CRYPT_GEN_RANDOM devuelve NULL para un valor int fuera de este rango.
seed
Un número hexadecimal opcional, para su uso como un valor de inicialización aleatorio. La longitud de seed debe
coincidir con el valor del argumento length. El argumento seed tiene un tipo de datos varbinario(8000).

Tipos devueltos
varbinary(8000)

Permisos
Esta función es pública y no requiere permisos especiales.

Ejemplos
A. Generar un número aleatorio
En este ejemplo se genera un número aleatorio con una longitud de 50 bytes:

SELECT CRYPT_GEN_RANDOM(50) ;

En este ejemplo se genera un número aleatorio con una longitud de 4 bytes utilizando un valor de inicialización de
4 bytes:

SELECT CRYPT_GEN_RANDOM(4, 0x25F18060) ;

Vea también
RAND (Transact-SQL )
DECRYPTBYASYMKEY (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
En esta función se usa una clave asimétrica para descifrar los datos cifrados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DecryptByAsymKey (Asym_Key_ID , { 'ciphertext' | @ciphertext }
[ , 'Asym_Key_Password' ] )

Argumentos
Asym_Key_ID
Id. de una clave asimétrica en la base de datos. Asym_Key_ID tiene un tipo de datos int.
ciphertext
La cadena de datos cifrados con la clave asimétrica.
@ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con la clave asimétrica.
Asym_Key_Password
La contraseña que se usa para cifrar la clave asimétrica en la base de datos.

Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes.

Notas
En comparación con el cifrado y descifrado simétricos, el cifrado y descifrado de claves asimétricas tiene un coste
más elevado. Cuando se trabaja con grandes conjuntos de datos (por ejemplo, datos de usuario almacenados en
tablas), se recomienda que los desarrolladores eviten el cifrado y descifrado de claves asimétricas.

Permisos
DECRYPTBYASYMKEY requiere el permiso CONTROL en la clave asimétrica.

Ejemplos
En este ejemplo se descifra texto que originalmente se cifró con la clave asimétrica JanainaAsymKey02 . Esta clave
asimétrica se almacenó en AdventureWorks2012.ProtectedData04 . En el ejemplo se descifran los datos devueltos con
la clave asimétrica JanainaAsymKey02 . En el ejemplo se usa la contraseña pGFD4bb925DGvbd2439587y para descifrar
esta clave asimétrica. En el ejemplo se convierte el texto sin formato devuelto al tipo nvarchar.
SELECT CONVERT(nvarchar(max),
DecryptByAsymKey( AsymKey_Id('JanainaAsymKey02'),
ProtectedData, N'pGFD4bb925DGvbd2439587y' ))
AS DecryptedData
FROM [AdventureWorks2012].[Sales].[ProtectedData04]
WHERE Description = N'encrypted by asym key''JanainaAsymKey02''';
GO

Ver también
ENCRYPTBYASYMKEY (Transact-SQL )
CREATE ASYMMETRIC KEY (Transact-SQL )
ALTER ASYMMETRIC KEY (Transact-SQL )
DROP ASYMMETRIC KEY (Transact-SQL )
Elegir un algoritmo de cifrado
Jerarquía de cifrado
DECRYPTBYCERT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
En esta función se usa la clave privada de un certificado para descifrar los datos cifrados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DecryptByCert ( certificate_ID , { 'ciphertext' | @ciphertext }
[ , { 'cert_password' | @cert_password } ] )

Argumentos
certificate_ID
Id. de un certificado de la base de datos. certificate_ID tiene un tipo de datos int.
ciphertext
La cadena de datos cifrados con la clave pública del certificado.
@ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con el certificado.
cert_password
La contraseña que se usa para cifrar la clave privada del certificado. cert_password debe tener un formato de datos
Unicode.
@cert_password
Una variable de tipo nchar o nvarchar que contiene la contraseña que se usa para cifrar la clave privada del
certificado. @cert_password debe tener un formato de datos Unicode.

Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes.

Notas
Esta función descifra datos con la clave privada de un certificado. Las transformaciones cifradas que utilizan claves
asimétricas consumen gran cantidad de recursos. Por tanto, se recomienda que los desarrolladores eviten el uso
de ENCRYPTBYCERT y DECRYPTBYCERT para el cifrado y descifrado de datos de usuario rutinarios.

Permisos
DECRYPTBYCERT requiere el permiso CONTROL en el certificado.

Ejemplos
En este ejemplo se seleccionan filas de [AdventureWorks2012].[ProtectedData04] marcadas como datos que
originalmente se cifraron mediante el certificado JanainaCert02 . En el ejemplo, primero se descifra la clave
privada del certificado JanainaCert02 con la contraseña del certificado pGFD4bb925DGvbd2439587y . Después, en el
ejemplo se descifra el texto cifrado con esta clave privada. En el ejemplo, los datos descifrados se convierten de
varbinary a nvarchar.

SELECT convert(nvarchar(max), DecryptByCert(Cert_Id('JanainaCert02'),


ProtectedData, N'pGFD4bb925DGvbd2439587y'))
FROM [AdventureWorks2012].[ProtectedData04]
WHERE Description
= N'data encrypted by certificate '' JanainaCert02''';
GO

Ver también
ENCRYPTBYCERT (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL )
ALTER CERTIFICATE (Transact-SQL )
DROP CERTIFICATE (Transact-SQL )
BACKUP CERTIFICATE (Transact-SQL )
Jerarquía de cifrado
DECRYPTBYKEY (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
En esta función se usa una clave simétrica para descifrar los datos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DecryptByKey ( { 'ciphertext' | @ciphertext }
[ , add_authenticator, { authenticator | @authenticator } ] )

Argumentos
ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con la clave.
@ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con la clave.
add_authenticator
Indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin formato. Debe
coincidir con el valor que se pasa a ENCRYPTBYKEY (Transact-SQL ) durante el proceso de cifrado de datos.
add_authenticator tiene un tipo de datos int.
authenticator
Los datos que se usaron como base para la generación del autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). autenticador tiene un tipo de datos sysname.
@authenticator
Una variable que contiene datos a partir de los que se genera un autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). @authenticator tiene un tipo de datos sysname.

Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes. DECRYPTBYKEY devuelve NULL si la clave simétrica usada para
el cifrado de los datos no está abierta o si ciphertext es NULL.

Notas
DECRYPTBYKEY usa una clave simétrica. La base de datos debe tener esta clave simétrica ya abierta. DECRYPTBYKEY
permitirá varias claves abiertas a la vez. No es necesario abrir la clave inmediatamente antes de descifrar el texto
cifrado.
El cifrado y descifrado simétricos suelen funcionar con relativa rapidez, y funcionan bien para las operaciones que
implican grandes volúmenes de datos.
Permisos
La clave simétrica ya debe estar abierta en la sesión actual. Para obtener más información, vea OPEN
SYMMETRIC KEY (Transact-SQL ).

Ejemplos
A. Descifrar utilizando una clave simétrica
En este ejemplo se descifra texto cifrado con una clave simétrica.

-- First, open the symmetric key with which to decrypt the data.
OPEN SYMMETRIC KEY SSN_Key_01
DECRYPTION BY CERTIFICATE HumanResources037;
GO

-- Now list the original ID, the encrypted ID, and the
-- decrypted ciphertext. If the decryption worked, the original
-- and the decrypted ID will match.
SELECT NationalIDNumber, EncryptedNationalID
AS 'Encrypted ID Number',
CONVERT(nvarchar, DecryptByKey(EncryptedNationalID))
AS 'Decrypted ID Number'
FROM HumanResources.Employee;
GO

B. Descifrar utilizando una clave simétrica y un hash de autenticación


En este ejemplo se descifran datos que originalmente se cifraron juntos con un autenticador.

-- First, open the symmetric key with which to decrypt the data
OPEN SYMMETRIC KEY CreditCards_Key11
DECRYPTION BY CERTIFICATE Sales09;
GO

-- Now list the original card number, the encrypted card number,
-- and the decrypted ciphertext. If the decryption worked,
-- the original number will match the decrypted number.
SELECT CardNumber, CardNumber_Encrypted
AS 'Encrypted card number', CONVERT(nvarchar,
DecryptByKey(CardNumber_Encrypted, 1 ,
HashBytes('SHA1', CONVERT(varbinary, CreditCardID))))
AS 'Decrypted card number' FROM Sales.CreditCard;
GO

Ver también
ENCRYPTBYKEY (Transact-SQL )
CREATE SYMMETRIC KEY (Transact-SQL )
ALTER SYMMETRIC KEY (Transact-SQL )
DROP SYMMETRIC KEY (Transact-SQL )
Jerarquía de cifrado
Elegir un algoritmo de cifrado
DECRYPTBYKEYAUTOASYMKEY (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función descifra los datos cifrados. Para ello, en primer lugar descifra una clave simétrica con una clave
asimétrica independiente y, después, descifra los datos cifrados con la clave simétrica que se extraen en el primer
"paso".
Convenciones de sintaxis de Transact-SQL

Sintaxis
DecryptByKeyAutoAsymKey ( akey_ID , akey_password
, { 'ciphertext' | @ciphertext }
[ , { add_authenticator | @add_authenticator }
[ , { authenticator | @authenticator } ] ] )

Argumentos
akey_ID
Es el identificador de la clave asimétrica que se usa para cifrar la clave simétrica. akey_ID tiene un tipo de datos int.
akey_password
La contraseña que protege la clave asimétrica. akey_password puede tener un valor NULL si la clave maestra de la
base de datos protege la clave privada asimétrica. akey_password tiene un tipo de datos nvarchar.
ciphertext Los datos que se cifraron con la clave. ciphertext tiene un tipo de datos varbinary.
@ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con la clave simétrica.
add_authenticator
Indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin formato. Debe
coincidir con el valor que se pasa a ENCRYPTBYKEY (Transact-SQL ) durante el proceso de cifrado de datos.
add_authenticator tiene un valor de 1 si el proceso de cifrado usó un autenticador. add_authenticator tiene un tipo
de datos int.
@add_authenticator
Una variable que indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin
formato. Debe coincidir con el valor que se pasa a ENCRYPTBYKEY (Transact-SQL ) durante el proceso de cifrado
de datos. @add_authenticator tiene un tipo de datos int.
authenticator
Los datos que se usaron como base para la generación del autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). autenticador tiene un tipo de datos sysname.
@authenticator
Una variable que contiene datos a partir de los que se genera un autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). @authenticator tiene un tipo de datos sysname.
@add_authenticator
Una variable que indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin
formato. Debe coincidir con el valor que se pasa a ENCRYPTBYKEY (Transact-SQL ) durante el proceso de cifrado
de datos. @add_authenticator tiene un tipo de datos int.
authenticator
Los datos que se usaron como base para la generación del autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). autenticador tiene un tipo de datos sysname.
@authenticator
Una variable que contiene datos a partir de los que se genera un autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). @authenticator tiene un tipo de datos sysname.

Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes.

Notas
DECRYPTBYKEYAUTOASYMKEY combina las funciones de OPEN SYMMETRIC KEY y DECRYPTBYKEY . En una sola operación,
primero descifra una clave simétrica y después la usa para descifrar el texto cifrado.

Permisos
Se requiere el permiso VIEW DEFINITION en la clave simétrica y el permiso CONTROL en la clave asimétrica.

Ejemplos
En este ejemplo se muestra cómo DECRYPTBYKEYAUTOASYMKEY puede simplificar el código de descifrado. Este código
se debería ejecutar en una base de datos AdventureWorks2012 que aún no tenga una clave maestra de base de
datos.
--Create the keys and certificate.
USE AdventureWorks2012;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mzkvdMlk979438teag$$ds987yghn)(*&4fdg^';
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'mzkvdMlk979438teag$$ds987yghn)(*&4fdg^';
CREATE ASYMMETRIC KEY SSN_AKey
WITH ALGORITHM = RSA_2048 ;
GO
CREATE SYMMETRIC KEY SSN_Key_02 WITH ALGORITHM = DES
ENCRYPTION BY ASYMMETRIC KEY SSN_AKey;
GO
--
--Add a column of encrypted data.
ALTER TABLE HumanResources.Employee
ADD EncryptedNationalIDNumber2 varbinary(128);
OPEN SYMMETRIC KEY SSN_Key_02
DECRYPTION BY ASYMMETRIC KEY SSN_AKey;
UPDATE HumanResources.Employee
SET EncryptedNationalIDNumber2
= EncryptByKey(Key_GUID('SSN_Key_02'), NationalIDNumber);
GO
--Close the key used to encrypt the data.
CLOSE SYMMETRIC KEY SSN_Key_02;
--
--There are two ways to decrypt the stored data.
--
--OPTION ONE, using DecryptByKey()
--1. Open the symmetric key.
--2. Decrypt the data.
--3. Close the symmetric key.
OPEN SYMMETRIC KEY SSN_Key_02
DECRYPTION BY ASYMMETRIC KEY SSN_AKey;
SELECT NationalIDNumber, EncryptedNationalIDNumber2
AS 'Encrypted ID Number',
CONVERT(nvarchar, DecryptByKey(EncryptedNationalIDNumber2))
AS 'Decrypted ID Number'
FROM HumanResources.Employee;
CLOSE SYMMETRIC KEY SSN_Key_02;
--
--OPTION TWO, using DecryptByKeyAutoAsymKey()
SELECT NationalIDNumber, EncryptedNationalIDNumber2
AS 'Encrypted ID Number',
CONVERT(nvarchar, DecryptByKeyAutoAsymKey ( AsymKey_ID('SSN_AKey') , NULL ,EncryptedNationalIDNumber2))
AS 'Decrypted ID Number'
FROM HumanResources.Employee;
GO

Ver también
OPEN SYMMETRIC KEY (Transact-SQL )
ENCRYPTBYKEY (Transact-SQL )
DECRYPTBYKEY (Transact-SQL )
Jerarquía de cifrado
DECRYPTBYKEYAUTOCERT (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función descifra datos con una clave simétrica. Esa clave simétrica se descifra de forma automática con un
certificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DecryptByKeyAutoCert ( cert_ID , cert_password
, { 'ciphertext' | @ciphertext }
[ , { add_authenticator | @add_authenticator }
[ , { authenticator | @authenticator } ] ] )

Argumentos
cert_ID
El identificador del certificado que se usa para proteger la clave simétrica. cert_ID tiene un tipo de datos int.
cert_password
La contraseña que se usa para cifrar la clave privada del certificado. Puede tener un valor NULL si la clave maestra
de la base de datos protege la clave privada. cert_password tiene un tipo de datos nvarchar.
'ciphertext'
La cadena de datos cifrados con la clave. ciphertext tiene un tipo de datos varbinary.
@ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con la clave.
add_authenticator
Indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin formato. Debe
coincidir con el valor que se pasa a ENCRYPTBYKEY (Transact-SQL ) durante el proceso de cifrado de datos.
add_authenticator tiene un valor de 1 si el proceso de cifrado usó un autenticador. add_authenticator tiene un tipo
de datos int.
@add_authenticator
Una variable que indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin
formato. Debe coincidir con el valor que se pasa a ENCRYPTBYKEY (Transact-SQL ) durante el proceso de cifrado
de datos. @add_authenticator tiene un tipo de datos int.
authenticator
Los datos que se usaron como base para la generación del autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). autenticador tiene un tipo de datos sysname.
@authenticator
Una variable que contiene datos a partir de los que se genera un autenticador. Debe coincidir con el valor que se
proporcionó a ENCRYPTBYKEY (Transact-SQL ). @authenticator tiene un tipo de datos sysname.
Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes.

Notas
DECRYPTBYKEYAUTOCERT combina las funciones de OPEN SYMMETRIC KEY y DECRYPTBYKEY . En una sola operación,
primero descifra una clave simétrica y después la usa para descifrar el texto cifrado.

Permisos
Se requiere el permiso VIEW DEFINITION en la clave simétrica y el permiso CONTROL en el certificado.

Ejemplos
En este ejemplo se muestra cómo DECRYPTBYKEYAUTOCERT puede simplificar el código de descifrado. Este código se
debería ejecutar en una base de datos AdventureWorks2012 que aún no tenga una clave maestra de base de
datos.
--Create the keys and certificate.
USE AdventureWorks2012;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mzkvdlk979438teag$$ds987yghn)(*&4fdg^';
OPEN MASTER KEY DECRYPTION BY PASSWORD = 'mzkvdlk979438teag$$ds987yghn)(*&4fdg^';
CREATE CERTIFICATE HumanResources037
WITH SUBJECT = 'Sammamish HR',
EXPIRY_DATE = '10/31/2009';
CREATE SYMMETRIC KEY SSN_Key_01 WITH ALGORITHM = DES
ENCRYPTION BY CERTIFICATE HumanResources037;
GO
----Add a column of encrypted data.
ALTER TABLE HumanResources.Employee
ADD EncryptedNationalIDNumber varbinary(128);
OPEN SYMMETRIC KEY SSN_Key_01
DECRYPTION BY CERTIFICATE HumanResources037 ;
UPDATE HumanResources.Employee
SET EncryptedNationalIDNumber
= EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber);
GO
--
--Close the key used to encrypt the data.
CLOSE SYMMETRIC KEY SSN_Key_01;
--
--There are two ways to decrypt the stored data.
--
--OPTION ONE, using DecryptByKey()
--1. Open the symmetric key
--2. Decrypt the data
--3. Close the symmetric key
OPEN SYMMETRIC KEY SSN_Key_01
DECRYPTION BY CERTIFICATE HumanResources037;
SELECT NationalIDNumber, EncryptedNationalIDNumber
AS 'Encrypted ID Number',
CONVERT(nvarchar, DecryptByKey(EncryptedNationalIDNumber))
AS 'Decrypted ID Number'
FROM HumanResources.Employee;
CLOSE SYMMETRIC KEY SSN_Key_01;
--
--OPTION TWO, using DecryptByKeyAutoCert()
SELECT NationalIDNumber, EncryptedNationalIDNumber
AS 'Encrypted ID Number',
CONVERT(nvarchar, DecryptByKeyAutoCert ( cert_ID('HumanResources037') , NULL ,EncryptedNationalIDNumber))
AS 'Decrypted ID Number'
FROM HumanResources.Employee;

Ver también
OPEN SYMMETRIC KEY (Transact-SQL )
ENCRYPTBYKEY (Transact-SQL )
DECRYPTBYKEY (Transact-SQL )
Jerarquía de cifrado
DECRYPTBYPASSPHRASE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función descifra los datos que se cifraron originalmente con una frase de contraseña.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DecryptByPassPhrase ( { 'passphrase' | @passphrase }
, { 'ciphertext' | @ciphertext }
[ , { add_authenticator | @add_authenticator }
, { authenticator | @authenticator } ] )

Argumentos
passphrase
La frase de contraseña que se usa para generar la clave de descifrado.
@passphrase
Una variable de tipo
char
nchar
nvarchar
o Administrador de configuración de
varchar
que contiene la frase de contraseña que se usa para generar la clave de descifrado.
'ciphertext'
La cadena de datos cifrados con la clave. ciphertext tiene un tipo de datos varbinary.
@ciphertext
Una variable de tipo varbinary que contiene los datos cifrados con la clave. La variable @ciphertext tiene un
tamaño máximo de 8000 bytes.
add_authenticator
Indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin formato.
add_authenticator tiene un valor de 1 si el proceso de cifrado usó un autenticador. add_authenticator tiene un tipo
de datos int.
@add_authenticator
Una variable que indica si el proceso de cifrado original incluía, y cifraba, un autenticador junto con el texto sin
formato. @add_authenticator tiene un valor de 1 si el proceso de cifrado usó un autenticador. @add_authenticator
tiene un tipo de datos int.
authenticator
Los datos que se usaron como base para la generación del autenticador. autenticador tiene un tipo de datos
sysname.
@authenticator
Una variable que contiene los datos que se usaron como base para la generación de los autenticadores.
@authenticator tiene un tipo de datos sysname.

Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes.

Notas
DECRYPTBYPASSPHRASE no requiere permisos para su ejecución. DECRYPTBYPASSPHRASE devuelve NULL si se recibe la
frase de contraseña o información de autenticador erróneas.
DECRYPTBYPASSPHRASE usa la frase de contraseña para generar una clave de descifrado. Esta clave de descifrado no
se conservará.
Si se incluyó un autenticador en el momento de cifrar el texto cifrado, DECRYPTBYPASSPHRASE debe recibir ese mismo
autenticador para el proceso de descifrado. Si el valor del autenticador proporcionado para el proceso de
descifrado no coincide con el valor del autenticador que se usó originalmente para cifrar los datos, se producirá un
error en la operación DECRYPTBYPASSPHRASE .

Ejemplos
En este ejemplo se descifra el registro actualizado en EncryptByPassPhrase.

USE AdventureWorks2012;
-- Get the pass phrase from the user.
DECLARE @PassphraseEnteredByUser nvarchar(128);
SET @PassphraseEnteredByUser
= 'A little learning is a dangerous thing!';

-- Decrypt the encrypted record.


SELECT CardNumber, CardNumber_EncryptedbyPassphrase
AS 'Encrypted card number', CONVERT(nvarchar,
DecryptByPassphrase(@PassphraseEnteredByUser, CardNumber_EncryptedbyPassphrase, 1
, CONVERT(varbinary, CreditCardID)))
AS 'Decrypted card number' FROM Sales.CreditCard
WHERE CreditCardID = '3681';
GO

Ver también
Elegir un algoritmo de cifrado
ENCRYPTBYPASSPHRASE (Transact-SQL )
ENCRYPTBYASYMKEY (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función cifra los datos con una clave asimétrica.
Convenciones de sintaxis de Transact-SQL

Sintaxis
EncryptByAsymKey ( Asym_Key_ID , { 'plaintext' | @plaintext } )

Argumentos
asym_key_ID
Id. de una clave asimétrica en la base de datos. asym_key_ID tiene un tipo de datos int.
cleartext
Cadena de datos que ENCRYPTBYASYMKEY cifrará con la clave asimétrica. cleartext puede tener un tipo de
binario
char
nchar
nvarchar
varbinary
o Administrador de configuración de
varchar
datos.
@plaintext
Una variable que contiene un valor que ENCRYPTBYASYMKEY cifrará con la clave asimétrica. @plaintext puede tener
un tipo de
binario
char
nchar
nvarchar
varbinary
o Administrador de configuración de
varchar
datos.

Tipos devueltos
varbinary, con un tamaño máximo de 8 000 bytes.

Notas
Las operaciones de cifrado y descifrado en las que se usan claves asimétricas consumen muchos recursos y, por
tanto, son muy costosas, en comparación con el descifrado y cifrado de claves simétricas. Se recomienda que los
desarrolladores eviten el cifrado y descifrado de claves asimétricas en grandes conjuntos de datos (por ejemplo,
conjuntos de datos de usuario almacenados en tablas de base de datos). En su lugar, se recomienda que los
desarrolladores cifren primero los datos con una clave simétrica segura y, después, cifren esa clave simétrica con
una clave asimétrica.
En función del algoritmo, ENCRYPTBYASYMKEY devuelve NULL si la entrada supera un número determinado de
bytes. Los límites específicos:
una clave RSA de 512 bits puede cifrar hasta 53 bytes
una clave de 1024 bits puede cifrar hasta 117 bytes
una clave de 2048 bits puede cifrar hasta 245 bytes
Tenga en cuenta que en SQL Server, tanto los certificados como las claves asimétricas sirven de contenedores de
claves RSA.

Ejemplos
En este ejemplo se cifra el texto almacenado en @cleartext con la clave asimétrica JanainaAsymKey02 . La
instrucción inserta los datos cifrados en la tabla ProtectedData04 .

INSERT INTO AdventureWorks2012.Sales.ProtectedData04


VALUES( N'Data encrypted by asymmetric key ''JanainaAsymKey02''',
EncryptByAsymKey(AsymKey_ID('JanainaAsymKey02'), @cleartext) );
GO

Ver también
DECRYPTBYASYMKEY (Transact-SQL )
CREATE ASYMMETRIC KEY (Transact-SQL )
Jerarquía de cifrado
ENCRYPTBYCERT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Cifra datos con la clave pública de un certificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
EncryptByCert ( certificate_ID , { 'cleartext' | @cleartext } )

Argumentos
certificate_ID
Id. de un certificado de la base de datos. int.
cleartext
Cadena de datos que se cifrarán con el certificado.
@cleartext
Es una variable de tipo nvarchar, char, varchar, binary, varbinary o nchar que contiene los datos que se
cifrarán con la clave pública del certificado.

Tipos devueltos
varbinary con un tamaño máximo de 8000 bytes.

Notas
Esta función cifra datos con la clave pública de un certificado. El texto cifrado solo puede descifrarse con la
correspondiente clave privada. Dichas transformaciones asimétricas son muy costosas en comparación con el
cifrado y el descifrado mediante una clave simétrica. Por ello, el cifrado asimétrico no se recomienda cuando se
trabaja con conjuntos de datos grandes como datos de usuarios en tablas.

Ejemplos
En este ejemplo se cifra el texto simple almacenado en @cleartext con el certificado denominado JanainaCert02 .
Los datos cifrados se insertan en la tabla ProtectedData04 .

INSERT INTO [AdventureWorks2012].[ProtectedData04]


VALUES ( N'Data encrypted by certificate ''Shipping04''',
EncryptByCert(Cert_ID('JanainaCert02'), @cleartext) );
GO

Ver también
DECRYPTBYCERT (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL )
ALTER CERTIFICATE (Transact-SQL )
DROP CERTIFICATE (Transact-SQL )
BACKUP CERTIFICATE (Transact-SQL )
Jerarquía de cifrado
ENCRYPTBYKEY (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL
Data Warehouse Almacenamiento de datos paralelos
Cifra los datos usando una clave simétrica.
Convenciones de sintaxis de Transact-SQL

Sintaxis
EncryptByKey ( key_GUID , { 'cleartext' | @cleartext }
[, { add_authenticator | @add_authenticator }
, { authenticator | @authenticator } ] )

Argumentos
key_GUID
Es el GUID de la clave que se usará para cifrar cleartext. uniqueidentifier.
'cleartext'
Son los datos que se cifrarán con la clave.
@cleartext
Es una variable de tipo nvarchar, char, varchar, binary, varbinary o nchar que contiene datos que se
van a cifrar con la clave.
add_authenticator
Indica si se cifrará un autenticador junto con cleartext. Debe ser 1 cuando se utilice un autenticador. int.
@add_authenticator
Indica si se cifrará un autenticador junto con cleartext. Debe ser 1 cuando se utilice un autenticador. int.
authenticator
Son los datos de los que se derivará un autenticador. sysname.
@authenticator
Es una variable que contiene los datos de los que se derivará un autenticador.

Tipos devueltos
varbinary con un tamaño máximo de 8000 bytes.
Devuelve NULL si la clave no está abierta, si la clave no existe o si se trata de una clave RC4 desusada y
la base de datos no está en el nivel de compatibilidad 110 o superior.
Devuelve NULL si el valor cleartext es NULL.

Notas
EncryptByKey usa una clave simétrica. Esta clave debe estar abierta. Si la clave simétrica ya está abierta
en la sesión actual, no tiene que abrirla de nuevo en el contexto de la consulta.
El autenticador le ayudará a impedir la sustitución de todo el valor de los campos cifrados. Por ejemplo,
considere la siguiente tabla de datos de nóminas:

EMPLOYEE_ID STANDARD_TITLE BASE_PAY

345 Copy Room Assistant Fskj%7^edhn00

697 Chief Financial Officer M0x8900f56543

694 Data Entry Supervisor Cvc97824%^34f

Sin romper el cifrado, un usuario malintencionado puede obtener información importante del contexto
en el que se almacena el texto cifrado. Puesto que al Chief Financial Official se le paga más que al Copy
Room Assistant, el valor cifrado como M0x8900f56543 debe ser mayor que el valor cifrado como
Fskj%7^edhn00. En este caso, cualquier usuario con el permiso ALTER en la tabla puede elevar al Copy
Room Assistant al sustituir los datos en su campo Base_Pay con una copia de los datos almacenados en el
campo Base_Pay del Chief Financial Officer. Este ataque de sustitución del valor completo omite el cifrado
completamente.
Estos ataques de sustitución de valor completo se pueden combatir agregando información contextual al
texto simple antes de cifrarlo. Esta información contextual se usa para comprobar que el texto simple no
se ha movido.
Si se especifica un parámetro de autenticador al cifrar los datos, se necesita el mismo autenticador para
descifrar los datos mediante DecryptByKey. En el momento del cifrado, se cifra un hash del autenticador
junto con el texto simple. En el momento del descifrado, el mismo autenticador se debe pasar a
DecryptByKey. Si los dos no coinciden, se produce un error en el descifrado. Esto indica que el valor se ha
movido desde que se cifró. Recomendamos que utilice una columna que contenga un valor único e
invariable como autenticador. Si el valor del autenticador cambia, podría perder el acceso a los datos.
El cifrado y descifrado simétrico es relativamente rápido y se puede adaptar para trabajar con grandes
cantidades de datos.

IMPORTANT
El uso de las funciones de cifrado de SQL Server junto con el valor ANSI_PADDING OFF podría provocar la pérdida
de datos debido a las conversiones implícitas. Para más información sobre ANSI_PADDING, vea SET
ANSI_PADDING (Transact-SQL).

Ejemplos
Las funciones que se muestran en estos ejemplos se basan en claves y certificados creados en Cómo
cifrar una columna de datos.
A. Cifrar una cadena con una clave simétrica
En el ejemplo siguiente se agrega una columna a la tabla Employee y, a continuación, se cifra el valor del
número de seguridad social almacenado en la columna NationalIDNumber .
USE AdventureWorks2012;
GO

-- Create a column in which to store the encrypted data.


ALTER TABLE HumanResources.Employee
ADD EncryptedNationalIDNumber varbinary(128);
GO

-- Open the symmetric key with which to encrypt the data.


OPEN SYMMETRIC KEY SSN_Key_01
DECRYPTION BY CERTIFICATE HumanResources037;

-- Encrypt the value in column NationalIDNumber with symmetric key


-- SSN_Key_01. Save the result in column EncryptedNationalIDNumber.
UPDATE HumanResources.Employee
SET EncryptedNationalIDNumber
= EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber);
GO

B. Cifrar un registro junto con un valor de autenticación

USE AdventureWorks2012;

-- Create a column in which to store the encrypted data.


ALTER TABLE Sales.CreditCard.
ADD CardNumber_Encrypted varbinary(128);
GO

-- Open the symmetric key with which to encrypt the data.


OPEN SYMMETRIC KEY CreditCards_Key11
DECRYPTION BY CERTIFICATE Sales09;

-- Encrypt the value in column CardNumber with symmetric


-- key CreditCards_Key11.
-- Save the result in column CardNumber_Encrypted.
UPDATE Sales.CreditCard
SET CardNumber_Encrypted = EncryptByKey(Key_GUID('CreditCards_Key11'),
CardNumber, 1, CONVERT( varbinary, CreditCardID) );
GO

Ver también
DECRYPTBYKEY (Transact-SQL )
CREATE SYMMETRIC KEY (Transact-SQL )
ALTER SYMMETRIC KEY (Transact-SQL )
DROP SYMMETRIC KEY (Transact-SQL )
Jerarquía de cifrado
HASHBYTES (Transact-SQL )
ENCRYPTBYPASSPHRASE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Cifra datos mediante una frase de contraseña usando el algoritmo TRIPLE DES con una longitud de clave de 128
bits.
Convenciones de sintaxis de Transact-SQL

Sintaxis
EncryptByPassPhrase ( { 'passphrase' | @passphrase }
, { 'cleartext' | @cleartext }
[ , { add_authenticator | @add_authenticator }
, { authenticator | @authenticator } ] )

Argumentos
passphrase
Frase de contraseña a partir de la cual se genera una clave simétrica.
@passphrase
Variable de tipo nvarchar, char, varchar, binary, varbinary o nchar que contiene una frase de contraseña a
partir de la cual se genera una clave simétrica.
cleartext
Texto no cifrado que se va a cifrar.
@cleartext
Una variable de tipo nvarchar, char, varchar, binary, varbinary o nchar que contiene el texto sin cifrar. El
tamaño máximo es de 8.000 bytes.
add_authenticator
Indica si se cifrará un autenticador junto con el texto sin cifrar. 1 si se va a agregar un autenticador. int.
@add_authenticator
Indica si se cifrará un hash junto con el texto no cifrado.
authenticator
Datos a partir de los cuales se obtiene un autenticador. sysname.
@authenticator
Variable que contiene datos a partir de los cuales se obtiene un autenticador.

Tipos devueltos
varbinary con un tamaño máximo de 8000 bytes.

Notas
Una frase de contraseña es una contraseña que incluye espacios. La ventaja de usar una frase de contraseña es
que es más fácil recordar una frase con significado que una cadena larga de caracteres.
Esta función no comprueba la complejidad de la contraseña.

Ejemplos
En el ejemplo siguiente se actualiza un registro de la tabla SalesCreditCard y se cifra el valor del número de la
tarjeta de crédito almacenado en la columna CardNumber_EncryptedbyPassphrase utilizando la clave principal como
un autenticador.

USE AdventureWorks2012;
GO
-- Create a column in which to store the encrypted data.
ALTER TABLE Sales.CreditCard
ADD CardNumber_EncryptedbyPassphrase varbinary(256);
GO
-- First get the passphrase from the user.
DECLARE @PassphraseEnteredByUser nvarchar(128);
SET @PassphraseEnteredByUser
= 'A little learning is a dangerous thing!';

-- Update the record for the user's credit card.


-- In this case, the record is number 3681.
UPDATE Sales.CreditCard
SET CardNumber_EncryptedbyPassphrase = EncryptByPassPhrase(@PassphraseEnteredByUser
, CardNumber, 1, CONVERT( varbinary, CreditCardID))
WHERE CreditCardID = '3681';
GO

Ver también
DECRYPTBYPASSPHRASE (Transact-SQL )
Jerarquía de cifrado
HASHBYTES (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el hash MD2, MD4, MD5, SHA, SHA1 o SHA2 de su entrada en SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
HASHBYTES ( '<algorithm>', { @input | 'input' } )

<algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512

Argumentos
'<algorithm>'
Identifica el algoritmo hash que se va a utilizar para realizar el hash de la entrada. Es un argumento requerido y
no tiene valor predeterminado. Las comillas simples son necesarias. A partir de SQL Server 2016 (13.x), todos los
algoritmos están en desuso, salvo SHA2_256 y SHA2_512. Los algoritmos antiguos (no recomendados) seguirán
funcionando, pero generarán un evento de desuso.
@input
Especifica una variable que contiene los datos en los que se va a realizar el hash. @input es varchar, nvarchar o
varbinary.
' input '
Especifica una expresión que se evalúa como un carácter o una cadena binaria que se va a aplicar el algoritmo
hash.
La salida se ajusta al algoritmo estándar: 128 bits (16 bytes) para MD2, MD4 y MD5; 160 bits (20 bytes) para
SHA y SHA1; 256 bits (32 bytes) para SHA2_256 y 512 bits (64 bytes) para SHA2_512.
Se aplica a: de SQL Server 2012 (11.x) a SQL Server 2017
En SQL Server 2014 (12.x) y versiones anteriores, los valores de entrada permitidos tienen un límite de 8000
bytes.

Valor devuelto
varbinary (máximo de 8000 bytes)

Ejemplos
A. Devolver el valor hash de una variable
En el siguiente ejemplo se devuelve el hash SHA1 de los datos nvarchar almacenados en la variable @HashThis .
DECLARE @HashThis nvarchar(4000);
SET @HashThis = CONVERT(nvarchar(4000),'dslfdkjLK85kldhnv$n000#knf');
SELECT HASHBYTES('SHA1', @HashThis);

B. Devolver el valor hash de una columna de tabla


En el ejemplo siguiente se devuelve el valor hash SHA1 de los valores de la columna c1 de la tabla Test1 .

CREATE TABLE dbo.Test1 (c1 nvarchar(50));


INSERT dbo.Test1 VALUES ('This is a test.');
INSERT dbo.Test1 VALUES ('This is test 2.');
SELECT HASHBYTES('SHA1', c1) FROM dbo.Test1;

El conjunto de resultados es el siguiente.

-------------------------------------------
0x0E7AAB0B4FF0FD2DFB4F0233E2EE7A26CD08F173
0xF643A82F948DEFB922B12E50B950CEE130A934D6

(2 row(s) affected)

Ver también
Elegir un algoritmo de cifrado
IS_OBJECTSIGNED (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Indica si un objeto está firmado por un certificado o clave asimétrica especificados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IS_OBJECTSIGNED (
'OBJECT', @object_id, @class, @thumbprint
)

Argumentos
'OBJECT'
Tipo de la clase protegible.
@object_id
Valor object_id del objeto que se va a probar. @object_id es de tipo int.
@class
Clase del objeto:
'certificado'
'clave asimétrica'
@class es sysname.
@thumbprint
Huella digital SHA del objeto. @thumbprint es de tipo varbinary(32).

Tipos devueltos
int

Notas
IS_OBJECTSIGNED devuelve los siguientes valores.

VALOR DEVUELTO DESCRIPCIÓN

NULL El objeto no está firmado o no es válido.

0 El objeto está firmado, pero la firma no es válida.

1 El objeto está firmado.


Permisos
Se requiere VIEW DEFINITION sobre el certificado o la clave asimétrica.

Ejemplos
A. Mostrar las propiedades extendidas de una base de datos
En el ejemplo siguiente se prueba si la tabla spt_fallback_db de la base de datos master está firmada por el
certificado de firma de esquema.

USE master;
-- Declare a variable to hold a thumbprint and an object name
DECLARE @thumbprint varbinary(20), @objectname sysname;

-- Populate the thumbprint variable with the thumbprint of


-- the master database schema signing certificate
SELECT @thumbprint = thumbprint
FROM sys.certificates
WHERE name LIKE '%SchemaSigningCertificate%';

-- Populate the object name variable with a table name in master


SELECT @objectname = 'spt_fallback_db';

-- Query to see if the table is signed by the thumbprint


SELECT @objectname AS [object name],
IS_OBJECTSIGNED(
'OBJECT', OBJECT_ID(@objectname), 'certificate', @thumbprint
) AS [Is the object signed?] ;

Ver también
sys.fn_check_object_signatures (Transact-SQL )
KEY_GUID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el GUID de una clave simétrica de la base de datos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
Key_GUID( 'Key_Name' )

Argumentos
' Key_Name '
El nombre de una clave simétrica en la base de datos.

Tipos devueltos
uniqueidentifier

Notas
Si se ha especificado un valor de identidad al crear la clave, su GUID es un hash MD5 de ese valor de identidad. Si
no se ha especificado ningún valor de identidad, el GUID es generado por el servidor.
Si la clave es temporal, su nombre debe comenzar con un signo de número (#).

Permisos
No se requieren permisos para el acceso a las claves temporales, dado que éstas solo están disponibles en la
sesión en la que se crean. Para obtener acceso a una clave que no es temporal, el autor de la llamada necesita
algún permiso en ella. Además no puede tener denegado el permiso VIEW en esa clave.

Ejemplos
En el siguiente ejemplo se devuelve el GUID de una clave simétrica denominada ABerglundKey1 .

SELECT Key_GUID('ABerglundKey1');

Ver también
CREATE SYMMETRIC KEY (Transact-SQL )
sys.symmetric_keys (Transact-SQL )
sys.key_encryptions (Transact-SQL )
KEY_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el Id. de una clave simétrica en la base de datos actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
Key_ID ( 'Key_Name' )

Argumentos
' Key_Name '
El nombre de una clave simétrica en la base de datos.

Tipos devueltos
int

Notas
El nombre de una clave temporal debe comenzar con un signo de número (#).

Permisos
No se requieren permisos para el acceso a las claves temporales, dado que éstas solo están disponibles en la
sesión en la que se crean. Para tener acceso a una clave que no es temporal, el solicitante necesita tener algún
permiso en la clave y no se le debe haber denegado el permiso VIEW en la clave.

Ejemplos
A. Devolver el identificador de una clave simétrica
El ejemplo siguiente devuelve el Id. de una clave denominada ABerglundKey1 .

SELECT KEY_ID('ABerglundKey1');

B. Devolver el identificador de una clave simétrica temporal


El ejemplo siguiente devuelve el Id. de una clave simétrica temporal. Observe que # se antepone al nombre de la
clave.

SELECT KEY_ID('#ABerglundKey2');
Ver también
KEY_GUID (Transact-SQL )
CREATE SYMMETRIC KEY (Transact-SQL )
sys.symmetric_keys (Transact-SQL )
sys.key_encryptions (Transact-SQL )
Jerarquía de cifrado
KEY_NAME (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de la clave simétrica a partir de un GUID de clave simétrica o de texto de cifrado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
KEY_NAME ( ciphertext | key_guid )

Argumentos
ciphertext
Es el texto cifrado por la clave simétrica. cyphertext es de tipo varbinary(8000).
key_guid
Es el GUID de la clave simétrica. key_guid es de tipo uniqueidentifier.

Tipos devueltos
varchar(128)

Permisos
A partir de Resultado de, la visibilidad de los metadatos se limita a los elementos protegibles que son propiedad de
un usuario o sobre los que el usuario tienen algún permiso. Para obtener más información, consulte Metadata
Visibility Configuration.

Ejemplos
A. Mostrar el nombre de una clave simétrica utilizando key_guid
La base de datos maestra contiene una clave simétrica denominada ##MS_ServiceMasterKey##. En el ejemplo
siguiente se obtiene el GUID de esa clave a partir de la vista de administración dinámica sys.symmetric_keys, se
asigna a una variable y, a continuación, se pasa esa variable a la función KEY_NAME para mostrar la forma de
devolver el nombre que corresponde al GUID.

USE master;
GO
DECLARE @guid uniqueidentifier ;
SELECT @guid = key_guid FROM sys.symmetric_keys
WHERE name = '##MS_ServiceMasterKey##' ;
-- Demonstration of passing a GUID to KEY_NAME to receive a name
SELECT KEY_NAME(@guid) AS [Name of Key];

B. Mostrar el nombre de una clave simétrica utilizando el texto de cifrado


En el ejemplo siguiente se muestra el proceso completo de crear una clave simétrica y rellenar los datos en una
tabla. A continuación, el ejemplo muestra cómo KEY_NAME devuelve el nombre de la clave al pasar el texto
cifrado.

-- Create a symmetric key


CREATE SYMMETRIC KEY TestSymKey
WITH ALGORITHM = AES_128,
KEY_SOURCE = 'The square of the hypotenuse is equal to the sum of the squares of the sides',
IDENTITY_VALUE = 'Pythagoras'
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y' ;
GO
-- Create a table for the demonstration
CREATE TABLE DemoKey
(IDCol int IDENTITY PRIMARY KEY,
SecretCol varbinary(256) NOT NULL)
GO
-- Open the symmetric key if not already open
OPEN SYMMETRIC KEY TestSymKey
DECRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y';
GO
-- Insert a row into the DemoKey table
DECLARE @key_GUID uniqueidentifier;
SELECT @key_GUID = key_guid FROM sys.symmetric_keys
WHERE name LIKE 'TestSymKey' ;
INSERT INTO DemoKey(SecretCol)
VALUES ( ENCRYPTBYKEY (@key_GUID, 'EncryptedText'))
GO
-- Verify the DemoKey data
SELECT * FROM DemoKey;
GO
-- Decrypt the data
DECLARE @ciphertext varbinary(256);
SELECT @ciphertext = SecretCol
FROM DemoKey WHERE IDCol = 1 ;
SELECT CAST (
DECRYPTBYKEY( @ciphertext)
AS varchar(100) ) AS SecretText ;
-- Use KEY_NAME to view the name of the key
SELECT KEY_NAME(@ciphertext) AS [Name of Key] ;

Ver también
sys.symmetric_keys (Transact-SQL )
ENCRYPTBYKEY (Transact-SQL )
DECRYPTBYKEYAUTOASYMKEY (Transact-SQL )
SIGNBYASYMKEY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Firma texto simple con una clave asimétrica
Convenciones de sintaxis de Transact-SQL

Sintaxis
SignByAsymKey( Asym_Key_ID , @plaintext [ , 'password' ] )

Argumentos
Asym_Key_ID
Es el identificador de una clave asimétrica en la base de datos actual. Asym_Key_ID es int.
@plaintext
Variable de tipo nvarchar, char, varchar o nchar que contiene datos que se firmarán con la clave asimétrica.
password
Especifica la antigua contraseña con la que está protegida la clave privada. password es nvarchar(128).

Tipos devueltos
varbinary con un tamaño máximo de 8000 bytes.

Notas
Requiere permiso CONTROL en la clave asimétrica.

Ejemplos
En el ejemplo siguiente se crea una tabla, SignedData04 , en la que se almacenará texto simple y su firma. A
continuación se inserta un registro en la tabla, firmado con la clave asimétrica PrimeKey , que se descifra primero
con la contraseña 'pGFD4bb925DGvbd2439587y' .
-- Create a table in which to store the data
CREATE TABLE [SignedData04](Description nvarchar(max), Data nvarchar(max), DataSignature varbinary(8000));
GO
-- Store data together with its signature
DECLARE @clear_text_data nvarchar(max);
set @clear_text_data = N'Important numbers 2, 3, 5, 7, 11, 13, 17,
19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
83, 89, 97';
INSERT INTO [SignedData04]
VALUES( N'data encrypted by asymmetric key ''PrimeKey''',
@clear_text_data, SignByAsymKey( AsymKey_Id( 'PrimeKey' ),
@clear_text_data, N'pGFD4bb925DGvbd2439587y' ));
GO

Ver también
ASYMKEY_ID (Transact-SQL )
VERIFYSIGNEDBYASYMKEY (Transact-SQL )
CREATE ASYMMETRIC KEY (Transact-SQL )
ALTER ASYMMETRIC KEY (Transact-SQL )
DROP ASYMMETRIC KEY (Transact-SQL )
Jerarquía de cifrado
SIGNBYCERT (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Firma texto con un certificado y devuelve la firma.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SignByCert ( certificate_ID , @cleartext [ , 'password' ] )

Argumentos
certificate_ID
Id. de un certificado de la base de datos actual. certificate_ID es int.
@cleartext
Es una variable de tipo nvarchar, char, varchar o nchar que contiene los datos que se van a firmar.
' password '
Es la contraseña con la que se cifró la clave privada del certificado. password es nvarchar(128).

Tipos devueltos
varbinary con un tamaño máximo de 8000 bytes.

Notas
Requiere el permiso CONTROL en el certificado.

Ejemplos
En el siguiente ejemplo se firma el texto de @SensitiveData con el certificado ABerglundCert07 tras descifrar el
certificado con contraseña "pGFD4bb925DGvbd2439587y". A continuación, se inserta el texto sin cifrar y la firma
en la tabla SignedData04 .

DECLARE @SensitiveData nvarchar(max);


SET @SensitiveData = N'Saddle Price Points are
2, 3, 5, 7, 11, 13, 17, 19, 23, 29';
INSERT INTO [SignedData04]
VALUES( N'data signed by certificate ''ABerglundCert07''',
@SensitiveData, SignByCert( Cert_Id( 'ABerglundCert07' ),
@SensitiveData, N'pGFD4bb925DGvbd2439587y' ));
GO

Ver también
VERIFYSIGNEDBYCERT (Transact-SQL )
CERT_ID (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL )
ALTER CERTIFICATE (Transact-SQL )
DROP CERTIFICATE (Transact-SQL )
Jerarquía de cifrado
SYMKEYPROPERTY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el algoritmo de una clave simétrica creada a partir de un módulo EKM.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SYMKEYPROPERTY ( Key_ID , 'algorithm_desc' | 'string_sid' | 'sid' )

Argumentos
Key_ID
Es el valor Key_ID de una clave asimétrica de la base de datos. Para buscar el valor Key_ID cuando solo se conoce
el nombre de la clave, utilice SYMKEY_ID. Key_ID es un tipo de datos int.
' algorithm_desc '
Especifica que la salida devuelve la descripción del algoritmo de la clave simétrica. Solo está disponible para las
claves simétricas creadas a partir de un módulo EKM.

Tipos devueltos
sql_variant

Permisos
Es necesario tener algún permiso sobre la clave simétrica y que el autor de la llamada no tenga denegado el
permiso VIEW sobre la clave simétrica.

Ejemplos
En el ejemplo siguiente se devuelve el algoritmo de la clave simétrica con un valor 256 para Key_ID.

SELECT SYMKEYPROPERTY(256, 'algorithm_desc') AS Algorithm ;


GO

Ver también
ASYMKEY_ID (Transact-SQL )
ALTER SYMMETRIC KEY (Transact-SQL )
DROP SYMMETRIC KEY (Transact-SQL )
Jerarquía de cifrado
sys.symmetric_keys (Transact-SQL )
Vistas de catálogo de seguridad (Transact-SQL )
KEY_ID (Transact-SQL )
ASYMKEYPROPERTY (Transact-SQL )
VERIFYSIGNEDBYCERT (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Comprueba si se han cambiado los datos firmados digitalmente desde que se firmaron.
Convenciones de sintaxis de Transact-SQL

Sintaxis
VerifySignedByCert( Cert_ID , signed_data , signature )

Argumentos
Cert_ID
Es el identificador de un certificado de la base de datos. Cert_ID es int.
signed_data
Es una variable de tipo nvarchar, char, varchar o nchar que contiene los datos que se han firmado con un
certificado.
signature
Es la firma adjunta a los datos firmados. signature es varbinary.

Tipos devueltos
int
Devuelve 1 cuando no se han cambiado los datos firmados; de lo contrario, devuelve 0.

Notas
VerifySignedBycert descifra la firma de los datos utilizando la clave pública del certificado especificado y
compara el valor descifrado con un hash MD5 de los datos calculado recientemente. Si los valores coinciden, se
confirma que la firma es válida.

Permisos
Requiere el permiso VIEW DEFINITION en el certificado.

Ejemplos
A. Comprobar que los datos firmados no se han manipulado
En el siguiente ejemplo se comprueba si la información en Signed_Data ha cambiado desde que se firmó con el
certificado denominado Shipping04 . La firma se almacena en DataSignature . El certificado, Shipping04 , se pasa a
Cert_ID , que devuelve el identificador del certificado en la base de datos. Si VerifySignedByCert devuelve 1, la
firma es correcta. Si VerifySignedByCert devuelve 0, los datos de Signed_Data no son los datos que se usaron
para generar DataSignature . En este caso, Signed_Data se ha cambiado desde que se firmó o Signed_Data se
firmó con otro certificado.

SELECT Data, VerifySignedByCert( Cert_Id( 'Shipping04' ),


Signed_Data, DataSignature ) AS IsSignatureValid
FROM [AdventureWorks2012].[SignedData04]
WHERE Description = N'data signed by certificate ''Shipping04''';
GO

B. Devolver solo los registros que tienen una firma válida


Esta consulta solo devuelve los registros que no han cambiado desde que se firmaron con el certificado
Shipping04 .

SELECT Data FROM [AdventureWorks2012].[SignedData04]


WHERE VerifySignedByCert( Cert_Id( 'Shipping04' ), Data,
DataSignature ) = 1
AND Description = N'data signed by certificate ''Shipping04''';
GO

Ver también
CERT_ID (Transact-SQL )
SIGNBYCERT (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL )
ALTER CERTIFICATE (Transact-SQL )
DROP CERTIFICATE (Transact-SQL )
BACKUP CERTIFICATE (Transact-SQL )
Jerarquía de cifrado
VERIFYSIGNEDBYASYMKEY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Comprueba si se han cambiado los datos firmados digitalmente desde que se firmaron.
Convenciones de sintaxis de Transact-SQL

Sintaxis
VerifySignedByAsymKey( Asym_Key_ID , clear_text , signature )

Argumentos
Asym_Key_ID
Es el identificador de un certificado de clave asimétrica en la base de datos.
clear_text
Son los datos de texto no cifrado que se van a comprobar.
signature
Es la firma adjunta a los datos firmados. signature es varbinary.

Tipos devueltos
int
Devuelve 1 cuando las firmas coinciden; de lo contrario devuelve 0.

Notas
VerifySignedByAsymKey descifra la firma de los datos utilizando la clave pública de la clave asimétrica
especificada y compara el valor descifrado con un hash MD5 calculado recientemente de los datos. Si los valores
coinciden, se confirma que la firma es válida.

Permisos
Requiere el permiso VIEW DEFINITION en la clave asimétrica.

Ejemplos
A. Comprobar datos con una firma válida
En el siguiente ejemplo se devuelve 1 si los datos seleccionados no se han cambiado desde que se firmaron con la
clave asimétrica WillisKey74 . El ejemplo devuelve 0 si los datos no se han modificado.
SELECT Data,
VerifySignedByAsymKey( AsymKey_Id( 'WillisKey74' ), SignedData,
DataSignature ) as IsSignatureValid
FROM [AdventureWorks2012].[SignedData04]
WHERE Description = N'data encrypted by asymmetric key ''WillisKey74''';
GO
RETURN;

B. Devolver un conjunto de resultados que contiene datos con una firma válida
En el siguiente ejemplo se devuelven las filas de SignedData04 que contienen datos que no se han cambiado
desde que se firmaron con la clave asimétrica WillisKey74 . El ejemplo llama a la función AsymKey_ID para
obtener el identificador de la clave asimétrica de la base de datos.

SELECT Data
FROM [AdventureWorks2012].[SignedData04]
WHERE VerifySignedByAsymKey( AsymKey_Id( 'WillisKey74' ), Data,
DataSignature ) = 1
AND Description = N'data encrypted by asymmetric key ''WillisKey74''';
GO

Ver también
ASYMKEY_ID (Transact-SQL )
SIGNBYASYMKEY (Transact-SQL )
CREATE ASYMMETRIC KEY (Transact-SQL )
ALTER ASYMMETRIC KEY (Transact-SQL )
DROP ASYMMETRIC KEY (Transact-SQL )
Jerarquía de cifrado
Funciones del cursor (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Estas funciones escalares devuelven información sobre los cursores:

@@CURSOR_ROWS CURSOR_STATUS

@@FETCH_STATUS

Todas las funciones del cursor son no deterministas. En otras palabras, estas funciones no siempre devuelven el
mismo resultado cada vez que se ejecutan, incluso con el mismo conjunto de valores de entrada. Vea Funciones
deterministas y no deterministas para obtener más información sobre el determinismo de las funciones.

Vea también
Funciones integradas (Transact-SQL )
@@CURSOR_ROWS (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de filas certificadas que se encuentran en el último cursor abierto en la conexión. Para mejorar
el rendimiento, SQL Server puede rellenar asincrónicamente los cursores estáticos y de conjunto de claves de gran
tamaño. Se puede llamar a @@CURSOR_ROWS para determinar que el número de filas que cumplan las condiciones del
cursor se recuperen en el momento en que se llama a @@CURSOR_ROWS.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@CURSOR_ROWS

Tipos de valores devueltos


integer

Valor devuelto
VALOR DEVUELTO DESCRIPCIÓN

-m El cursor se rellena de forma asincrónica. El valor devuelto (-m)


es el número de filas que el conjunto de claves contiene
actualmente.

-1 El cursor es dinámico. Como los cursores dinámicos reflejan


todos los cambios, el número de filas correspondientes al
cursor cambia constantemente. El cursor no necesariamente
recupera todas las filas calificadas.

0 No se han abierto cursores, no hay filas calificadas para el


último cursor abierto, o éste se ha cerrado o su asignación se
ha cancelado.

n El cursor está completamente relleno. El valor devuelto (n) es


el número total de filas del cursor.

Notas
@@CURSOR_ROWS devuelve un número negativo si el último cursor se ha abierto de forma asincrónica. Los cursores
controlados por conjunto de claves o cursores estáticos se abren de forma asincrónica si el valor umbral del cursor
de sp_configure es mayor que 0 y el número de filas del conjunto de resultados del cursor es mayor que su valor
umbral.

Ejemplos
Este ejemplo declara primero un cursor y luego usa SELECT para mostrar el valor de @@CURSOR_ROWS . La opción
tiene el valor 0 antes de que se abra el cursor y luego tiene el valor -1 para indicar que el conjunto de claves del
cursor se rellena de forma asincrónica.

USE AdventureWorks2012;
GO
SELECT @@CURSOR_ROWS;
DECLARE Name_Cursor CURSOR FOR
SELECT LastName ,@@CURSOR_ROWS FROM Person.Person;
OPEN Name_Cursor;
FETCH NEXT FROM Name_Cursor;
SELECT @@CURSOR_ROWS;
CLOSE Name_Cursor;
DEALLOCATE Name_Cursor;
GO

Los conjuntos de resultados son los siguientes.

-----------
0

LastName
---------------
Sanchez

-----------
-1

Vea también
Funciones del cursor (Transact-SQL )
OPEN (Transact-SQL )
@@FETCH_STATUS (Transact-SQL)
19/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el estado de la última instrucción FETCH del cursor emitida contra cualquier cursor abierto
actualmente por la conexión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@FETCH_STATUS

Tipo devuelto
integer

Valor devuelto
VALOR DEVUELTO DESCRIPCIÓN

0 La instrucción FETCH se ejecutó correctamente.

-1 La instrucción FETCH no se ejecutó correctamente o la fila


estaba más allá del conjunto de resultados.

-2 Falta la fila capturada.

-9 El cursor no está realizando ninguna operación de búsqueda.

Notas
Como @@FETCH_STATUS es global para todos los cursores de una conexión, úselo con cuidado. Después de ejecutar
una instrucción FETCH, la prueba de @@FETCH_STATUS se debe realizar antes de que se ejecute otra instrucción
FETCH sobre otro cursor. @@FETCH_STATUS no está definido antes de producirse las capturas en la conexión.
Por ejemplo, supongamos que un usuario ejecuta una instrucción FETCH sobre un cursor y a continuación llama a
un procedimiento almacenado que abre y procesa los resultados de otro cursor. Cuando devuelve el control desde
el procedimiento almacenado llamado, @@FETCH_STATUS refleja la última instrucción FETCH ejecutada dentro de ese
procedimiento almacenado, no la ejecutada antes de llamar al procedimiento almacenado.
Para recuperar el último estado capturado de un cursor específico, realice una consulta en la columna fetch_status
de la función de administración dinámica sys.dm_exec_cursors.

Ejemplos
En este ejemplo se usa @@FETCH_STATUS para controlar las actividades del cursor en un bucle WHILE .
DECLARE Employee_Cursor CURSOR FOR
SELECT BusinessEntityID, JobTitle
FROM AdventureWorks2012.HumanResources.Employee;
OPEN Employee_Cursor;
FETCH NEXT FROM Employee_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM Employee_Cursor;
END;
CLOSE Employee_Cursor;
DEALLOCATE Employee_Cursor;
GO

Ver también
Funciones del cursor (Transact-SQL )
FETCH (Transact-SQL )
CURSOR_STATUS (Transact-SQL)
18/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Para un parámetro en concreto, CURSOR_STATUS muestra si una declaración de cursor ha devuelto un cursor y un
conjunto de resultados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CURSOR_STATUS
(
{ 'local' , 'cursor_name' }
| { 'global' , 'cursor_name' }
| { 'variable' , 'cursor_variable' }
)

Argumentos
'local'
Especifica una constante que indica que el origen del cursor es un nombre de cursor local.
'cursor_name'
El nombre del cursor. Un nombre de cursor debe ajustarse a las reglas de los identificadores de base de datos.
'global'
Especifica una constante que indica que el origen del cursor es un nombre de cursor global.
'variable'
Especifica una constante que indica que el origen del cursor es una variable local.
'cursor_variable'
El nombre de la variable de cursor. Una variable de cursor debe definirse mediante el tipo de datos cursor.

Tipos de valores devueltos


smallint

VALOR DEVUELTO NOMBRE DE CURSOR VARIABLE DE CURSOR

1 El conjunto de resultados del cursor El cursor asignado a esta variable está


tiene al menos una fila. abierto.

Para los cursores INSENSITIVE y de Para los cursores INSENSITIVE y de


conjunto de claves, el conjunto de conjunto de claves, el conjunto de
resultados tiene al menos una fila. resultados tiene al menos una fila.

Para los cursores dinámicos, el conjunto Para los cursores dinámicos, el conjunto
de resultados puede tener cero, una o de resultados puede tener cero, una o
más filas. más filas.
VALOR DEVUELTO NOMBRE DE CURSOR VARIABLE DE CURSOR

0 El conjunto de resultados del cursor El cursor asignado a esta variable está


está vacío.* abierto, pero el conjunto de resultados
está definitivamente vacío.*

-1 El cursor está cerrado. El cursor asignado a esta variable está


cerrado.

-2 No aplicable. Tiene una de estas posibilidades:

El procedimiento llamado anteriormente


no asignó ningún cursor a esta variable
OUTPUT.

El procedimiento asignado
anteriormente asignó un cursor a esta
variable OUTPUT, pero el cursor se
encontraba en un estado cerrado al
concluir el procedimiento. Por tanto, se
cancela la asignación del cursor y no se
devuelve al procedimiento que hace la
llamada.

No se asigna ningún cursor a la variable


declarada de cursor.

-3 No existe ningún cursor con el nombre No existe ninguna variable de cursor


indicado. con el nombre indicado o, si existe, aún
no tiene ningún cursor asignado.

*Los cursores dinámicos no devuelven nunca este resultado.

Ejemplos
Este ejemplo usa la función CURSOR_STATUS para mostrar el estado de un cursor después de su declaración, una vez
abierto y una vez cerrado.
CREATE TABLE #TMP
(
ii int
)
GO

INSERT INTO #TMP(ii) VALUES(1)


INSERT INTO #TMP(ii) VALUES(2)
INSERT INTO #TMP(ii) VALUES(3)

GO

--Create a cursor.
DECLARE cur CURSOR
FOR SELECT * FROM #TMP

--Display the status of the cursor before and after opening


--closing the cursor.

SELECT CURSOR_STATUS('global','cur') AS 'After declare'


OPEN cur
SELECT CURSOR_STATUS('global','cur') AS 'After Open'
CLOSE cur
SELECT CURSOR_STATUS('global','cur') AS 'After Close'

--Remove the cursor.


DEALLOCATE cur

--Drop the table.


DROP TABLE #TMP

El conjunto de resultados es el siguiente.

After declare
---------------
-1

After Open
----------
1

After Close
-----------
-1

Vea también
Funciones del cursor (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de tipos de datos (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Estas funciones escalares devuelven información sobre distintos valores de tipo de datos.

En esta sección

DATALENGTH (Transact-SQL) IDENT_SEED (Transact-SQL)

IDENT_CURRENT (Transact-SQL) IDENTITY (Function) (Transact-SQL)

IDENT_INCR (Transact-SQL) SQL_VARIANT_PROPERTY (Transact-SQL)


DATALENGTH (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de bytes usados para representar cualquier expresión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATALENGTH ( expression )

Argumentos
expression
Una expression de cualquier tipo de datos.

Tipos de valores devueltos


bigint si expression tiene el tipo de datos nvarchar(max), varbinary(max) o varchar(max); en caso contrario,
int.

Notas
DATALENGTH es muy útil cuando se usa con tipos de datos
imagen
ntext
nvarchar
texto
varbinary
y
varchar
porque estos tipos de datos pueden almacenar datos de longitud variable.
Para un valor NULL, DATALENGTH devuelve NULL.

NOTE
Los niveles de compatibilidad pueden afectar a los valores devueltos. Vea Nivel de compatibilidad de ALTER DATABASE
(Transact-SQL) para más información sobre los niveles de compatibilidad.

Ejemplos
En este ejemplo se busca la longitud de la columna Name en la tabla Product :
-- Uses AdventureWorks

SELECT length = DATALENGTH(EnglishProductName), EnglishProductName


FROM dbo.DimProduct
ORDER BY EnglishProductName;
GO

Vea también
LEN (Transact-SQL )
CAST y CONVERT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones del sistema (Transact-SQL )
IDENT_CURRENT (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el último valor de identidad generado para una tabla o vista especificadas. El último valor de identidad
generado puede ser para cualquier sesión y cualquier ámbito.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IDENT_CURRENT( 'table_name' )

Argumentos
table_name
Es el nombre de la tabla cuyo valor de identidad se devuelve. table_name es varchar, sin ningún valor
predeterminado.

Tipos devueltos
numeric(38,0)

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le
haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como
IDENT_CURRENT, pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener
más información, consulte Metadata Visibility Configuration.

Notas
IDENT_CURRENT es similar a las funciones de identidad SCOPE_IDENTITY y @@IDENTITY de SQL Server
2000 (8.x). Las tres funciones devuelven los últimos valores de identidad generados. Pero la definición de últimos
valores de identidad para cada una de estas funciones es diferente en cuanto al ámbito y la sesión:
IDENT_CURRENT devuelve el último valor de identidad generado para una tabla específica en cualquier
sesión y cualquier ámbito.
@@IDENTITY devuelve el último valor de identidad generado para cualquier tabla en la sesión actual, en
todos los ámbitos.
SCOPE_IDENTITY devuelve el último valor de identidad generado para cualquier tabla en la sesión y el
ámbito actuales.
Cuando el valor de IDENT_CURRENT es NULL (porque la tabla nunca ha contenido filas ni ha sido
truncada), la función IDENT_CURRENT devuelve el valor de inicialización.
Las instrucciones y transacciones con errores pueden cambiar la identidad actual de una tabla y crear
huecos en los valores de columna de identidad. El valor de identidad jamás se revierte, aun cuando no se
haya confirmado la transacción que intentó insertar el valor en la tabla. Por ejemplo, si se produce un error
en una instrucción INSERT debido a una infracción de tipo IGNORE_DUP_KEY, el valor de identidad
actual de la tabla se sigue incrementando.
Tenga cuidado al usar IDENT_CURRENT para predecir el siguiente valor de identidad generado. El valor
generado real puede ser diferente de IDENT_CURRENT más IDENT_INCR a causa de las inserciones
realizadas por otras sesiones.

Ejemplos
A. Devolver el último valor de identidad generado para una tabla especificada
En el ejemplo siguiente se devuelve el último valor de identidad generado para la tabla Person.Address en la base
de datos AdventureWorks2012 .

USE AdventureWorks2012;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO

B. Comparar valores de identidad devueltos por IDENT_CURRENT, @@IDENTITY y SCOPE_IDENTITY


En el ejemplo siguiente se muestran los distintos valores de identidad devueltos por IDENT_CURRENT , @@IDENTITY
y SCOPE_IDENTITY .
USE AdventureWorks2012;
GO
IF OBJECT_ID(N't6', N'U') IS NOT NULL
DROP TABLE t6;
GO
IF OBJECT_ID(N't7', N'U') IS NOT NULL
DROP TABLE t7;
GO
CREATE TABLE t6(id int IDENTITY);
CREATE TABLE t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT
AS
BEGIN
INSERT t7 DEFAULT VALUES
END;
GO
--End of trigger definition

SELECT id FROM t6;


--IDs empty.

SELECT id FROM t7;


--ID is empty.

--Do the following in Session 1


INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/

SELECT SCOPE_IDENTITY();
/* Returns the value 1. This was inserted by the
INSERT statement two statements before this query.*/

SELECT IDENT_CURRENT('t7');
/* Returns value inserted into t7, that is in the trigger.*/

SELECT IDENT_CURRENT('t6');
/* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/

-- Do the following in Session 2.


SELECT @@IDENTITY;
/* Returns NULL because there has been no INSERT action
up to this point in this session.*/

SELECT SCOPE_IDENTITY();
/* Returns NULL because there has been no INSERT action
up to this point in this scope in this session.*/

SELECT IDENT_CURRENT('t7');
/* Returns the last value inserted into t7.*/

Ver también
@@IDENTITY (Transact-SQL )
SCOPE_IDENTITY (Transact-SQL )
IDENT_INCR (Transact-SQL )
IDENT_SEED (Transact-SQL )
Expresiones (Transact-SQL )
Funciones del sistema (Transact-SQL )
IDENT_INCR (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor del incremento (devuelto como numeric (@@ MAXPRECISION,0)) especificado durante la
creación de una columna de identidad en una tabla o vista que contiene una columna de identidad.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IDENT_INCR ( 'table_or_view' )

Argumentos
' table_or_view '
Se trata de una expresión que especifica la tabla o vista en la que se va a comprobar un valor de incremento de
identidad válido. table_or_view puede ser una constante de cadena de caracteres entre comillas, un nombre de
variable, un nombre de función o un nombre de columna. table_or_view es char, nchar, varchar o nvarchar.

Tipos devueltos
numeric

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le
haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como
IDENT_INCR, pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más
información, consulte Metadata Visibility Configuration.

Ejemplos
A. Devolver el valor de incremento de una tabla especificada
En el ejemplo siguiente se devuelve el valor de incremento de la tabla Person.Address en la base de datos
AdventureWorks2012.

USE AdventureWorks2012;
GO
SELECT IDENT_INCR('Person.Address') AS Identity_Increment;
GO

B. Devolver el valor de incremento de varias tablas


En el siguiente ejemplo se devuelven las tablas de la base de datos AdventureWorks2012 que contienen una
columna de identidad con un valor de incremento.

USE AdventureWorks2012;
GO
SELECT TABLE_SCHEMA, TABLE_NAME,
IDENT_INCR(TABLE_SCHEMA + '.' + TABLE_NAME) AS IDENT_INCR
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_INCR(TABLE_SCHEMA + '.' + TABLE_NAME) IS NOT NULL;

A continuación se muestra un conjunto parcial de resultados.

TABLE_SCHEMA TABLE_NAME IDENT_INCR


------------ ------------------------ ----------
Person Address 1
Production ProductReview 1
Production TransactionHistory 1
Person AddressType 1
Production ProductSubcategory 1
Person vAdditionalContactInfo 1
dbo AWBuildVersion 1
Production BillOfMaterials 1

Ver también
Expresiones (Transact-SQL )
Funciones del sistema (Transact-SQL )
IDENT_CURRENT (Transact-SQL )
IDENT_SEED (Transact-SQL )
DBCC CHECKIDENT (Transact-SQL )
sys.identity_columns (Transact-SQL )
IDENT_SEED (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de inicialización original (devuelto como numeric(@@ MAXPRECISION,0)) que se especificó
cuando se creó una columna de identidad en una tabla o una vista. La acción de cambiar el valor actual de una
columna de identidad utilizando DBCC CHECKIDENT no cambia el valor devuelto por esta función.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IDENT_SEED ( 'table_or_view' )

Argumentos
' table_or_view '
Se trata de una expresión que especifica la tabla o vista en la que se va a comprobar un valor de inicialización de
identidad. table_or_view puede ser una constante de cadena de caracteres entre comillas, un nombre de variable,
un nombre de función o un nombre de columna. table_or_view es char, nchar, varchar o nvarchar.

Tipos devueltos
numeric

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le
haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como
IDENT_SEED, pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más
información, consulte Metadata Visibility Configuration.

Ejemplos
A. Devolver el valor de inicialización de una tabla especificada
En el ejemplo siguiente se devuelve el valor de inicialización de la tabla Person.Address en la base de datos
AdventureWorks2012.

USE AdventureWorks2012;
GO
SELECT IDENT_SEED('Person.Address') AS Identity_Seed;
GO

B. Devolver el valor de inicialización de varias tablas


En este ejemplo se devuelven las tablas de la base de datos AdventureWorks2012 que contienen una columna de
identidad con un valor de inicialización.

USE AdventureWorks2012;
GO
SELECT TABLE_SCHEMA, TABLE_NAME,
IDENT_SEED(TABLE_SCHEMA + '.' + TABLE_NAME) AS IDENT_SEED
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_SEED(TABLE_SCHEMA + '.' + TABLE_NAME) IS NOT NULL;
GO

A continuación se muestra un conjunto parcial de resultados.

TABLE_SCHEMA TABLE_NAME IDENT_SEED


------------ --------------------------- -----------
Person Address 1
Production ProductReview 1
Production TransactionHistory 100000
Person AddressType 1
Production ProductSubcategory 1
Person vAdditionalContactInfo 1
dbo AWBuildVersion 1

Ver también
Expresiones (Transact-SQL )
Funciones del sistema (Transact-SQL )
IDENT_CURRENT (Transact-SQL )
IDENT_INCR (Transact-SQL )
DBCC CHECKIDENT (Transact-SQL )
sys.identity_columns (Transact-SQL )
IDENTITY (Función) (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Solo se usa en una instrucción SELECT con una cláusula INTO table para insertar una columna de identidad en
una nueva tabla. Aunque es similar, la función IDENTITY no es la propiedad IDENTITY que se utiliza con CREATE
TABLE y ALTER TABLE.

NOTE
Para crear un número que se incremente automáticamente y que se pueda usar en varias tablas, o que se pueda llamar
desde las aplicaciones sin hacer referencia a ninguna tabla, vea Números de secuencia.

Convenciones de sintaxis de Transact-SQL

Sintaxis
IDENTITY (data_type [ , seed , increment ] ) AS column_name

Argumentos
data_type
Se trata del tipo de datos de la columna de identidad. Los tipos de datos válidos para una columna de identidad
son cualquier tipo de datos de la categoría de los enteros, excepto el tipo de datos bit o el tipo de datos decimal.
seed
Se trata del valor entero que se asignará a la primera fila de la tabla. A cada fila siguiente se le asigna el siguiente
valor de identidad, que es igual al último valor IDENTITY más el valor de increment. Si no se especifica seed ni
increment, el valor predeterminado de ambos es 1.
increment
Se trata del incremento que se debe agregar al valor de seed en las sucesivas filas de la tabla.
column_name
Se trata del nombre de la columna que se va a insertar en la nueva tabla.

Tipos devueltos
Devuelve lo mismo que data_type.

Notas
Debido a que esta función crea una columna en una tabla, se debe especificar un nombre para la columna en la
lista de selección de una de las formas siguientes:
--(1)
SELECT IDENTITY(int, 1,1) AS ID_Num
INTO NewTable
FROM OldTable;

--(2)
SELECT ID_Num = IDENTITY(int, 1, 1)
INTO NewTable
FROM OldTable;

Ejemplos
En este ejemplo se insertan todas las filas de la tabla Contact de la base de datos AdventureWorks2012 en una
nueva tabla denominada NewContact . La función IDENTITY se utiliza para iniciar los números de identificación a
partir de 100 en lugar de 1 en la tabla NewContact .

USE AdventureWorks2012;
GO
IF OBJECT_ID (N'Person.NewContact', N'U') IS NOT NULL
DROP TABLE Person.NewContact;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY BULK_LOGGED;
GO
SELECT IDENTITY(smallint, 100, 1) AS ContactNum,
FirstName AS First,
LastName AS Last
INTO Person.NewContact
FROM Person.Person;
GO
ALTER DATABASE AdventureWorks2012 SET RECOVERY FULL;
GO
SELECT ContactNum, First, Last FROM Person.NewContact;
GO

Ver también
CREATE TABLE (Transact-SQL )
@@IDENTITY (Transact-SQL )
IDENTITY (propiedad) (Transact-SQL )
SELECT @local_variable (Transact-SQL )
DBCC CHECKIDENT (Transact-SQL )
sys.identity_columns (Transact-SQL )
SQL_VARIANT_PROPERTY (Transact-SQL)
18/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el tipo de datos base y otra información sobre un valor sql_variant.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SQL_VARIANT_PROPERTY ( expression , property )

Argumentos
expression
Es una expresión de tipo sql_variant.
property
Contiene el nombre de la propiedad sql_variant para la que se proporciona la información. property es varchar(
128 ) y puede ser cualquiera de los siguientes valores:

VALOR DESCRIPCIÓN TIPO BASE DE SQL_VARIANT DEVUELTO


VALOR DESCRIPCIÓN TIPO BASE DE SQL_VARIANT DEVUELTO

BaseType Tipo de datos de SQL Server, como: sysname

bigint NULL = La entrada no es válida.

binario

char

date

datetime

datetime2

datetimeoffset

decimal

float

int

money

nchar

numeric

nvarchar

real

smalldatetime

smallint

smallmoney

time

tinyint

uniqueidentifier

varbinary

varchar
VALOR DESCRIPCIÓN TIPO BASE DE SQL_VARIANT DEVUELTO

Precisión Número de dígitos del tipo de datos int


base numérico:
NULL = La entrada no es válida.
datetime = 23

smalldatetime = 16

float = 53

real = 24

decimal (p,s) y numeric (p,s) = p

money = 19

smallmoney = 10

bigint = 19

int = 10

smallint = 5

tinyint = 3

bit = 1

Los demás tipos = 0

Escala Número de dígitos a la derecha del int


separador decimal del tipo de datos
base numérico: NULL = La entrada no es válida.

decimal (p,s) y numeric (p,s) = s

money y smallmoney = 4

datetime = 3

Los demás tipos = 0

TotalBytes Número de bytes necesario para int


contener los metadatos y los datos del
valor. Esta información puede resultar NULL = La entrada no es válida.
útil al comprobar el tamaño máximo de
los datos en una columna sql_variant.
Si el valor es superior a 900, se produce
un error en la creación del índice.

Intercalación Representa la intercalación del valor sysname


concreto de sql_variant.
NULL = La entrada no es válida.

MaxLength Longitud máxima del tipo de datos, en int


bytes. Por ejemplo, MaxLength de
nvarchar( 50 ) es 100 y MaxLength NULL = La entrada no es válida.
de int, 4.
Tipos devueltos
sql_variant

Ejemplos
A. Usar un tipo de datos sql_variant en una tabla
En el siguiente ejemplo se recupera la información de SQL_VARIANT_PROPERTY relativa al valor de colA 46279.1 ,
donde colB = 1689 , siempre que tableA tenga colA de tipo sql_variant y colB .

CREATE TABLE tableA(colA sql_variant, colB int)


INSERT INTO tableA values ( cast (46279.1 as decimal(8,2)), 1689)
SELECT SQL_VARIANT_PROPERTY(colA,'BaseType') AS 'Base Type',
SQL_VARIANT_PROPERTY(colA,'Precision') AS 'Precision',
SQL_VARIANT_PROPERTY(colA,'Scale') AS 'Scale'
FROM tableA
WHERE colB = 1689

El conjunto de resultados es el siguiente. Tenga en cuenta que cada uno de estos tres valores es sql_variant.

Base Type Precision Scale


--------- --------- -----
decimal 8 2

(1 row(s) affected)

B. Usar un tipo de datos sql_variant como una variable


En el siguiente ejemplo se recupera información de SQL_VARIANT_PROPERTY sobre una variable denominada @v1.

DECLARE @v1 sql_variant;


SET @v1 = 'ABC';
SELECT @v1;
SELECT SQL_VARIANT_PROPERTY(@v1, 'BaseType');
SELECT SQL_VARIANT_PROPERTY(@v1, 'MaxLength');

Ver también
sql_variant (Transact-SQL )
Tipos de datos y funciones de fecha y hora
(Transact-SQL)
18/07/2018 • 15 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL
Data Warehouse Almacenamiento de datos paralelos
En las secciones de este tema se describen todos los tipos de datos y funciones de fecha y hora de Transact-
SQL.
Tipos de datos de fecha y hora
Funciones de fecha y hora
Función que devuelve valores de fecha y hora del sistema
Funciones que devuelven partes de fecha y hora
Funciones que devuelven valores de fecha y hora de sus elementos
Funciones que devuelven valores de diferencia de fecha y hora
Funciones que modifican valores de fecha y hora
Funciones que establecen o devuelven funciones de formato de sesión
Funciones que validan valores de fecha y hora
Temas relacionados con la fecha y hora

Tipos de datos de fecha y hora


En la tabla siguiente se muestran los tipos de datos de fecha y hora de Transact-SQL:

PRECISIÓN DE
FRACCIONES
TAMAÑO DE DE SEGUNDO AJUSTE DE
TIPO DE ALMACENAMIE DEFINIDA POR ZONA
DATOS FORMATO INTERVALO PRECISIÓN NTO (BYTES) EL USUARIO HORARIA

time hh:mm:ss[.nn De 100 3 to 5 Sí no


nnnnn] 00:00:00.000 nanosegundo
0000 a s
23:59:59.999
9999

date YYYY-MM- De 0001-01- 1 día 3 no no


DD 01 a
31.12.99

smalldatetim AAAA-MM- De 1900-01- 1 minuto. 4 no no


e DD hh:mm:ss 01 a 2079-
06-06

datetime AAAA-MM- De 1753-01- 0,00333 8 no no


DD 01 a 9999- segundos
hh:mm:ss[.nn 12-31
n]
PRECISIÓN DE
FRACCIONES
TAMAÑO DE DE SEGUNDO AJUSTE DE
TIPO DE ALMACENAMIE DEFINIDA POR ZONA
DATOS FORMATO INTERVALO PRECISIÓN NTO (BYTES) EL USUARIO HORARIA

datetime2 AAAA-MM- De 0001-01- 100 De 6 a 8 Sí no


DD 01 nanosegundo
hh:mm:ss[.nn 00:00:00.000 s
nnnnn] 0000 a
9999-12-31
23:59:59.999
9999

datetimeoffse YYYY-MM- De 0001-01- 100 De 8 a 10 Sí Sí


t DD 01 nanosegundo
hh:mm:ss[.nn 00:00:00.000 s
nnnnn] [+|- 0000 a
]hh:mm 9999-12-31
23:59:59.999
9999 (en
UTC)

NOTE
El tipo de datos rowversion de Transact-SQL no es un tipo de datos de fecha y hora. timestamp es un sinónimo en
desuso de rowversion.

Funciones de fecha y hora


En las tablas siguientes se enumeran las funciones de fecha y hora de Transact-SQL. Para obtener más
información sobre el determinismo, vea Funciones deterministas y no deterministas.
Función que devuelve valores de fecha y hora del sistema
Transact-SQL deriva todos los valores de fecha y hora del sistema operativo del equipo en el que se ejecuta la
instancia de SQL Server.
Funciones de fecha y hora del sistema de precisión elevada
SQL Server 2017 deriva los valores de fecha y hora mediante la API de Windows
GetSystemTimeAsFileTime(). La exactitud depende del hardware del equipo y de la versión de Windows en la
que se ejecuta la instancia de SQL Server. La precisión de esta API se fija en 100 nanosegundos. Use la API
de Windows GetSystemTimeAdjustment() para determinar la precisión.

TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

SYSDATETIME SYSDATETIME () Devuelve un valor datetime2(7) No determinista


datetime2(7) que
contiene la fecha y
hora del equipo en el
que se ejecuta la
instancia de SQL
Server. El valor
devuelto no incluye
el desplazamiento de
zona horaria.
TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

SYSDATETIMEOFFSE SYSDATETIMEOFFSE Devuelve un valor datetimeoffset(7) No determinista


T T() datetimeoffset(7)
que contiene la fecha
y hora del equipo en
el que se ejecuta la
instancia de SQL
Server. El valor
devuelto incluye el
desplazamiento de
zona horaria.

SYSUTCDATETIME SYSUTCDATETIME ( ) Devuelve un valor datetime2(7) No determinista


datetime2(7) que
contiene la fecha y
hora del equipo en el
que se ejecuta la
instancia de SQL
Server. La función
devuelve los valores
de fecha y hora
como una hora
universal coordinada
(UTC).

Funciones de fecha y hora del sistema de precisión baja

TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

CURRENT_TIMESTA CURRENT_TIMESTA Devuelve un valor datetime No determinista


MP MP datetime que
contiene la fecha y
hora del equipo en el
que se ejecuta la
instancia de SQL
Server. El valor
devuelto no incluye
el desplazamiento de
zona horaria.

GETDATE GETDATE ( ) Devuelve un valor datetime No determinista


datetime que
contiene la fecha y
hora del equipo en el
que se ejecuta la
instancia de SQL
Server. El valor
devuelto no incluye
el desplazamiento de
zona horaria.
TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

GETUTCDATE GETUTCDATE ( ) Devuelve un valor datetime No determinista


datetime que
contiene la fecha y
hora del equipo en el
que se ejecuta la
instancia de SQL
Server. La función
devuelve los valores
de fecha y hora
como una hora
universal coordinada
(UTC).

Funciones que devuelven partes de fecha y hora


TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

DATENAME DATENAME Devuelve una nvarchar No determinista


(datepart, date) cadena de caracteres
que representa el
parámetro datepart
especificado de la
fecha especificada.

DATEPART DATEPART (datepart, Devuelve un entero int No determinista


date) que representa el
parámetro datepart
especificado del
parámetro date
especificado.

DAY DAY (date) Devuelve un entero int Determinista


que representa la
parte del día del
parámetro date
especificado.

MONTH MONTH (date) Devuelve un entero int Determinista


que representa la
parte del mes del
parámetro date
especificado.

YEAR YEAR (date) Devuelve un entero int Determinista


que representa la
parte del año del
parámetro date
especificado.

Funciones que devuelven valores de fecha y hora de sus partes


TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO
TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

DATEFROMPARTS DATEFROMPARTS Devuelve un valor de date Determinista


(year, month, day) tipo date para el
año, mes y día
especificados.

DATETIME2FROMPA DATETIME2FROMPA Devuelve un valor datetime2( Determinista


RTS RTS (year, month, datetime2 para la precision )
day, hour, minute, fecha y la hora
seconds, fractions, especificadas, con la
precision) precisión indicada.

DATETIMEFROMPAR DATETIMEFROMPAR Devuelve un valor datetime Determinista


TS TS (year, month, datetime para la
day, hour, minute, fecha y la hora
seconds, especificadas.
milliseconds)

DATETIMEOFFSETFR DATETIMEOFFSETFR Devuelve un valor datetimeoffset( Determinista


OMPARTS OMPARTS (year, datetimeoffset para precision )
month, day, hour, la fecha y la hora
minute, seconds, especificadas, con los
fractions, desplazamientos y la
hour_offset, precisión indicados.
minute_offset,
precision)

SMALLDATETIMEFR SMALLDATETIMEFR Devuelve un valor smalldatetime Determinista


OMPARTS OMPARTS (year, smalldatetime de la
month, day, hour, fecha y la hora
minute) especificadas.

TIMEFROMPARTS TIMEFROMPARTS Devuelve un valor time( precision ) Determinista


(hour, minute, time para la hora
seconds, fractions, especificada, con la
precision) precisión indicada.

Funciones que devuelven valores de diferencia de fecha y hora


TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

DATEDIFF DATEDIFF (datepart, Devuelve el número int Determinista


startdate, enddate) de límites datepart
de fecha y hora que
se han superado
entre dos fechas
especificadas.

DATEDIFF_BIG DATEDIFF_BIG Devuelve el número bigint Determinista


(datepart, startdate, de límites datepart
enddate) de fecha y hora que
se han superado
entre dos fechas
especificadas.

Funciones que modifican valores de fecha y hora


TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

DATEADD DATEADD (datepart, Devuelve un nuevo El tipo de datos del Determinista


number, date) valor datetime al argumento date
agregar un intervalo
al datepart
especificado del date
indicado.

EOMONTH EOMONTH Devuelve el último El tipo de valor Determinista


(start_date [, día del mes que devuelto es el tipo
month_to_add ] ) contiene la fecha del argumento
especificada, con un start_date, o bien
desplazamiento como alternativa, el
opcional. tipo de datos date.

SWITCHOFFSET SWITCHOFFSET SWITCHOFFSET datetimeoffset con Determinista


(DATETIMEOFFSET, cambia el la precisión
time_zone) desplazamiento de fraccionaria del
zona horaria de un argumento
valor DATETIMEOFFSET
DATETIMEOFFSET y
conserva el valor
UTC.

TODATETIMEOFFSET TODATETIMEOFFSET TODATETIMEOFFSET datetimeoffset con Determinista


(expression, transforma un valor la precisión
time_zone) datetime2 en un fraccionaria del
valor datetimeoffset. argumento datetime
TODATETIMEOFFSET
interpreta el valor
datetime2 en la hora
local, para el valor
time_zone
especificado.

Funciones que establecen o devuelven funciones de formato de sesión


TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

@@DATEFIRST @@DATEFIRST Devuelve el valor tinyint No determinista


actual, para la sesión,
de SET DATEFIRST.

SET DATEFIRST SET DATEFIRST { Establece el primer No aplicable No aplicable


number | día de la semana en
@number_var } un número del 1 al
7.

SET DATEFORMAT SET DATEFORMAT { Determina el orden No aplicable No aplicable


format | de los componentes
@format_var } de la fecha
(mes/día/año) para
escribir datos de tipo
datetime o
smalldatetime.
TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

@@LANGUAGE @@LANGUAGE Devuelve el nombre No aplicable No aplicable


del idioma que se
está usando.
@@LANGUAGE no
es ninguna función
de fecha u hora. Sin
embargo, la
configuración de
idioma puede afectar
a la salida de las
funciones de fecha.

SET LANGUAGE SET LANGUAGE { [ N Establece el entorno No aplicable No aplicable


] 'language' | del idioma de la
@language_var } sesión y los
mensajes del
sistema. SET
LANGUAGE no es
ninguna función de
fecha u hora. Sin
embargo, la
configuración de
idioma afecta a la
salida de las
funciones de fecha.

sp_helplanguage sp_helplanguage [ [ Devuelve No aplicable No aplicable


@language = ] información sobre
'language' ] los formatos de
fecha de todos los
idiomas compatibles.
sp_helplanguage
no es un
procedimiento
almacenado de fecha
u hora. Sin embargo,
la configuración de
idioma afecta a la
salida de las
funciones de fecha.

Funciones que validan valores de fecha y hora


TIPO DE DATOS
FUNCIÓN SINTAXIS VALOR DEVUELTO DEVUELTO DETERMINISMO

ISDATE ISDATE (expression) Determina si una int ISDATE solo es


expresión de entrada determinista si se
datetime o usa con la función
smalldatetime tiene CONVERT, cuando se
un valor de fecha u especifica el
hora válido. parámetro de estilo
CONVERT y cuando
el estilo no es igual a
0, 100, 9 ni 109.

Temas relacionados con la fecha y hora


TEMA DESCRIPCIÓN

CAST y CONVERT (Transact-SQL) Proporciona información sobre la conversión de los valores


de fecha y hora de literales de cadena y otros formatos de
fecha y hora.

Escribir instrucciones Transact-SQL internacionales Proporciona directrices para la portabilidad de bases datos
y aplicaciones de bases de datos que utilizan instrucciones
Transact-SQL de un idioma a otro, o que admiten varios
idiomas.

Funciones escalares de ODBC (Transact-SQL) Proporciona información sobre funciones escalares de


ODBC que se pueden usar en instrucciones Transact-SQL.
Esto incluye las funciones de fecha y hora ODBC.

AT TIME ZONE (Transact-SQL) Proporciona la conversión de zona horaria.

Vea también
Funciones
Tipos de datos (Transact-SQL )
@@DATEFIRST (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el valor actual de SET DATEFIRST para una sesión específica.
Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener información general sobre todos los
tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@DATEFIRST

Tipo devuelto
tinyint

Notas
SET DATEFIRST n especifica el primer día (DOMINGO, LUNES, MARTES, etc.) de la semana. El valor n puede
oscilar entre 1 y 7.

SET DATEFIRST 3;
GO
SELECT @@DATEFIRST; -- 3 (Wednesday)
GO

Para un entorno de Inglés (EE.UU.), el valor predeterminado de @@DATEFIRST es 7 (domingo).


Esta configuración de idioma afecta a la interpretación de cadena de caracteres, ya que SQL Server convierte esas
cadenas en valores de fecha para el almacenamiento de base de datos. Esta configuración también afecta a la
presentación de los valores de fecha que se almacenan en la base de datos. Esta configuración no afecta al formato
de almacenamiento de datos de fecha.
En este ejemplo, primero se establece el idioma en Italian . La instrucción SELECT @@DATEFIRST; devuelve 1 . La
instrucción siguiente establece el idioma en us_english . La instrucción final SELECT @@DATEFIRST; devuelve 7 .

SET LANGUAGE Italian;


GO
SELECT @@DATEFIRST;
GO
SET LANGUAGE us_english;
GO
SELECT @@DATEFIRST;

Ejemplos
En este ejemplo se establece como primer día de la semana 5 (viernes) y se supone que el día actual, Today , cae
en sábado. La instrucción SELECT devuelve el valor de DATEFIRST y el número del día actual de la semana.

SET DATEFIRST 5;
SELECT @@DATEFIRST AS 'First Day'
,DATEPART(dw, SYSDATETIME()) AS 'Today';

El conjunto de resultados es el siguiente.

First Day Today


---------------- --------------
5 2

Ejemplo
Almacenamiento de datos SQL de Azure y Almacenamiento de datos paralelos

SELECT @@DATEFIRST;

Vea también
Funciones de configuración (Transact-SQL )
CURRENT_TIMESTAMP (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve la marca de tiempo del sistema de base de datos actual como un valor datetime sin el
desplazamiento de zona horaria de la base de datos. CURRENT_TIMESTAMP deriva este valor del sistema operativo
del equipo en el que se ejecuta la instancia de SQL Server.

NOTE
SYSDATETIME y tienen más precisión, de acuerdo con la medición de la precisión de las fracciones de
SYSUTCDATE
segundo, que GETDATE y GETUTCDATE . La función SYSDATETIMEOFFSET incluye el ajuste de zona horaria del sistema.
Puede asignar SYSDATETIME , SYSUTCDATE y SYSDATETIMEOFFSET a una variable de cualquiera de los tipos de fecha y
hora.

Esta función es el equivalente de ANSI SQL a GETDATE.


Vea Tipos de datos y funciones de fecha y hora para ver información de todos los tipos y funciones de datos de
fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CURRENT_TIMESTAMP

Argumentos
Esta función no toma ningún argumento.

Tipo devuelto
datetime

Notas
Las instrucciones Transact-SQL pueden hacer referencia a CURRENT_TIMESTAMP desde cualquier parte desde donde
puedan hacer referencia a una expresión datetime.
CURRENT_TIMESTAMPes una función no determinista. Las vistas y las expresiones que hacen referencia a esta
columna no se pueden indizar.

Ejemplos
Estos ejemplos usan las seis funciones de sistema de SQL Server que devuelven los valores de fecha y hora
actuales para devolver la fecha, la hora o ambas. Los ejemplos devuelven los valores en series, por lo que sus
fracciones de segundo podrían diferir. Tenga en cuenta que los valores reales devueltos reflejarán la fecha y hora
real de la ejecución.
A. Obtener la fecha y hora actuales del sistema

SELECT SYSDATETIME()
,SYSDATETIMEOFFSET()
,SYSUTCDATETIME()
,CURRENT_TIMESTAMP
,GETDATE()
,GETUTCDATE();
/* Returned:
SYSDATETIME() 2007-04-30 13:10:02.0474381
SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00
SYSUTCDATETIME() 2007-04-30 20:10:02.0474381
CURRENT_TIMESTAMP 2007-04-30 13:10:02.047
GETDATE() 2007-04-30 13:10:02.047
GETUTCDATE() 2007-04-30 20:10:02.047
*/

B. Obtener la fecha actual del sistema

SELECT CONVERT (date, SYSDATETIME())


,CONVERT (date, SYSDATETIMEOFFSET())
,CONVERT (date, SYSUTCDATETIME())
,CONVERT (date, CURRENT_TIMESTAMP)
,CONVERT (date, GETDATE())
,CONVERT (date, GETUTCDATE());

/* Returned
SYSDATETIME() 2007-05-03
SYSDATETIMEOFFSET()2007-05-03
SYSUTCDATETIME() 2007-05-04
CURRENT_TIMESTAMP 2007-05-03
GETDATE() 2007-05-03
GETUTCDATE() 2007-05-04
*/

C. Obtener la hora actual del sistema

SELECT CONVERT (time, SYSDATETIME())


,CONVERT (time, SYSDATETIMEOFFSET())
,CONVERT (time, SYSUTCDATETIME())
,CONVERT (time, CURRENT_TIMESTAMP)
,CONVERT (time, GETDATE())
,CONVERT (time, GETUTCDATE());

/* Returned
SYSDATETIME() 13:18:45.3490361
SYSDATETIMEOFFSET()13:18:45.3490361
SYSUTCDATETIME() 20:18:45.3490361
CURRENT_TIMESTAMP 13:18:45.3470000
GETDATE() 13:18:45.3470000
GETUTCDATE() 20:18:45.3470000
*/

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
SELECT CURRENT_TIMESTAMP;

Vea también
CAST y CONVERT (Transact-SQL )
DATEADD (Transact-SQL)
17/07/2018 • 13 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función agrega un valor number especificado (como un entero con signo) a un atributo datepart determinado
de un valor date de entrada y, después, devuelve el valor modificado.
Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener información general sobre todos los
tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATEADD (datepart , number , date )

Argumentos
datepart
Es la parte de date a la que DATEADD agrega un valor number entero. En esta tabla se enumeran todos los
argumentos válidos de datepart.

NOTE
DATEADD no acepta los equivalentes de variables definidas por el usuario para los argumentos datepart.

DATEPART ABREVIATURAS

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

weekday dw, w

hour hh

minute mi, n
DATEPART ABREVIATURAS

second ss, s

millisecond ms

microsecond mcs

nanosecond ns

number
Expresión que se puede resolver como un valor int que DATEADD suma a un atributo datepart de date. DATEADD
acepta valores de variables definidas por el usuario para number. DATEADD truncará un valor number especificado
que tiene una fracción decimal. En esta situación no se redondeará el valor number.
date
Una expresión que se puede resolver en uno de los valores siguientes:
date
datetime
datetimeoffset
datetime2
smalldatetime
time
Para date, DATEADD aceptará una expresión de columna, una expresión, un literal de cadena o una variable definida
por el usuario. Un valor de literal de cadena se debe resolver en un argumento datetime. Para evitar problemas de
ambigüedad, use años de cuatro dígitos. Vea Establecer la opción de configuración del servidor Fecha límite de
año de dos dígitos para obtener información sobre los años de dos dígitos.

Tipos de valores devueltos


El tipo de datos del argumento date se convierte en el tipo de datos del valor devuelto DATEADD , excepto para los
valores date de literal de cadena. Para un literal de cadena, DATEADD devuelve un valor datetime. DATEADD
producirá un error si la escala de segundos del literal de cadena supera tres posiciones decimales (.nnn) o si el
literal de cadena contiene la parte de desplazamiento de zona horaria.

Valor devuelto
Argumento datepart
dayofyear, day y weekday devuelven el mismo valor.
Cada datepart y sus abreviaturas devuelven el mismo valor.
Si se cumple lo siguiente:
datepart es month
el mes de date tiene más días que el mes que se devuelve
el día de date no existe en el mes que se devuelve
Después, DATEADD devuelve el último día del mes que se devuelve. Por ejemplo, septiembre tiene 30 días; por
tanto, estas instrucciones devuelven 30-09-2006 00:00:00.000:
SELECT DATEADD(month, 1, '20060830');
SELECT DATEADD(month, 1, '20060831');

Argumento number
El argumento number no puede superar el intervalo de int. En estas instrucciones, el argumento para number
supera el intervalo de int en uno. Estas instrucciones devuelven el mensaje de error siguiente: "
Msg 8115, Level 16, State 2, Line 1. Arithmetic overflow error converting expression to data type int."

SELECT DATEADD(year,2147483648, '20060731');


SELECT DATEADD(year,-2147483649, '20060731');

Argumento date
DATEADD no aceptará un argumento date incrementado a un valor fuera del intervalo de su tipo de datos. En las
instrucciones siguientes, el valor number que se agrega al valor date supera el intervalo del tipo de datos date.
DATEADD devuelve el mensaje de error siguiente: "
Msg 517, Level 16, State 1, Line 1 Adding a value to a 'datetime' column caused overflow ".

SELECT DATEADD(year,2147483647, '20060731');


SELECT DATEADD(year,-2147483647, '20060731');

Valores devueltos para una fecha smalldatetime y datepart de un


segundo o fracciones de segundo
La parte correspondiente a los segundos de un valor smalldatetime siempre es 00. Para un valor date
smalldatetime, se aplica lo siguiente:
Para un argumento datepart de second y un valor number comprendido entre -30 y +29, DATEADD no realiza
ningún cambio.
Para un argumento datepart de second y un valor number menor que -30 o mayor de +29, DATEADD realiza la
suma a partir de un minuto.
Para un argumento datepart de millisecond y un valor number comprendido entre -30001 y +29998,
DATEADD no realiza ningún cambio.
Para un argumento datepart de millisecond y un valor number menor que -30001 o mayor de +29998,
DATEADD realiza la suma a partir de un minuto.

Notas
Use DATEADD en las cláusulas siguientes:
GROUP BY
HAVING
ORDER BY
SELECT <lista>
WHERE

Precisión de fracciones de segundo


DATEADD no permite sumar un valor datepart de microsecond o nanosecond para los tipos de datos de date
como smalldatetime, date y datetime.
Los milisegundos tienen una escala de 3 (0,123), los microsegundos tienen una escala de 6 (0,123456) y los
nanosegundos tienen una escala de 9 (0,123456789). Los tipos de datos time, datetime2 y datetimeoffset
tienen una escala máxima de 7 (.1234567). Para un argumento datepart de nanosecond, number debe ser 100
antes de que aumenten las fracciones de segundos de date. Un valor number comprendido entre 1 y 49 se
redondeará hacia abajo hasta 0, y un número entre 50 a 99 se redondeará hacia arriba hasta 100.
Estas instrucciones agregan un atributo datepart de millisecond, microsecond o nanosecond.

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';


SELECT '1 millisecond', DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);

El conjunto de resultados es el siguiente.

1 millisecond 2007-01-01 13:10:10.1121111


2 milliseconds 2007-01-01 13:10:10.1131111
1 microsecond 2007-01-01 13:10:10.1111121
2 microseconds 2007-01-01 13:10:10.1111131
49 nanoseconds 2007-01-01 13:10:10.1111111
50 nanoseconds 2007-01-01 13:10:10.1111112
150 nanoseconds 2007-01-01 13:10:10.1111113

Ajuste de zona horaria


DATEADD no permite la suma para el desplazamiento de zona horaria.

Ejemplos
A. Aumentar datepart en un intervalo de 1
Cada una de estas instrucciones aumenta datepart en un intervalo de 1:
DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111';
SELECT 'year', DATEADD(year,1,@datetime2)
UNION ALL
SELECT 'quarter',DATEADD(quarter,1,@datetime2)
UNION ALL
SELECT 'month',DATEADD(month,1,@datetime2)
UNION ALL
SELECT 'dayofyear',DATEADD(dayofyear,1,@datetime2)
UNION ALL
SELECT 'day',DATEADD(day,1,@datetime2)
UNION ALL
SELECT 'week',DATEADD(week,1,@datetime2)
UNION ALL
SELECT 'weekday',DATEADD(weekday,1,@datetime2)
UNION ALL
SELECT 'hour',DATEADD(hour,1,@datetime2)
UNION ALL
SELECT 'minute',DATEADD(minute,1,@datetime2)
UNION ALL
SELECT 'second',DATEADD(second,1,@datetime2)
UNION ALL
SELECT 'millisecond',DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT 'microsecond',DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT 'nanosecond',DATEADD(nanosecond,1,@datetime2);

El conjunto de resultados es el siguiente.

Year 2008-01-01 13:10:10.1111111


quarter 2007-04-01 13:10:10.1111111
month 2007-02-01 13:10:10.1111111
dayofyear 2007-01-02 13:10:10.1111111
day 2007-01-02 13:10:10.1111111
week 2007-01-08 13:10:10.1111111
weekday 2007-01-02 13:10:10.1111111
hour 2007-01-01 14:10:10.1111111
minute 2007-01-01 13:11:10.1111111
second 2007-01-01 13:10:11.1111111
millisecond 2007-01-01 13:10:10.1121111
microsecond 2007-01-01 13:10:10.1111121
nanosecond 2007-01-01 13:10:10.1111111

B. Aumentar más de un nivel de datepart en una instrucción


Cada una de estas instrucciones aumenta datepart en un valor number lo suficientemente grande como para
incrementar también el siguiente valor superior datepart de date:

DECLARE @datetime2 datetime2;


SET @datetime2 = '2007-01-01 01:01:01.1111111';
--Statement Result
-------------------------------------------------------------------
SELECT DATEADD(quarter,4,@datetime2); --2008-01-01 01:01:01.1111111
SELECT DATEADD(month,13,@datetime2); --2008-02-01 01:01:01.1111111
SELECT DATEADD(dayofyear,365,@datetime2); --2008-01-01 01:01:01.1111111
SELECT DATEADD(day,365,@datetime2); --2008-01-01 01:01:01.1111111
SELECT DATEADD(week,5,@datetime2); --2007-02-05 01:01:01.1111111
SELECT DATEADD(weekday,31,@datetime2); --2007-02-01 01:01:01.1111111
SELECT DATEADD(hour,23,@datetime2); --2007-01-02 00:01:01.1111111
SELECT DATEADD(minute,59,@datetime2); --2007-01-01 02:00:01.1111111
SELECT DATEADD(second,59,@datetime2); --2007-01-01 01:02:00.1111111
SELECT DATEADD(millisecond,1,@datetime2); --2007-01-01 01:01:01.1121111
C. Utilizar las expresiones como argumentos para los parámetros number y date
En los ejemplos siguientes se usan otros tipos de expresiones como argumentos para los parámetros number y
date. En los ejemplos se usa la base de datos de AdventureWorks.
Especificar una columna como fecha
En este ejemplo se agregan 2 (dos) días a cada valor de la columna OrderDate para derivar una nueva columna
denominada PromisedShipDate :

SELECT SalesOrderID
,OrderDate
,DATEADD(day,2,OrderDate) AS PromisedShipDate
FROM Sales.SalesOrderHeader;

Un conjunto de resultados parcial:

SalesOrderID OrderDate PromisedShipDate


------------ ----------------------- -----------------------
43659 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
43660 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
43661 2005-07-01 00:00:00.000 2005-07-03 00:00:00.000
...
43702 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43703 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43704 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43705 2005-07-02 00:00:00.000 2005-07-04 00:00:00.000
43706 2005-07-03 00:00:00.000 2005-07-05 00:00:00.000
...
43711 2005-07-04 00:00:00.000 2005-07-06 00:00:00.000
43712 2005-07-04 00:00:00.000 2005-07-06 00:00:00.000
...
43740 2005-07-11 00:00:00.000 2005-07-13 00:00:00.000
43741 2005-07-12 00:00:00.000 2005-07-14 00:00:00.000

Especificar las variables definidas por el usuario como number y date


En este ejemplo se especifican variables definidas por el usuario como argumentos para number y date:

DECLARE @days int = 365,


@datetime datetime = '2000-01-01 01:01:01.111'; /* 2000 was a leap year */;
SELECT DATEADD(day, @days, @datetime);

El conjunto de resultados es el siguiente.

-----------------------
2000-12-31 01:01:01.110

(1 row(s) affected)

Especificar la función de sistema escalar como date


En este ejemplo se especifica SYSDATETIME para date. El valor devuelto exacto depende del día y la hora de
ejecución de la instrucción:

SELECT DATEADD(month, 1, SYSDATETIME());

El conjunto de resultados es el siguiente.


---------------------------
2013-02-06 14:29:59.6727944

(1 row(s) affected)

Especificar subconsultas y funciones escalares como number y date


En este ejemplo se usan subconsultas escalares, , como argumentos para number y date.
MAX(ModifiedDate)
(SELECT TOP 1 BusinessEntityID FROM Person.Person) actúa como argumento artificial para el parámetro "number",
para mostrar cómo se selecciona un argumento number de una lista de valores.

SELECT DATEADD(month,(SELECT TOP 1 BusinessEntityID FROM Person.Person),


(SELECT MAX(ModifiedDate) FROM Person.Person));

Especificar expresiones numéricas y funciones del sistema escalares como number y date
En este ejemplo se usa una expresión numérica (- (10/2)) , operadores unarios ( - ), un operador aritmético ( / ) y
funciones del sistema escalares ( SYSDATETIME ) como argumentos para number y date.

SELECT DATEADD(month,-(10/2), SYSDATETIME());

Especificar las funciones de clasificación como number


En este ejemplo se usa una función de categoría como argumento para number.

SELECT p.FirstName, p.LastName


,DATEADD(day,ROW_NUMBER() OVER (ORDER BY
a.PostalCode),SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;

Especificar una función de ventana agregada como number


En este ejemplo se usa una función de ventana agregada como argumento para number.

SELECT SalesOrderID, ProductID, OrderQty


,DATEADD(day,SUM(OrderQty)
OVER(PARTITION BY SalesOrderID),SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
GO

Vea también
CAST y CONVERT (Transact-SQL )
DATEDIFF (Transact-SQL)
18/07/2018 • 11 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el recuento (como un valor entero con firma) de los límites datepart que se han cruzado
entre los valores startdate y enddate especificados.
Vea DATEDIFF_BIG (Transact-SQL ) para obtener una función que controla las diferencias más importantes entre
los valores startdate y enddate. Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener
información general sobre todos los tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATEDIFF ( datepart , startdate , enddate )

Argumentos
datepart
La parte de startdate y enddate que especifica el tipo de límite cruzado. DATEDIFF no aceptará los equivalentes de
variables definidas por el usuario. En esta tabla se enumeran todos los argumentos válidos de datepart.

DATEPART ABREVIATURAS

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

hour hh

minute mi, n

second ss, s

millisecond ms

microsecond mcs
DATEPART ABREVIATURAS

nanosecond ns

startdate
Una expresión que se puede resolver en uno de los valores siguientes:
date
datetime
datetimeoffset
datetime2
smalldatetime
time
Para evitar ambigüedades, use años de cuatro dígitos. Vea Establecer la opción de configuración del servidor
Fecha límite de año de dos dígitos para obtener información sobre los valores de año de dos dígitos.
enddate
Vea startdate.

Tipo devuelto
int

Valor devuelto
Cada argumento datepart específico y las abreviaturas para ese argumento datepart devolverán el mismo
valor.
Para un valor devuelto fuera del intervalo de int (de -2.147.483.648 a +2.147.483.647) DATEDIFF devuelve un
error. En millisecond, la diferencia máxima entre startdate y enddate es de 24 días, 20 horas, 31 minutos y 23.647
segundos. En second, la diferencia máxima es de 68 años.
Si startdate y enddate solo tienen asignado un valor de hora y datepart no es un valor datepart de hora, DATEDIFF
devuelve 0.
DATEDIFF no usa un componente de desplazamiento de zona horaria de startdate o enddate para calcular el valor
devuelto.
Como smalldatetime solo es preciso hasta los minutos, los segundos y milisegundos siempre se establecen en 0
en el valor devuelto cuando startdate o enddate tienen un valor smalldatetime.
Si solo se asigna un valor de hora a una variable de tipo de datos de fecha, DATEDIFF establece el valor de la parte
de la fecha que falta en el valor predeterminado: 01-01-1900. Si solo se asigna un valor de fecha a una variable de
tipo de datos de fecha u hora, DATEDIFF establece el valor de la parte de la hora que falta en el valor
predeterminado: 00:00:00. Si startdate o enddate solo tienen una parte de hora y el otro solo una parte de fecha,
DATEDIFF establece las partes de hora y fecha que faltan en los valores predeterminados.

Si startdate y enddate tienen tipos de datos de fecha diferentes y uno tiene más partes de hora o precisión de
fracciones de segundo que el otro, DATEDIFF establece las partes que faltan del otro en 0.

Límites de datepart
Las instrucciones siguientes tienen los mismos valores startdate y enddate. Esas fechas son adyacentes y tienen
una diferencia horaria de 0,0000001 segundos. La diferencia entre startdate y enddate en cada instrucción cruza
un límite de calendario u hora de su datepart. Cada instrucción devuelve 1. Si startdate y enddate tienen valores
de año diferentes pero tienen los mismos valores de semana del calendario, DATEDIFF devolverá 0 para datepart
week.

SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');


SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

Notas
Use DATEDIFF en las cláusulas SELECT , WHERE, HAVING, GROUP BY y ORDER BY.
DATEDIFF convierte implícitamente los literales de cadena como un tipo datetime2. Esto significa que DATEDIFF
no admite el formato año-día-mes cuando la fecha se pasa como una cadena. La cadena se debe convertir
explícitamente a un tipo datetime o smalldatetime para poder usar el formato año-día-mes.
La especificación de SET DATEFIRST no tiene efecto en DATEDIFF . DATEDIFF siempre usa el domingo como el
primer día de la semana para garantizar que la función actúa de forma determinista.

Ejemplos
En estos ejemplos se usan otros tipos de expresiones como argumentos para los parámetros startdate y enddate.
A. Especificar las columnas para startdate y enddate
En este ejemplo se calcula el número de límites de día que se cruzan entre las fechas en dos columnas de una
tabla.

CREATE TABLE dbo.Duration


(startDate datetime2, endDate datetime2);

INSERT INTO dbo.Duration(startDate, endDate)


VALUES ('2007-05-06 12:10:09', '2007-05-07 12:10:09');

SELECT DATEDIFF(day, startDate, endDate) AS 'Duration'


FROM dbo.Duration;
-- Returns: 1

B. Especificar las variables definidas por el usuario para startdate y enddate


En este ejemplo, las variables definidas por el usuario actúan como argumentos para startdate y enddate.

DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';


DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722';
SELECT DATEDIFF(day, @startdate, @enddate);

C. Especificar las funciones de sistema escalares para startdate y enddate


En este ejemplo se usan las funciones de sistema escalares como argumentos para startdate y enddate.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());


D. Especificar las funciones escalares y de subconsulta para startdate y enddate
En este ejemplo se usan las funciones escalares y de subconsulta como argumentos para startdate y enddate.

USE AdventureWorks2012;
GO
SELECT DATEDIFF(day,
(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));

E. Especificar las constantes para startdate y enddate


En este ejemplo se usan constantes de caracteres como argumentos para startdate y enddate.

SELECT DATEDIFF(day,
'2007-05-07 09:53:01.0376635',
'2007-05-08 09:53:01.0376635');

F. Especificar expresiones numéricas y funciones de sistema escalares para enddate


En este ejemplo se usa una expresión numérica, (GETDATE() + 1) , y las funciones de sistema escalares GETDATE y
SYSDATETIME , como argumentos para enddate.

USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE() + 1)
AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO
USE AdventureWorks2012;
GO
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', DATEADD(day, 1, SYSDATETIME())) AS NumberOfDays
FROM Sales.SalesOrderHeader;
GO

G. Especificar las funciones de clasificación para startdate


En este ejemplo se usa una función de categoría como argumento para startdate.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
,DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY
a.PostalCode), SYSDATETIME()) AS 'Row Number'
FROM Sales.SalesPerson s
INNER JOIN Person.Person p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;

H. Especificar una función de ventana agregada para startdate


En este ejemplo se usa una función de ventana agregada como argumento para startdate.
USE AdventureWorks2012;
GO
SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty, soh.OrderDate,
DATEDIFF(day, MIN(soh.OrderDate)
OVER(PARTITION BY soh.SalesOrderID), SYSDATETIME()) AS 'Total'
FROM Sales.SalesOrderDetail sod
INNER JOIN Sales.SalesOrderHeader soh
ON sod.SalesOrderID = soh.SalesOrderID
WHERE soh.SalesOrderID IN(43659, 58918);
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En estos ejemplos se usan otros tipos de expresiones como argumentos para los parámetros startdate y enddate.
I. Especificar las columnas para startdate y enddate
En este ejemplo se calcula el número de límites de día que se cruzan entre las fechas en dos columnas de una
tabla.

CREATE TABLE dbo.Duration


(startDate datetime2, endDate datetime2);

INSERT INTO dbo.Duration (startDate, endDate)


VALUES ('2007-05-06 12:10:09', '2007-05-07 12:10:09');

SELECT TOP(1) DATEDIFF(day, startDate, endDate) AS Duration


FROM dbo.Duration;
-- Returns: 1

J. Especificar las funciones escalares y de subconsulta para startdate y enddate


En este ejemplo se usan las funciones escalares y de subconsulta como argumentos para startdate y enddate.

-- Uses AdventureWorks

SELECT TOP(1) DATEDIFF(day, (SELECT MIN(HireDate) FROM dbo.DimEmployee),


(SELECT MAX(HireDate) FROM dbo.DimEmployee))
FROM dbo.DimEmployee;

K. Especificar las constantes para startdate y enddate


En este ejemplo se usan constantes de caracteres como argumentos para startdate y enddate.

-- Uses AdventureWorks

SELECT TOP(1) DATEDIFF(day,


'2007-05-07 09:53:01.0376635',
'2007-05-08 09:53:01.0376635') FROM DimCustomer;

L. Especificar las funciones de clasificación para startdate


En este ejemplo se usa una función de categoría como argumento para startdate.
-- Uses AdventureWorks

SELECT FirstName, LastName,


DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY
DepartmentName), SYSDATETIME()) AS RowNumber
FROM dbo.DimEmployee;

M. Especificar una función de ventana agregada para startdate


En este ejemplo se usa una función de ventana agregada como argumento para startdate.

-- Uses AdventureWorks

SELECT FirstName, LastName, DepartmentName,


DATEDIFF(year, MAX(HireDate)
OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue
FROM dbo.DimEmployee

Vea también
DATEDIFF_BIG (Transact-SQL )
CAST y CONVERT (Transact-SQL )
DATEDIFF_BIG (Transact-SQL)
18/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el recuento (como un valor entero grande con firma) de los límites datepart que se han
cruzado entre los valores startdate y enddate especificados.
Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener información general sobre todos los
tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATEDIFF_BIG ( datepart , startdate , enddate )

Argumentos
datepart
La parte de startdate y enddate que especifica el tipo de límite cruzado. DATEDIFF_BIG no aceptará los
equivalentes de variables definidas por el usuario. En esta tabla se enumeran todos los argumentos válidos de
datepart.

NOTE
DATEDIFF_BIG no acepta los equivalentes de variables definidas por el usuario para los argumentos datepart.

DATEPART ABREVIATURAS

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

hour hh

minute mi, n
DATEPART ABREVIATURAS

second ss, s

millisecond ms

microsecond mcs

nanosecond ns

startdate
Una expresión que se puede resolver en uno de los valores siguientes:
date
datetime
datetimeoffset
datetime2
smalldatetime
time
Para date, DATEDIFF_BIG aceptará una expresión de columna, una expresión, un literal de cadena o una variable
definida por el usuario. Un valor de literal de cadena se debe resolver en un argumento datetime. Para evitar
problemas de ambigüedad, use años de cuatro dígitos. DATEDIFF_BIG resta enddate de startdate. Para evitar
ambigüedades, use años de cuatro dígitos. Vea Establecer la opción de configuración del servidor Fecha límite de
año de dos dígitos para obtener información sobre los años de dos dígitos.
enddate
Vea startdate.

Tipo devuelto
bigint con firma

Valor devuelto
Devuelve el recuento (como valor bigint con firma) de los límites datepart especificados que se han cruzado entre
los valores startdate y enddate especificados.
Cada argumento datepart específico y las abreviaturas para ese argumento datepart devolverán el mismo
valor.
Para un valor devuelto fuera del intervalo de bigint (de -9.223.372.036.854.775.808 a
9.223.372.036.854.775.807) DATEDIFF_BIG devuelve un error. En millisecond, la diferencia máxima entre
startdate y enddate es de 24 días, 20 horas, 31 minutos y 23.647 segundos. En second, la diferencia máxima es
de 68 años.
Si startdate y enddate solo tienen asignado un valor de hora y datepart no es un valor datepart de hora,
DATEDIFF_BIG devuelve 0.

DATEDIFF_BIG no usa un componente de desplazamiento de zona horaria de startdate o enddate para calcular el
valor devuelto.
Para un valor smalldatetime que se use para startdate o enddate, DATEDIFF_BIG siempre establece los segundos
y milisegundos en 0 en el valor devuelto porque smalldatetime solo es preciso hasta los minutos.
Si solo se asigna un valor de hora a una variable de tipo de datos de fecha, DATEDIFF_BIG establece el valor de la
parte de la fecha que falta en el valor predeterminado: 01-01-1900. Si solo se asigna un valor de fecha a una
variable de tipo de datos de fecha u hora, DATEDIFF_BIG establece el valor de la parte de la hora que falta en el
valor predeterminado: 00:00:00. Si startdate o enddate solo tienen una parte de hora y el otro solo una parte de
fecha, DATEDIFF_BIG establece las partes de hora y fecha que faltan en los valores predeterminados.
Si startdate y enddate tienen tipos de datos de fecha diferentes y uno tiene más partes de hora o precisión de
fracciones de segundo que el otro, DATEDIFF_BIG establece las partes que faltan del otro en 0.

Límites de datepart
Las instrucciones siguientes tienen los mismos valores startdate y enddate. Esas fechas son adyacentes y tienen
una diferencia horaria de 0,0000001 segundos. La diferencia entre startdate y enddate en cada instrucción cruza
un límite de calendario u hora de su datepart. Cada instrucción devuelve 1. Si startdate y enddate tienen valores
de año diferentes pero tienen los mismos valores de semana del calendario, DATEDIFF_BIG devolverá 0 para
datepart week.

SELECT DATEDIFF_BIG(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');


SELECT DATEDIFF_BIG(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF_BIG(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

Notas
Use DATEDIFF_BIG en las cláusulas SELECT , WHERE, HAVING, GROUP BY y ORDER BY.
DATEDIFF_BIG convierte implícitamente los literales de cadena como un tipo datetime2. Esto significa que
DATEDIFF_BIG no admite el formato año-día-mes cuando la fecha se pasa como una cadena. La cadena se debe
convertir explícitamente a un tipo datetime o smalldatetime para poder usar el formato año-día-mes.
La especificación de SET DATEFIRST no tiene efecto en DATEDIFF_BIG . DATEDIFF_BIG siempre usa el domingo
como el primer día de la semana para garantizar que la función actúa de forma determinista.

Ejemplos
Especificar las columnas para startdate y enddate
En este ejemplo se usan otros tipos de expresiones como argumentos para los parámetros startdate y enddate.
Calcula el número de límites de día que se cruzan entre las fechas en dos columnas de una tabla.

CREATE TABLE dbo.Duration


(startDate datetime2, endDate datetime2);

INSERT INTO dbo.Duration(startDate,endDate)


VALUES('2007-05-06 12:10:09', '2007-05-07 12:10:09');

SELECT DATEDIFF_BIG(day, startDate, endDate) AS 'Duration'


FROM dbo.Duration;
-- Returns: 1

Vea ejemplos más estrechamente relacionados en DATEDIFF (Transact-SQL ).


Vea también
CAST y CONVERT (Transact-SQL )
DATEDIFF (Transact-SQL )
DATEFROMPARTS (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un valor date que se asigna a los valores de año, mes y día especificados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATEFROMPARTS ( year, month, day )

Argumentos
year
Expresión entera que especifica un año.
month
Expresión entera que especifica un mes, de 1 a 12.
day
Expresión entera que especifica un día.

Tipos de valores devueltos


date

Notas
DATEFROMPARTS devuelve un valor date, con la parte de fecha establecida en el año, el mes y el día especificados, y
la parte de hora establecida en el valor predeterminado. Para los argumentos no válidos, DATEFROMPARTS producirá
un error. DATEFROMPARTS devuelve NULL si al menos uno de los argumentos obligatorios tiene un valor NULL.
Esta función puede controlar la conexión remota a servidores de SQL Server 2012 (11.x) y versiones posteriores.
No puede controlar la comunicación remota a servidores con una versión inferior a SQL Server 2012 (11.x).

Ejemplos
En este ejemplo se muestra la función DATEFROMPARTS en acción.

SELECT DATEFROMPARTS ( 2010, 12, 31 ) AS Result;

El conjunto de resultados es el siguiente.


Result
----------------------------------
2010-12-31

(1 row(s) affected)

Vea también
date (Transact-SQL )
DATENAME (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve una cadena de caracteres que representa el parámetro datepart especificado del argumento
date especificado.
Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener información general sobre todos los
tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATENAME ( datepart , date )

Argumentos
datepart
La parte específica del argumento date que DATENAME va a devolver. En esta tabla se enumeran todos los
argumentos válidos de datepart.

NOTE
DATENAME no acepta los equivalentes de variables definidas por el usuario para los argumentos datepart.

DATEPART ABREVIATURAS

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

weekday dw, w

hour hh

minute mi, n
DATEPART ABREVIATURAS

second ss, s

millisecond ms

microsecond mcs

nanosecond ns

TZoffset tz

ISO_WEEK ISOWK, ISOWW

date
Una expresión que se puede resolver en uno de los tipos de datos siguientes:
date
datetime
datetimeoffset
datetime2
smalldatetime
time
Para date, DATENAME aceptará una expresión de columna, una expresión, un literal de cadena o una variable
definida por el usuario. Para evitar problemas de ambigüedad, use años de cuatro dígitos. Vea Establecer la opción
de configuración del servidor Fecha límite de año de dos dígitos para obtener información sobre los años de dos
dígitos.

Tipo devuelto
nvarchar

Valor devuelto
Cada datepart y sus abreviaturas devuelven el mismo valor.
El valor devuelto depende del entorno del idioma definido mediante SET L ANGUAGE y la opción de
configuración de servidor Configurar el idioma predeterminado del inicio de sesión. El valor devuelto depende de
SET DATEFORMAT si date es un literal de cadena de ciertos formatos. SET DATEFORMAT no cambia el valor
devuelto cuando la fecha es una expresión de columna de un tipo de datos de hora o fecha.
Cuando el parámetro date tiene un argumento de tipo de datos date, el valor devuelto depende de la
configuración especificada mediante SET DATEFIRST.

Argumento datepart TZoffset


Si el argumento datepart es TZoffset (tz) y el argumento date no tiene desplazamiento de zona horaria, DATEADD
devuelve 0.

Argumento date smalldatetime


Si date es smalldatetime, DATENAME devuelve los segundos como 00.
Valor predeterminado devuelto por datepart que no se encuentra en el
argumento date
Si el tipo de datos del argumento date no contiene el parámetro datepart especificado, DATENAME devolverá el
valor predeterminado datepart solo si el argumento date tiene un valor literal.
Por ejemplo, el valor predeterminado de año-mes-día de cualquier tipo de datos date es 1900-01-01. Esta
instrucción tiene argumentos de la parte de fecha para datepart, un argumento de hora para date y DATENAME
devuelve 1900, January, 1, 1, Monday .

SELECT DATENAME(year, '12:10:30.123')


,DATENAME(month, '12:10:30.123')
,DATENAME(day, '12:10:30.123')
,DATENAME(dayofyear, '12:10:30.123')
,DATENAME(weekday, '12:10:30.123');

Si date se especifica como variable o columna de tabla, y el tipo de datos de esa variable o columna no tiene
especificado datepart, DATENAME devuelve el error 9810. En este ejemplo, la variable @t tiene un tipo de datos
time. Se produce un error en el ejemplo porque el año de la parte de fecha no es válido para el tipo de datos time:

DECLARE @t time = '12:10:30.123';


SELECT DATENAME(year, @t);

Notas
Use DATENAME en las cláusulas siguientes:
GROUP BY
HAVING
ORDER BY
SELECT <lista>
WHERE
En SQL Server 2017, DATENAME convierte implícitamente los literales de cadena como un tipo datetime2. Esto
significa que DATENAME no admite el formato año-día-mes cuando la fecha se pasa como una cadena. La cadena se
debe convertir explícitamente a un tipo datetime o smalldatetime para poder usar el formato año-día-mes.

Ejemplos
En este ejemplo se devuelven las partes de fecha para la fecha especificada. Sustituya un valor datepart de la tabla
para el argumento datepart en la instrucción SELECT:
SELECT DATENAME(datepart,'2007-10-30 12:15:32.1234567 +05:10');

El conjunto de resultados es el siguiente.

DATEPART VALOR DEVUELTO

year, yyyy, yy 2007

quarter, qq, q 4

month, mm, m Octubre


DATEPART VALOR DEVUELTO

dayofyear, dy, y 303

day, dd, d 30

week, wk, ww 44

weekday, dw Martes

hour, hh 12

minute, n 15

second, ss, s 32

millisecond, ms 123

microsecond, mcs 123456

nanosecond, ns 123456700

TZoffset, tz 310

ISO_WEEK, ISOWK, ISOWW 44

Almacenamiento de datos SQL de Azure y Almacenamiento de datos paralelos


En este ejemplo se devuelven las partes de fecha para la fecha especificada. Sustituya un valor datepart de la tabla
para el argumento datepart en la instrucción SELECT:

SELECT DATENAME(datepart,'2007-10-30 12:15:32.1234567 +05:10');

El conjunto de resultados es el siguiente.

DATEPART VALOR DEVUELTO

year, yyyy, yy 2007

quarter, qq, q 4

month, mm, m Octubre

dayofyear, dy, y 303

day, dd, d 30

week, wk, ww 44

weekday, dw Martes

hour, hh 12
DATEPART VALOR DEVUELTO

minute, n 15

second, ss, s 32

millisecond, ms 123

microsecond, mcs 123456

nanosecond, ns 123456700

TZoffset, tz 310

ISO_WEEK, ISOWK, ISOWW 44

Vea también
CAST y CONVERT (Transact-SQL )
DATEPART (Transact-SQL)
17/07/2018 • 12 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un entero que representa el parámetro datepart especificado del parámetro date
especificado.
Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener información general sobre todos los
tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATEPART ( datepart , date )

Argumentos
datepart
La parte específica del argumento date para el que DATEPART va a devolver un valor integer. En esta tabla se
enumeran todos los argumentos válidos de datepart.

NOTE
DATEPART no acepta los equivalentes de variables definidas por el usuario para los argumentos datepart.

DATEPART ABREVIATURAS

year yy, yyyy

quarter qq, q

month mm, m

dayofyear dy, y

day dd, d

week wk, ww

weekday dw

hour hh

minute mi, n
DATEPART ABREVIATURAS

second ss, s

millisecond ms

microsecond mcs

nanosecond ns

TZoffset tz

ISO_WEEK isowk, isoww

date
Una expresión que se resuelve en uno de los tipos de datos siguientes:
date
datetime
datetimeoffset
datetime2
smalldatetime
time
Para date, DATEPART aceptará una expresión de columna, una expresión, un literal de cadena o una variable
definida por el usuario. Para evitar problemas de ambigüedad, use años de cuatro dígitos. Vea Establecer la opción
de configuración del servidor Fecha límite de año de dos dígitos para obtener información sobre los años de dos
dígitos.

Tipo devuelto
int

Valor devuelto
Cada datepart y sus abreviaturas devuelven el mismo valor.
El valor devuelto depende del entorno del idioma definido mediante SET L ANGUAGE y la opción de
configuración de servidor Configurar el idioma predeterminado del inicio de sesión. El valor devuelto depende de
SET DATEFORMAT si date es un literal de cadena de ciertos formatos. SET DATEFORMAT no cambia el valor
devuelto cuando la fecha es una expresión de columna de un tipo de datos de hora o fecha.
En esta tabla se enumeran todos los argumentos datepart, con los correspondientes valores devueltos para la
instrucción SELECT DATEPART(datepart,'2007-10-30 12:15:32.1234567 +05:10') . El argumento date tiene un tipo de
datos datetimeoffset(7). Las dos últimas posiciones del valor devuelto nanosecond datepart siempre son 00 y
este valor tiene una escala de 9:
0,123456700

DATEPART VALOR DEVUELTO

year, yyyy, yy 2007


DATEPART VALOR DEVUELTO

quarter, qq, q 4

month, mm, m 10

dayofyear, dy, y 303

day, dd, d 30

week, wk, ww 45

weekday, dw 1

hour, hh 12

minute, n 15

second, ss, s 32

millisecond, ms 123

microsecond, mcs 123456

nanosecond, ns 123456700

TZoffset, tz 310

Argumentos de la parte de fecha semana y día de la semana


Si datepart es week (wk, ww) o weekday (dw), el valor devuelto de DATEPART depende del valor establecido
mediante SET DATEFIRST.
El 1 de enero de todos los años es el número de inicio para weekdatepart. Por ejemplo:
DATEPART (wk, "Jan 1, xxxx") = 1
donde xxxx es cualquier año.
En esta tabla se muestra el valor devuelto para los valores datepart week y weekday para
"2007-04-21 "
para cada argumento SET DATEFIRST. El 1 de enero de 2007 es lunes. El 21 de abril de 2007 es un sábado. Para
Inglés de EE.UU.,
SET DATEFIRST 7 -- ( Sunday )
sirve como valor predeterminado. Después de establecer DATEFIRST, use esta instrucción SQL sugerida para los
valores de tabla de datepart:
SELECT DATEPART(week, '2007-04-21 '), DATEPART(weekday, '2007-04-21 ')
SET DATEFIRST WEEK WEEKDAY

ARGUMENTO DEVUELTO DEVUELTO

1 16 6

2 17 5

3 17 4

4 17 3

5 17 2

6 17 1

7 16 7

Argumentos de datepart year, month y day


Los valores devueltos para DATEPART (year, date), DATEPART (month, date) y DATEPART (day, date) son los
mismos que los que devuelven las funciones YEAR, MONTH y DAY, respectivamente.

ISO_WEEK datepart
ISO 8601 incluye el sistema ISO de fecha-semana, un sistema de numeración para las semanas. Cada semana se
asocia al año en el que cae el jueves. Por ejemplo, la semana 1 de 2004 (2004W01) abarcaba del lunes 29 de
diciembre de 2003 al domingo 4 de enero de 2004. En las regiones y países europeos normalmente se usa este
estilo de numeración. En las regiones y países que no son europeos normalmente no se usa.
Nota: El número más alto de la semana en un año puede ser 52 o 53.
Es posible que los sistemas de numeración que se usan en otros países o regiones no se ajusten a las normas ISO.
En esta tabla se muestran seis posibilidades:

LA PRIMERA SEMANA DEL AÑO SEMANAS ASIGNADAS DOS


PRIMER DÍA DE LA SEMANA CONTIENE VECES USADO POR/EN

Domingo 1 de enero, Sí United States

El primer sábado,

1–7 días del año

Lunes 1 de enero, Sí La mayoría de los países


europeos y Reino Unido
El primer domingo,

1–7 días del año

Lunes 4 de enero, no ISO 8601, Noruega y Suecia

El primer jueves,

4–7 días del año


LA PRIMERA SEMANA DEL AÑO SEMANAS ASIGNADAS DOS
PRIMER DÍA DE LA SEMANA CONTIENE VECES USADO POR/EN

Lunes 7 de enero, no

El primer lunes,

7 días del año

Miércoles 1 de enero, Sí

El primer martes,

1–7 días del año

Sábado 1 de enero, Sí

El primer viernes,

1–7 días del año

TZoffset
DATEPART devuelve el valor TZoffset (tz) como el número de minutos (con signo). Esta instrucción devuelve un
desplazamiento de zona horaria de 310 minutos:

SELECT DATEPART (TZoffset, '2007-05-10 00:00:01.1234567 +05:10');

DATEPART representa el valor TZoffset de esta forma:


Para datetimeoffset y datetime2, TZoffset devuelve el desplazamiento de tiempo en minutos, donde el
desplazamiento de datetime2 siempre es 0 minutos.
Para los tipos de datos que se pueden convertir implícitamente en datetimeoffset o datetime2, DATEPART
devuelve el desplazamiento de tiempo en minutos. Excepción: otros tipos de datos de fecha y hora.
El resto de tipos de parámetros producirán un error.

Argumento date smalldatetime


Para un valor date smalldatetime, DATEPART devuelve los segundos como 00.

Valor predeterminado devuelto por una parte de fecha que no se


encuentra en un argumento date
Si el tipo de datos del argumento date no contiene el parámetro datepart especificado, DATEPART devolverá el
valor predeterminado para ese parámetro datepart solo cuando se especifique un valor literal para date.
Por ejemplo, el valor predeterminado de año-mes-día de cualquier tipo de datos date es 1900-01-01. Esta
instrucción tiene argumentos de la parte de fecha para datepart, un argumento de hora para date y devuelve
1900, 1, 1, 1, 2 .
SELECT DATEPART(year, '12:10:30.123')
,DATEPART(month, '12:10:30.123')
,DATEPART(day, '12:10:30.123')
,DATEPART(dayofyear, '12:10:30.123')
,DATEPART(weekday, '12:10:30.123');

Si date se especifica como variable o columna de tabla, y el tipo de datos de esa variable o columna no tiene
especificado datepart, DATEPART devuelve el error 9810. En este ejemplo, la variable @t tiene un tipo de datos
time. Se produce un error en el ejemplo porque el año de la parte de fecha no es válido para el tipo de datos
time:

DECLARE @t time = '12:10:30.123';


SELECT DATEPART(year, @t);

Fracciones de segundo
En estas instrucciones se muestra que DATEPART devuelve las fracciones de segundo:

SELECT DATEPART(millisecond, '00:00:01.1234567'); -- Returns 123


SELECT DATEPART(microsecond, '00:00:01.1234567'); -- Returns 123456
SELECT DATEPART(nanosecond, '00:00:01.1234567'); -- Returns 123456700

Notas
DATEPART se puede usar en las cláusulas SELECT list, WHERE, HAVING, GROUP BY y ORDER BY.
DATEPART convierte de forma implícita los literales de cadena como un tipo datetime2 en SQL Server 2017.
Esto significa que DATENAME no admite el formato año-día-mes cuando se pasa la fecha como cadena. La
cadena se debe convertir explícitamente a un tipo datetime o smalldatetime para poder usar el formato año-
día-mes.

Ejemplos
En este ejemplo se devuelve el año base. El año base ayuda con los cálculos de fecha. En el ejemplo, un número
especifica la fecha. Observe que SQL Server interpreta 0 como el 1 de enero de 1900.

SELECT DATEPART(year, 0), DATEPART(month, 0), DATEPART(day, 0);


-- Returns: 1900 1 1 */

En este ejemplo se devuelve el día de la fecha 12/20/1974 .

-- Uses AdventureWorks

SELECT TOP(1) DATEPART (day,'12/20/1974') FROM dbo.DimCustomer;

El conjunto de resultados es el siguiente.

--------
20

En este ejemplo se devuelve el año de la fecha 12/20/1974 .


-- Uses AdventureWorks

SELECT TOP(1) DATEPART (year,'12/20/1974') FROM dbo.DimCustomer;

El conjunto de resultados es el siguiente.

--------
1974

Vea también
CAST y CONVERT (Transact-SQL )
DATETIME2FROMPARTS (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un valor datetime2 para los argumentos de fecha y hora especificados. El valor devuelto
tiene una precisión especificada por el argumento de precisión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATETIME2FROMPARTS ( year, month, day, hour, minute, seconds, fractions, precision )

Argumentos
year
Expresión entera que especifica un año.
month
Expresión entera que especifica un mes.
day
Expresión entera que especifica un día.
hour
Expresión entera que especifica las horas.
minute
Expresión entera que especifica los minutos.
segundos
Expresión entera que especifica los segundos.
fractions
Expresión entera que especifica un valor de fracciones de segundo.
precisión
Expresión entera que especifica la precisión del valor datetime2 que DATETIME2FROMPARTS va a devolver.

Tipos de valores devueltos


datetime2( precision )

Notas
DATETIME2FROMPARTS devuelve un valor datetime2 totalmente inicializado. DATETIME2FROMPARTS producirá un error
si al menos uno de los argumentos obligatorios tiene un valor no válido. DATETIME2FROMPARTS devuelve NULL si al
menos uno de los argumentos obligatorios tiene un valor NULL. Pero si el argumento precision tiene un valor
NULL, DATETIME2FROMPARTS producirá un error.
El argumento fractions depende del argumento precision. Por ejemplo, para un valor precision de 7, cada fracción
representa 100 nanosegundos; si precision es 3, cada fracción representa un milisegundo. Para un valor de
precision de cero, el valor de fractions también debe ser cero; de lo contrario, DATETIME2FROMPARTS generará un
error.
Esta función admite la conexión remota a servidores de SQL Server 2017 y versiones posteriores. No admitirá la
conexión remota a servidores que tengan una versión inferior a SQL Server 2017.

Ejemplos
A. Ejemplo sin fracciones de segundo

SELECT DATETIME2FROMPARTS ( 2010, 12, 31, 23, 59, 59, 0, 0 ) AS Result;

El conjunto de resultados es el siguiente.

Result
---------------------------
2010-12-31 23:59:59.0000000

(1 row(s) affected)

B. Ejemplo con fracciones de segundo


En este ejemplo se muestra el uso de los parámetros fractions y precision:
1. Cuando fractions tiene el valor 5 y precision el valor 1, el valor de fractions representa 5/10 de un segundo.
2. Cuando fractions tiene el valor 50 y precision el valor 2, el valor de fractions representa 50/100 de un
segundo.
3. Cuando fractions tiene el valor 500 y precision tiene el valor 3, el valor de fractions representa 500/1000 de
un segundo.

SELECT DATETIME2FROMPARTS ( 2011, 8, 15, 14, 23, 44, 5, 1 );


SELECT DATETIME2FROMPARTS ( 2011, 8, 15, 14, 23, 44, 50, 2 );
SELECT DATETIME2FROMPARTS ( 2011, 8, 15, 14, 23, 44, 500, 3 );
GO

El conjunto de resultados es el siguiente.

----------------------
2011-08-15 14:23:44.5

(1 row(s) affected)

----------------------
2011-08-15 14:23:44.50

(1 row(s) affected)

----------------------
2011-08-15 14:23:44.500

(1 row(s) affected)

Vea también
datetime2 (Transact-SQL )
DATETIMEFROMPARTS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un valor datetime para los argumentos de fecha y hora especificados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATETIMEFROMPARTS ( year, month, day, hour, minute, seconds, milliseconds )

Argumentos
year
Expresión entera que especifica un año.
month
Expresión entera que especifica un mes.
day
Expresión entera que especifica un día.
hour
Expresión entera que especifica las horas.
minute
Expresión entera que especifica los minutos.
segundos
Expresión entera que especifica los segundos.
milliseconds
Expresión entera que especifica los milisegundos.

Tipos de valores devueltos


datetime

Notas
DATETIMEFROMPARTS devuelve un valor datetime totalmente inicializado. DATETIMEFROMPARTS producirá un error si al
menos uno de los argumentos obligatorios tiene un valor no válido. DATETIMEFROMPARTS devuelve NULL si al
menos uno de los argumentos obligatorios tiene un valor NULL.
Esta función admite la conexión remota a servidores de SQL Server 2017 y versiones posteriores. No admitirá la
conexión remota a servidores que tengan una versión inferior a SQL Server 2017.

Ejemplos
SELECT DATETIMEFROMPARTS ( 2010, 12, 31, 23, 59, 59, 0 ) AS Result;

El conjunto de resultados es el siguiente.

Result
---------------------------
2010-12-31 23:59:59.000

(1 row(s) affected)

Vea también
datetime (Transact-SQL )
DATETIMEOFFSETFROMPARTS (Transact-SQL)
19/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un valor datetimeoffset para los argumentos de fecha y hora especificados. El valor
devuelto tiene una precisión especificada por el argumento precision y un desplazamiento especificado por los
argumentos de desplazamiento.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATETIMEOFFSETFROMPARTS ( year, month, day, hour, minute, seconds, fractions, hour_offset, minute_offset,
precision )

Argumentos
year
Expresión entera que especifica un año.
month
Expresión entera que especifica un mes.
day
Expresión entera que especifica un día.
hour
Expresión entera que especifica las horas.
minute
Expresión entera que especifica los minutos.
segundos
Expresión entera que especifica los segundos.
fractions
Expresión entera que especifica un valor de fracciones de segundo.
hour_offset
Expresión entera que especifica la parte de hora del desplazamiento de zona horaria.
minute_offset
Expresión entera que especifica la parte de los minutos del desplazamiento de zona horaria.
precisión
Valor literal entero que especifica la precisión del valor datetimeoffset que DATETIMEOFFSETFROMPARTS va a
devolver.

Tipos de valores devueltos


datetimeoffset( precision )
Notas
DATETIMEOFFSETFROMPARTS devuelve un tipo de datos datetimeoffset totalmente inicializado. Los argumentos de
desplazamiento representan el desplazamiento de zona horaria. En el caso de los argumentos de desplazamiento
omitidos, DATETIMEOFFSETFROMPARTS supone un desplazamiento de zona horaria de 00:00 ; en otras palabras, no hay
ningún desplazamiento de zona horaria. En el caso de los argumentos de desplazamiento especificados,
DATETIMEOFFSETFROMPARTS espera valores para ambos argumentos y ambos valores positivos o negativos. Si
minute_offset tiene un valor y hour_offset no tiene ningún valor, DATETIMEOFFSETFROMPARTS generará un error.
DATETIMEOFFSETFROMPARTS generará un error si los demás argumentos tienen valores no válidos. Si al menos uno de
los argumentos requeridos tiene un valor NULL , DATETIMEOFFSETFROMPARTS va a devolver NULL . Pero si el
argumento precision tiene un valor NULL , DATETIMEOFFSETFROMPARTS generará un error.
El argumento fractions depende del argumento precision. Por ejemplo, para un valor precision de 7, cada fracción
representa 100 nanosegundos; si precision es 3, cada fracción representa un milisegundo. Para un valor de
precision de cero, el valor de fractions también debe ser cero; de lo contrario, DATETIMEOFFSETFROMPARTS generará un
error.
Esta función admite la conexión remota a servidores de SQL Server 2017 y versiones posteriores. No admitirá la
conexión remota a servidores que tengan una versión inferior a SQL Server 2017.

Ejemplos
A. Ejemplo sin fracciones de segundo

SELECT DATETIMEOFFSETFROMPARTS ( 2010, 12, 31, 14, 23, 23, 0, 12, 0, 7 ) AS Result;

El conjunto de resultados es el siguiente.

Result
----------------------------------
2010-12-31 14:23:23.0000000 +12:00

(1 row(s) affected)

B. Ejemplo con fracciones de segundo


En este ejemplo se muestra el uso de los parámetros fractions y precision:
1. Cuando fractions tiene el valor 5 y precision el valor 1, el valor de fractions representa 5/10 de un segundo.
2. Cuando fractions tiene el valor 50 y precision el valor 2, el valor de fractions representa 50/100 de un
segundo.
3. Cuando fractions tiene el valor 500 y precision tiene el valor 3, el valor de fractions representa 500/1000 de
un segundo.

SELECT DATETIMEOFFSETFROMPARTS ( 2011, 8, 15, 14, 30, 00, 5, 12, 30, 1 );


SELECT DATETIMEOFFSETFROMPARTS ( 2011, 8, 15, 14, 30, 00, 50, 12, 30, 2 );
SELECT DATETIMEOFFSETFROMPARTS ( 2011, 8, 15, 14, 30, 00, 500, 12, 30, 3 );
GO

El conjunto de resultados es el siguiente.


----------------------------------
2011-08-15 14:30:00.5 +12:30

(1 row(s) affected)

----------------------------------
2011-08-15 14:30:00.50 +12:30

(1 row(s) affected)

----------------------------------
2011-08-15 14:30:00.500 +12:30

(1 row(s) affected)

Vea también
datetimeoffset (Transact-SQL )
AT TIME ZONE (Transact-SQL )
DAY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un entero que representa el día (del mes) del argumento date especificado.
Vea Tipos de datos y funciones de fecha y hora (Transact-SQL ) para obtener información general sobre todos los
tipos de datos y las funciones de fecha y hora de Transact-SQL.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DAY ( date )

Argumentos
date
Una expresión que se resuelve en uno de los tipos de datos siguientes:
date
datetime
datetimeoffset
datetime2
smalldatetime
time
Para date, DAY aceptará una expresión de columna, una expresión, un literal de cadena o una variable definida por
el usuario.

Tipo devuelto
int

Valor devuelto
DAY devuelve el mismo valor que DATEPART (day, date).
Si date contiene solo una parte horaria, DAY devolverá 1, el día base.

Ejemplos
Esta instrucción devuelve 30 , el número del propio día.

SELECT DAY('2015-04-30 01:01:01.1234567');

Esta instrucción devuelve 1900, 1, 1 . El argumento date tiene un valor numérico de 0 . SQL Server interpreta 0
como 1 de enero de 1900.

SELECT YEAR(0), MONTH(0), DAY(0);

Vea también
CAST y CONVERT (Transact-SQL )
EOMONTH (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el último día del mes que contiene la fecha especificada, con un desplazamiento opcional.
Convenciones de sintaxis de Transact-SQL

Sintaxis
EOMONTH ( start_date [, month_to_add ] )

Argumentos
start_date
Expresión de fecha que especifica la fecha para la que se devuelve el último día del mes.
month_to_add
Expresión opcional de tipo entero que especifica el número de meses que se van a agregar a start_date.
Si el argumento, month_to_add tiene un valor, EOMONTH agrega el número especificado de meses a start_date y,
después, devuelve el último día del mes de la fecha resultante. Si esto desborda el intervalo válido de fechas,
EOMONTH producirá un error.

Tipo devuelto
date

Notas
La función EOMONTH se puede enviar de forma remota a servidores SQL Server 2012 (11.x) y versiones
posteriores. No se puede enviar de forma remota a servidores con una versión anterior a SQL Server 2012 (11.x).

Ejemplos
A. EOMONTH con un tipo datetime explícito

DECLARE @date DATETIME = '12/1/2011';


SELECT EOMONTH ( @date ) AS Result;
GO

El conjunto de resultados es el siguiente.

Result
------------
2011-12-31

(1 row(s) affected)
B. EOMONTH con parámetro de cadena y conversión implícita

DECLARE @date VARCHAR(255) = '12/1/2011';


SELECT EOMONTH ( @date ) AS Result;
GO

El conjunto de resultados es el siguiente.

Result
------------
2011-12-31

(1 row(s) affected)

C. EOMONTH con y sin el parámetro month_to_add


Nota: Los valores que se muestran en estos conjuntos de resultados reflejan una fecha de ejecución (ambos
inclusive)

12/01/2011

and

12/31/2011

DECLARE @date DATETIME = GETDATE();


SELECT EOMONTH ( @date ) AS 'This Month';
SELECT EOMONTH ( @date, 1 ) AS 'Next Month';
SELECT EOMONTH ( @date, -1 ) AS 'Last Month';
GO

El conjunto de resultados es el siguiente.

This Month
-----------------------
2011-12-31

(1 row(s) affected)

Next Month
-----------------------
2012-01-31

(1 row(s) affected)

Last Month
-----------------------
2011-11-30

(1 row(s) affected)
GETDATE (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la marca de tiempo del sistema de base de datos actual como un valor datetime sin el desplazamiento
de zona horaria de la base de datos. Este valor se deriva del sistema operativo del equipo donde la instancia de
SQL Server se está ejecutando.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los
cambios de comportamiento de T-SQL.

NOTE
SYSDATETIME y SYSUTCDATETIME tienen más precisión de fracciones de segundo que GETDATE y GETUTCDATE.
SYSDATETIMEOFFSET incluye el ajuste de zona horaria del sistema. SYSDATETIME, SYSUTCDATETIME y SYSDATETIMEOFFSET
pueden asignarse a una variable de cualquier tipo de fecha y hora.

Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
GETDATE ( )

Tipo devuelto
datetime

Notas
Las instrucciones Transact-SQL pueden hacer referencia a GETDATE desde cualquier parte desde donde puedan
hacer referencia a una expresión datetime.
GETDATE es una función no determinista. Las vistas y las expresiones que hacen referencia a esta función en una
columna no se pueden indizar.
El uso de SWITCHOFFSET con la función GETDATE () puede hacer que la consulta se ejecute despacio porque el
optimizador de consultas no puede obtener estimaciones de cardinalidad precisas para el valor de GETDATE. Se
recomienda calcular previamente el valor de GETDATE y especificar después ese valor en la consulta como se
muestra en el ejemplo siguiente. Además, use la sugerencia de consulta OPTION (RECOMPILE ) para forzar que
el optimizador de consultas recompile un plan de consulta la próxima vez que se ejecute la misma consulta.
Entonces, el optimizador tendrá estimaciones de cardinalidad precisas para GETDATE () y producirá un plan de
consulta más eficaz.

DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00');


SELECT * FROM t
WHERE c1 > @dt OPTION (RECOMPILE);

Ejemplos
En los ejemplos siguientes se usan las seis funciones del sistema de SQL Server que devuelven la fecha y hora
actuales para devolver la fecha, la hora o ambas. Los valores se devuelven en serie; por consiguiente, sus
fracciones de segundo podrían ser diferentes.
A. Obtener la fecha y hora actuales del sistema

SELECT SYSDATETIME()
,SYSDATETIMEOFFSET()
,SYSUTCDATETIME()
,CURRENT_TIMESTAMP
,GETDATE()
,GETUTCDATE();

El conjunto de resultados es el siguiente.

SYSDATETIME() 2007-04-30 13:10:02.0474381


SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00
SYSUTCDATETIME() 2007-04-30 20:10:02.0474381
CURRENT_TIMESTAMP 2007-04-30 13:10:02.047
GETDATE() 2007-04-30 13:10:02.047
GETUTCDATE() 2007-04-30 20:10:02.047

B. Obtener la fecha actual del sistema

SELECT CONVERT (date, SYSDATETIME())


,CONVERT (date, SYSDATETIMEOFFSET())
,CONVERT (date, SYSUTCDATETIME())
,CONVERT (date, CURRENT_TIMESTAMP)
,CONVERT (date, GETDATE())
,CONVERT (date, GETUTCDATE());

El conjunto de resultados es el siguiente.

SYSDATETIME() 2007-05-03
SYSDATETIMEOFFSET() 2007-05-03
SYSUTCDATETIME() 2007-05-04
CURRENT_TIMESTAMP 2007-05-03
GETDATE() 2007-05-03
GETUTCDATE() 2007-05-04

C. Obtener la hora actual del sistema

SELECT CONVERT (time, SYSDATETIME())


,CONVERT (time, SYSDATETIMEOFFSET())
,CONVERT (time, SYSUTCDATETIME())
,CONVERT (time, CURRENT_TIMESTAMP)
,CONVERT (time, GETDATE())
,CONVERT (time, GETUTCDATE());
El conjunto de resultados es el siguiente.

SYSDATETIME() 13:18:45.3490361
SYSDATETIMEOFFSET()13:18:45.3490361
SYSUTCDATETIME() 20:18:45.3490361
CURRENT_TIMESTAMP 13:18:45.3470000
GETDATE() 13:18:45.3470000
GETUTCDATE() 20:18:45.3470000

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En estos ejemplos se usan las tres funciones del sistema SQL Server que devuelven la fecha y hora actuales para
devolver la fecha, la hora o ambas. Los valores se devuelven en serie; por consiguiente, sus fracciones de segundo
podrían ser diferentes.
D. Obtener la fecha y hora actuales del sistema

SELECT SYSDATETIME()
,CURRENT_TIMESTAMP
,GETDATE();

E. Obtener la fecha actual del sistema

SELECT CONVERT (date, SYSDATETIME())


,CONVERT (date, CURRENT_TIMESTAMP)
,CONVERT (date, GETDATE());

F. Obtener la hora actual del sistema

SELECT CONVERT (time, SYSDATETIME())


,CONVERT (time, CURRENT_TIMESTAMP)
,CONVERT (time, GETDATE());

Ver también
CAST y CONVERT (Transact-SQL )
GETUTCDATE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la marca de tiempo del sistema de la base de datos actual como un valor datetime. El ajuste de zona
horaria de la base de datos no está incluido. Este valor representa la hora UTC actual (Hora universal coordinada).
Este valor se deriva del sistema operativo del equipo donde la instancia de SQL Server se está ejecutando.

NOTE
SYSDATETIME y SYSUTCDATETIME tienen más precisión de fracciones de segundo que GETDATE y GETUTCDATE.
SYSDATETIMEOFFSET incluye el ajuste de zona horaria del sistema. SYSDATETIME, SYSUTCDATETIME y SYSDATETIMEOFFSET
pueden asignarse a una variable de cualquier tipo de fecha y hora.

Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
GETUTCDATE()

Tipos devueltos
datetime

Notas
Las instrucciones Transact-SQL pueden hacer referencia a GETUTCDATE desde cualquier parte desde donde
puedan hacer referencia a una expresión datetime.
GETUTCDATE es una función no determinista. Las vistas y las expresiones que hacen referencia a esta función en
una columna no se pueden indizar.

Ejemplos
Los ejemplos siguientes usan las seis funciones de sistema SQL Server que devuelven fecha y hora actuales para
devolver la fecha, la hora o ambas. Los valores se devuelven en serie; por consiguiente, sus fracciones de segundo
podrían ser diferentes.
A. Obtener la fecha y hora actuales del sistema
SELECT 'SYSDATETIME() ', SYSDATETIME();
SELECT 'SYSDATETIMEOFFSET()', SYSDATETIMEOFFSET();
SELECT 'SYSUTCDATETIME() ', SYSUTCDATETIME();
SELECT 'CURRENT_TIMESTAMP ', CURRENT_TIMESTAMP;
SELECT 'GETDATE() ', GETDATE();
SELECT 'GETUTCDATE() ', GETUTCDATE();
/* Returned:
SYSDATETIME() 2007-05-03 18:34:11.9351421
SYSDATETIMEOFFSET() 2007-05-03 18:34:11.9351421 -07:00
SYSUTCDATETIME() 2007-05-04 01:34:11.9351421
CURRENT_TIMESTAMP 2007-05-03 18:34:11.933
GETDATE() 2007-05-03 18:34:11.933
GETUTCDATE() 2007-05-04 01:34:11.933
*/

B. Obtener la fecha actual del sistema

SELECT 'SYSDATETIME() ', CONVERT (date, SYSDATETIME());


SELECT 'SYSDATETIMEOFFSET()', CONVERT (date, SYSDATETIMEOFFSET());
SELECT 'SYSUTCDATETIME() ', CONVERT (date, SYSUTCDATETIME());
SELECT 'CURRENT_TIMESTAMP ', CONVERT (date, CURRENT_TIMESTAMP);
SELECT 'GETDATE() ', CONVERT (date, GETDATE());
SELECT 'GETUTCDATE() ', CONVERT (date, GETUTCDATE());

/* Returned:
SYSDATETIME() 2007-05-03
SYSDATETIMEOFFSET() 2007-05-03
SYSUTCDATETIME() 2007-05-04
CURRENT_TIMESTAMP 2007-05-03
GETDATE() 2007-05-03
GETUTCDATE() 2007-05-04
*/

C. Obtener la hora actual del sistema

SELECT 'SYSDATETIME() ', CONVERT (time, SYSDATETIME());


SELECT 'SYSDATETIMEOFFSET()', CONVERT (time, SYSDATETIMEOFFSET());
SELECT 'SYSUTCDATETIME() ', CONVERT (time, SYSUTCDATETIME());
SELECT 'CURRENT_TIMESTAMP ', CONVERT (time, CURRENT_TIMESTAMP);
SELECT 'GETDATE() ', CONVERT (time, GETDATE());
SELECT 'GETUTCDATE() ', CONVERT (time, GETUTCDATE());
/* Returned
SYSDATETIME() 18:25:01.6958841
SYSDATETIMEOFFSET() 18:25:01.6958841
SYSUTCDATETIME() 01:25:01.6958841
CURRENT_TIMESTAMP 18:25:01.6930000
GETDATE() 18:25:01.6930000
GETUTCDATE() 01:25:01.6930000
*/

Ver también
CAST y CONVERT (Transact-SQL )
AT TIME ZONE (Transact-SQL )
ISDATE (Transact-SQL)
18/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve 1 si expression es un valor válido de date, time o datetime; en caso contrario, devuelve 0.
ISDATE devuelve 0 si expression es un valor datetime2.
Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ). Tenga en cuenta que el intervalo de datos de fecha y
hora es de 01-01-1753 a 31-12-9999, mientras que el intervalo de datos de fecha es de 01-01-0001 a 31-12-
9999.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ISDATE ( expression )

Argumentos
expression
Es una cadena de caracteres o una expresión que se puede convertir en una cadena de caracteres. La expresión
debe tener menos de 4.000 caracteres. No se permiten tipos de datos de fecha y hora, excepto datetime y
smalldatetime, como argumento para ISDATE.

Tipo devuelto
int

Notas
ISDATE solo es determinista si se usa con la función CONVERT, se especifica el parámetro de estilo CONVERT y
el estilo no es igual a 0, 100, 9 ni 109.
El valor devuelto de ISDATE depende de los valores establecidos por SET DATEFORMAT, SET L ANGUAGE y la
opción de configuración del servidor Idioma predeterminado.

Formatos de expresión ISDATE


Para obtener ejemplos de formatos válidos para los que ISDATE devolverá 1, vea la sección "Formatos de literales
de cadena compatibles para datetime" en los temas datetime y smalldatetime. Para obtener más ejemplo, vea
también la columna Entrada/salida de la sección "Argumentos" de CAST y CONVERT.
En la tabla siguiente se resumen los formatos de expresión de entrada que no son válidos y devuelven 0 o un error.
EXPRESIÓN ISDATE VALOR DEVUELTO DE ISDATE

NULL 0

Valores de tipos de datos incluidos en la lista Tipos de datos 0


en cualquier categoría de tipo de datos distinta de las cadenas
de caracteres, cadenas de caracteres Unicode o fecha y hora.

Valores de los tipos de datos text, ntexto image. 0

Cualquier valor que tiene una escala de precisión por 0


segundos mayor que 3 (.0000 a.0000000... n) ISDATE
devuelve 0 si expression es un valor datetime2, pero
devolverá 1 si expression es un valor datetime válido.

Cualquier valor que mezcla una fecha válida con un valor no 0


válido, por ejemplo 1995-10-1a.

Ejemplos
A. Utilizar ISDATE para probar si una expresión de fecha y hora es válida
En este ejemplo se muestra cómo usar ISDATE para probar si una cadena de caracteres es un tipo datetime
válido.

IF ISDATE('2009-05-12 10:19:41.177') = 1
PRINT 'VALID'
ELSE
PRINT 'INVALID';

B. Mostrar los efectos de los parámetros SET DATEFORMAT y SET LANGUAGE en los valores devueltos
Las instrucciones siguientes muestran los valores que se devuelven al establecer SET DATEFORMAT y SET LANGUAGE .
/* Use these sessions settings. */
SET LANGUAGE us_english;
SET DATEFORMAT mdy;
/* Expression in mdy dateformat */
SELECT ISDATE('04/15/2008'); --Returns 1.
/* Expression in mdy dateformat */
SELECT ISDATE('04-15-2008'); --Returns 1.
/* Expression in mdy dateformat */
SELECT ISDATE('04.15.2008'); --Returns 1.
/* Expression in myd dateformat */
SELECT ISDATE('04/2008/15'); --Returns 1.

SET DATEFORMAT mdy;


SELECT ISDATE('15/04/2008'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('15/2008/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/15/04'); --Returns 0.
SET DATEFORMAT mdy;
SELECT ISDATE('2008/04/15'); --Returns 1.

SET DATEFORMAT dmy;


SELECT ISDATE('15/04/2008'); --Returns 1.
SET DATEFORMAT dym;
SELECT ISDATE('15/2008/04'); --Returns 1.
SET DATEFORMAT ydm;
SELECT ISDATE('2008/15/04'); --Returns 1.
SET DATEFORMAT ymd;
SELECT ISDATE('2008/04/15'); --Returns 1.

SET LANGUAGE English;


SELECT ISDATE('15/04/2008'); --Returns 0.
SET LANGUAGE Hungarian;
SELECT ISDATE('15/2008/04'); --Returns 0.
SET LANGUAGE Swedish;
SELECT ISDATE('2008/15/04'); --Returns 0.
SET LANGUAGE Italian;
SELECT ISDATE('2008/04/15'); --Returns 1.

/* Return to these sessions settings. */


SET LANGUAGE us_english;
SET DATEFORMAT mdy;

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Utilizar ISDATE para probar si una expresión de fecha y hora es válida
En este ejemplo se muestra cómo usar ISDATE para probar si una cadena de caracteres es un tipo datetime
válido.

IF ISDATE('2009-05-12 10:19:41.177') = 1
SELECT 'VALID';
ELSE
SELECT 'INVALID';

Ver también
CAST y CONVERT (Transact-SQL )
MONTH (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un entero que representa la parte del mes de la fecha date especificada.
Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
MONTH ( date )

Argumentos
date
Es una expresión que se puede resolver en un valor time, date, smalldatetime, datetime, datetime2 o
datetimeoffset. El argumento date puede ser una expresión, expresión de columna, variable definida por el
usuario o literal de cadena.

Tipo devuelto
int

Valor devuelto
MONTH devuelve el mismo valor que DATEPART (month, date).
Si date contiene solo una parte horaria, el valor devuelto es 1, el mes base.

Ejemplos
La siguiente instrucción devuelve 4 . Este número corresponde al mes.

SELECT MONTH('2007-04-30T01:01:01.1234567 -07:00');

La siguiente instrucción devuelve 1900, 1, 1 . El argumento para date es el número 0 . SQL Server interpreta 0
como 1 de enero de 1900.

SELECT YEAR(0), MONTH(0), DAY(0);

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
El siguiente ejemplo devuelve 4 . Este número corresponde al mes.

-- Uses AdventureWorks

SELECT TOP 1 MONTH('2007-04-30T01:01:01.1234')


FROM dbo.DimCustomer;

El siguiente ejemplo devuelve 1900, 1, 1 . El argumento para date es el número 0 . SQL Server interpreta 0
como 1 de enero de 1900.

-- Uses AdventureWorks

SELECT TOP 1 YEAR(0), MONTH(0), DAY(0) FROM dbo.DimCustomer;

Ver también
CAST y CONVERT (Transact-SQL )
SMALLDATETIMEFROMPARTS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor smalldatetime de la fecha y la hora especificadas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SMALLDATETIMEFROMPARTS ( year, month, day, hour, minute )

Argumentos
year
Expresión entera que especifica un año.
month
Expresión entera que especifica un mes.
day
Expresión entera que especifica un día.
hour
Expresión entera que especifica horas.
minute
Expresión entera que especifica minutos.

Tipos devueltos
smalldatetime

Notas
Esta función actúa como un constructor para un valor smalldatetime totalmente inicializado. Si los argumentos
no son válidos, se generará un error. Si los argumentos necesarios son NULL, se devuelve un valor NULL.
Esta función se puede enviar de forma remota a servidores de SQL Server 2017 y superiores. No se puede enviar
de forma remota a servidores que tengan una versión inferior a SQL Server 2017.

Ejemplos
SELECT SMALLDATETIMEFROMPARTS ( 2010, 12, 31, 23, 59 ) AS Result

El conjunto de resultados es el siguiente.


Result
---------------------------
2011-01-01 00:00:00

(1 row(s) affected)
SWITCHOFFSET (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor datetimeoffset que ha cambiado el ajuste de zona horaria almacenado por un nuevo ajuste de
zona horaria especificado.
Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
SWITCHOFFSET ( DATETIMEOFFSET, time_zone )

Argumentos
DATETIMEOFFSET
Es una expresión que se puede resolver como un valor datetimeoffset(n).
time_zone
Es una cadena de caracteres en formato [+|-]TZH:TZM o un entero con signo (de minutos) que representa el ajuste
de zona horaria y se supone que reconoce y está ajustado para el horario de verano.

Tipo devuelto
datetimeoffset con la precisión fraccionaria del argumento DATETIMEOFFSET.

Notas
Use SWITCHOFFSET para seleccionar un valor datetimeoffset en el ajuste de zona horaria que sea diferente del
que se almacenó originalmente. SWITCHOFFSET no actualiza el valor time_zone almacenado.
SWITCHOFFSET se puede usar para actualizar una columna datetimeoffset.
Si se usa SWITCHOFFSET con la función GETDATE (), es posible que la consulta se ejecute lentamente. Esto se
debe a que el optimizador de consultas no puede obtener estimaciones de cardinalidad precisas para el valor
datetime. Para resolver este problema, use la sugerencia de consulta OPTION (RECOMPILE ) para obligar al
optimizador de consultas a que vuelva a compilar un plan de consulta la próxima vez que se ejecute la misma
consulta. De este modo, el optimizador tendrá estimaciones de cardinalidad precisas y generará un plan de
consulta más eficaz. Para más información sobre la sugerencia de consulta RECOMPILE, vea Sugerencias de
consulta (Transact-SQL ).

DECLARE @dt datetimeoffset = switchoffset (CONVERT(datetimeoffset, GETDATE()), '-04:00');


SELECT * FROM t
WHERE c1 > @dt OPTION (RECOMPILE);
Ejemplos
En el ejemplo siguiente se usa SWITCHOFFSET para mostrar un ajuste de zona horaria diferente del valor
almacenado en la base de datos.

CREATE TABLE dbo.test


(
ColDatetimeoffset datetimeoffset
);
GO
INSERT INTO dbo.test
VALUES ('1998-09-20 7:45:50.71345 -5:00');
GO
SELECT SWITCHOFFSET (ColDatetimeoffset, '-08:00')
FROM dbo.test;
GO
--Returns: 1998-09-20 04:45:50.7134500 -08:00
SELECT ColDatetimeoffset
FROM dbo.test;
--Returns: 1998-09-20 07:45:50.7134500 -05:00

Ver también
CAST y CONVERT (Transact-SQL )
AT TIME ZONE (Transact-SQL )
SYSDATETIME (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor datetime2(7) que contiene la fecha y hora del equipo en el que la instancia de SQL Server se
está ejecutando.

NOTE
SYSDATETIME y SYSUTCDATETIME tienen más precisión de fracciones de segundo que GETDATE y GETUTCDATE.
SYSDATETIMEOFFSET incluye el ajuste de zona horaria del sistema. SYSDATETIME, SYSUTCDATETIME y SYSDATETIMEOFFSET
pueden asignarse a una variable de cualquier tipo de fecha y hora.

Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
SYSDATETIME ( )

Tipo devuelto
datetime2(7)

Notas
Las instrucciones Transact-SQL pueden hacer referencia a SYSDATETIME en cualquier punto desde el que puedan
hacer referencia a una expresión datetime2(7).
SYSDATETIME es una función no determinista. Las vistas y las expresiones que hacen referencia a esta función en
una columna no se pueden indizar.

NOTE
SQL Server obtiene los valores de fecha y hora usando la API de Windows GetSystemTimeAsFileTime(). La exactitud depende
del hardware del equipo y de la versión de Windows en las que la instancia de SQL Server se esté ejecutando. La precisión de
esta API se fija en 100 nanosegundos. La precisión se puede determinar por medio de la API de Windows
GetSystemTimeAdjustment().

Ejemplos
Los ejemplos siguientes usan las seis funciones de sistema SQL Server que devuelven fecha y hora actuales para
devolver la fecha, la hora o ambas. Los valores se devuelven en serie; por consiguiente, sus fracciones de segundo
podrían ser diferentes.
A. Obtener la fecha y hora actuales del sistema

SELECT SYSDATETIME()
,SYSDATETIMEOFFSET()
,SYSUTCDATETIME()
,CURRENT_TIMESTAMP
,GETDATE()
,GETUTCDATE();
/* Returned:
SYSDATETIME() 2007-04-30 13:10:02.0474381
SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00
SYSUTCDATETIME() 2007-04-30 20:10:02.0474381
CURRENT_TIMESTAMP 2007-04-30 13:10:02.047
GETDATE() 2007-04-30 13:10:02.047
GETUTCDATE() 2007-04-30 20:10:02.047
*/

B. Obtener la fecha actual del sistema

SELECT CONVERT (date, SYSDATETIME())


,CONVERT (date, SYSDATETIMEOFFSET())
,CONVERT (date, SYSUTCDATETIME())
,CONVERT (date, CURRENT_TIMESTAMP)
,CONVERT (date, GETDATE())
,CONVERT (date, GETUTCDATE());

/* All returned 2007-04-30 */

C. Obtener la hora actual del sistema

SELECT CONVERT (time, SYSDATETIME())


,CONVERT (time, SYSDATETIMEOFFSET())
,CONVERT (time, SYSUTCDATETIME())
,CONVERT (time, CURRENT_TIMESTAMP)
,CONVERT (time, GETDATE())
,CONVERT (time, GETUTCDATE());

/* Returned
SYSDATETIME() 13:18:45.3490361
SYSDATETIMEOFFSET()13:18:45.3490361
SYSUTCDATETIME() 20:18:45.3490361
CURRENT_TIMESTAMP 13:18:45.3470000
GETDATE() 13:18:45.3470000
GETUTCDATE() 20:18:45.3470000
*/

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Obtener la fecha y hora actuales del sistema

SELECT SYSDATETIME();

El conjunto de resultados es el siguiente.

--------------------------
7/20/2013 2:49:59 PM
Ver también
CAST y CONVERT (Transact-SQL )
Tipos de datos y funciones de fecha y hora (Transact-SQL )
SYSDATETIMEOFFSET (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor datetimeoffset(7) que contiene la fecha y hora del equipo en el que la instancia de SQL Server
se está ejecutando. El ajuste de zona horaria está incluido.
Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
SYSDATETIMEOFFSET ( )

Tipo devuelto
datetimeoffset(7)

Notas
Las instrucciones Transact-SQL pueden hacer referencia a SYSDATETIMEOFFSET en cualquier punto desde el
que puedan hacer referencia a una expresión datetimeoffset.
SYSDATETIMEOFFSET es una función no determinista. Las vistas y las expresiones que hacen referencia a esta
función en una columna no se pueden indizar.

NOTE
SQL Server obtiene los valores de fecha y hora usando la API de Windows GetSystemTimeAsFileTime(). La exactitud depende
del hardware del equipo y de la versión de Windows en las que la instancia de SQL Server se esté ejecutando. La precisión de
esta API se fija en 100 nanosegundos. La precisión se puede determinar por medio de la API de Windows
GetSystemTimeAdjustment().

Ejemplos
En los ejemplos siguientes se usan las seis funciones del sistema de SQL Server que devuelven la fecha y hora
actuales para devolver la fecha, la hora o ambas. Los valores se devuelven en serie; por consiguiente, sus fracciones
de segundo podrían ser diferentes.
A. Mostrar los formatos que devuelven las funciones de fecha y hora
En el ejemplo siguiente se muestran los distintos formatos que devuelven las funciones de fecha y hora.
SELECT SYSDATETIME() AS SYSDATETIME
,SYSDATETIMEOFFSET() AS SYSDATETIMEOFFSET
,SYSUTCDATETIME() AS SYSUTCDATETIME
,CURRENT_TIMESTAMP AS [CURRENT_TIMESTAMP]
,GETDATE() AS GETDATE
,GETUTCDATE() AS GETUTCDATE;

El conjunto de resultados es el siguiente.

SYSDATETIME() 2007-04-30 13:10:02.0474381


SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00
SYSUTCDATETIME() 2007-04-30 20:10:02.0474381
CURRENT_TIMESTAMP 2007-04-30 13:10:02.047
GETDATE() 2007-04-30 13:10:02.047
GETUTCDATE() 2007-04-30 20:10:02.047

B. Convertir valores de fecha y hora en date


En el ejemplo siguiente se muestra cómo convertir valores de fecha y hora en date .

SELECT CONVERT (date, SYSDATETIME())


,CONVERT (date, SYSDATETIMEOFFSET())
,CONVERT (date, SYSUTCDATETIME())
,CONVERT (date, CURRENT_TIMESTAMP)
,CONVERT (date, GETDATE())
,CONVERT (date, GETUTCDATE());

El conjunto de resultados es el siguiente.

2007-04-30
2007-04-30
2007-04-30
2007-04-30
2007-04-30
2007-04-30

C. Convertir fecha y hora en time


En el ejemplo siguiente se muestra cómo convertir valores de fecha y hora en time .

SELECT CONVERT (time, SYSDATETIME()) AS SYSDATETIME()


,CONVERT (time, SYSDATETIMEOFFSET()) AS SYSDATETIMEOFFSET()
,CONVERT (time, SYSUTCDATETIME()) AS SYSUTCDATETIME()
,CONVERT (time, CURRENT_TIMESTAMP) AS CURRENT_TIMESTAMP
,CONVERT (time, GETDATE()) AS GETDATE()
,CONVERT (time, GETUTCDATE()) AS GETUTCDATE();

El conjunto de resultados es el siguiente.

SYSDATETIME() 13:18:45.3490361
SYSDATETIMEOFFSET()13:18:45.3490361
SYSUTCDATETIME() 20:18:45.3490361
CURRENT_TIMESTAMP 13:18:45.3470000
GETDATE() 13:18:45.3470000
GETUTCDATE() 20:18:45.3470000

Ver también
CAST y CONVERT (Transact-SQL )
Tipos de datos y funciones de fecha y hora (Transact-SQL )
SYSUTCDATETIME (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor datetime2 que contiene la fecha y hora del equipo en el que la instancia de SQL Server se está
ejecutando. La fecha y hora se devuelven como una hora universal coordinada (UTC ). La especificación de
precisión de fracción de segundo tiene un intervalo de 1 a 7 dígitos. La precisión predeterminada es 7 dígitos.

NOTE
SYSDATETIME y SYSUTCDATE tienen más precisión de fracciones de segundo que GETDATE y GETUTCDATE.
SYSDATETIMEOFFSET incluye el ajuste de zona horaria del sistema. SYSDATETIME, SYSUTCDATE y SYSDATETIMEOFFSET
pueden asignarse a una variable de cualquier tipo de fecha y hora.

Para ver información de todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea Funciones y
tipos de datos de fecha y hora.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SYSUTCDATETIME ( )

Tipo devuelto
datetime2

Notas
Las instrucciones Transact-SQL pueden hacer referencia a SYSUTCDATETIME en cualquier punto en el que
puedan hacer referencia a una expresión datetime2.
SYSUTCDATETIME es una función no determinista. Las vistas y las expresiones que hacen referencia a esta
función en una columna no se pueden indizar.

NOTE
SQL Server obtiene los valores de fecha y hora usando la API de Windows GetSystemTimeAsFileTime(). La exactitud depende
del hardware del equipo y de la versión de Windows en las que la instancia de SQL Server se esté ejecutando. La precisión de
esta API se fija en 100 nanosegundos. La precisión se puede determinar por medio de la API de Windows
GetSystemTimeAdjustment().

Ejemplos
En los ejemplos siguientes se usan las seis funciones del sistema de SQL Server que devuelven la fecha y hora
actuales para devolver la fecha, la hora o ambas. Los valores se devuelven en serie; por consiguiente, sus fracciones
de segundo podrían ser diferentes.
A. Mostrar los formatos que devuelven las funciones de fecha y hora
En el ejemplo siguiente se muestran los distintos formatos que devuelven las funciones de fecha y hora.

SELECT SYSDATETIME() AS SYSDATETIME


,SYSDATETIMEOFFSET() AS SYSDATETIMEOFFSET
,SYSUTCDATETIME() AS SYSUTCDATETIME
,CURRENT_TIMESTAMP AS CURRENT_TIMESTAMP
,GETDATE() AS GETDATE
,GETUTCDATE() AS GETUTCDATE;

El conjunto de resultados es el siguiente.

SYSDATETIME() 2007-04-30 13:10:02.0474381


SYSDATETIMEOFFSET()2007-04-30 13:10:02.0474381 -07:00
SYSUTCDATETIME() 2007-04-30 20:10:02.0474381
CURRENT_TIMESTAMP 2007-04-30 13:10:02.047
GETDATE() 2007-04-30 13:10:02.047
GETUTCDATE() 2007-04-30 20:10:02.047

B. Convertir valores de fecha y hora en date


En el ejemplo siguiente se muestra cómo convertir valores de fecha y hora en date .

SELECT CONVERT (date, SYSDATETIME())


,CONVERT (date, SYSDATETIMEOFFSET())
,CONVERT (date, SYSUTCDATETIME())
,CONVERT (date, CURRENT_TIMESTAMP)
,CONVERT (date, GETDATE())
,CONVERT (date, GETUTCDATE());

El conjunto de resultados es el siguiente.

2007-04-30
2007-04-30
2007-04-30
2007-04-30
2007-04-30
2007-04-30

C. Convertir valores de fecha y hora en time


En el ejemplo siguiente se muestra cómo convertir valores de fecha y hora en time .

DECLARE @DATETIME DATETIME = GetDate();


DECLARE @TIME TIME
SELECT @TIME = CONVERT(time, @DATETIME)
SELECT @TIME AS 'Time', @DATETIME AS 'Date Time'

El conjunto de resultados es el siguiente.

Time Date Time


13:49:33.6330000 2009-04-22 13:49:33.633

Ver también
CAST y CONVERT (Transact-SQL )
Tipos de datos y funciones de fecha y hora (Transact-SQL )
AT TIME ZONE (Transact-SQL )
TIMEFROMPARTS (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor time para la hora especificada y con la precisión indicada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )

Argumentos
hour
Expresión entera que especifica horas.
minute
Expresión entera que especifica minutos.
segundos
Expresión entera que especifica segundos.
fractions
Expresión entera que especifica fracciones.
precisión
Literal entero que especifica la precisión del valor time que se va a devolver.

Tipos devueltos
time( precision )

Notas
TIMEROMPARTS devuelve un valor de hora totalmente inicializado. Si los argumentos no son válidos, se generará
un error. Si alguno de los parámetros es NULL, se devuelve NULL. Pero si el argumento precision es NULL, se
generará un error.
El argumento fractions depende del argumento precision. Por ejemplo, si precision es 7, cada fracción representa
100 nanosegundos; si precision es 3, cada fracción representa un milisegundo. Si el valor de precision es cero, el
valor de fractions también debe ser cero; de lo contrario, se generará un error.
Esta función se puede enviar de forma remota a servidores SQL Server 2012 (11.x) y posteriores. No se puede
enviar de forma remota a servidores que tengan una versión anterior a SQL Server 2012 (11.x).

Ejemplos
A. Ejemplo simple sin fracciones de segundo
SELECT TIMEFROMPARTS ( 23, 59, 59, 0, 0 ) AS Result;

El conjunto de resultados es el siguiente.

Result
--------------------
23:59:59.0000000

(1 row(s) affected)

B. Ejemplo con fracciones de segundo


En este ejemplo se muestra el uso de los parámetros fractions y precision:
1. Cuando fractions tiene el valor 5 y precision, el valor 1, el valor de fractions representa 5/10 de un segundo.
2. Cuando fractions tiene el valor 50 y precision, el valor 2, el valor de fractions representa 50/100 de un
segundo.
3. Cuando fractions tiene el valor 500 y precision tiene el valor 3, el valor de fractions representa 500/1000 de
segundo.

SELECT TIMEFROMPARTS ( 14, 23, 44, 5, 1 );


SELECT TIMEFROMPARTS ( 14, 23, 44, 50, 2 );
SELECT TIMEFROMPARTS ( 14, 23, 44, 500, 3 );
GO

El conjunto de resultados es el siguiente.

----------------
14:23:44.5

(1 row(s) affected)

----------------
14:23:44.50

(1 row(s) affected)

----------------
14:23:44.500

(1 row(s) affected)
TODATETIMEOFFSET (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor de tipo datetimeoffset que se traduce a partir de una expresión datetime2.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TODATETIMEOFFSET ( expression , time_zone )

Argumentos
expression
Es una expresión que se resuelve en un valor de tipo datetime2.

NOTE
La expresión no puede ser del tipo text, ntext o image, ya que estos tipos no se pueden convertir implícitamente en
varchar o nvarchar.

time_zone
Es una expresión que representa el desplazamiento de zona horaria en minutos (si es un entero), por ejemplo -120,
o las horas y los minutos (si es una cadena), como “+13.00". El intervalo es de +14 a -14 (en horas). La expresión
se interpreta en la hora local para el valor time_zone especificado.

NOTE
Si la expresión es una cadena de caracteres, debe tener el formato {+|-}TZH:THM.

Tipo devuelto
datetimeoffset. La precisión fraccionaria es la misma que la del argumento datetime.

Ejemplos
A. Cambiar el ajuste de zona horaria de la fecha y hora actuales
En el ejemplo siguiente se cambia el ajuste de zona horaria de la fecha y hora actuales a la zona horaria -07:00 .

DECLARE @todaysDateTime datetime2;


SET @todaysDateTime = GETDATE();
SELECT TODATETIMEOFFSET (@todaysDateTime, '-07:00');
-- RETURNS 2007-08-30 15:51:34.7030000 -07:00

B. Cambiar el ajuste de zona horaria en minutos


En el ejemplo siguiente se cambia la zona horaria actual a -120 minutos.

DECLARE @todaysDate datetime2;


SET @todaysDate = GETDATE();
SELECT TODATETIMEOFFSET (@todaysDate, -120);
-- RETURNS 2007-08-30 15:52:37.8770000 -02:00

C. Agregar un ajuste de zona horaria de 13 horas


En el ejemplo siguiente se agrega un ajuste de zona horaria de 13 horas a una fecha y hora.

DECLARE @dateTime datetimeoffset(7)= '2007-08-28 18:00:30';


SELECT TODATETIMEOFFSET (@dateTime, '+13:00');
-- RETURNS 2007-08-28 18:00:30.0000000 +13:00

Ver también
CAST y CONVERT (Transact-SQL )
Tipos de datos y funciones de fecha y hora (Transact-SQL )
AT TIME ZONE (Transact-SQL )
YEAR (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un entero que representa la parte del año del parámetro date especificado.
Para ver información general sobre todos los tipos de datos y funciones de fecha y hora de Transact-SQL, vea
Tipos de datos y funciones de fecha y hora (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
YEAR ( date )

Argumentos
date
Es una expresión que se puede resolver en un valor time, date, smalldatetime, datetime, datetime2 o
datetimeoffset. El argumento date puede ser una expresión, expresión de columna, variable definida por el
usuario o literal de cadena.

Tipos devueltos
int

Valor devuelto
YEAR devuelve el mismo valor que DATEPART (year, date).
Si date contiene únicamente una parte horaria, el valor devuelto es 1900, el año base.

Ejemplos
La siguiente instrucción devuelve 2010 . Este número corresponde al año.

SELECT YEAR('2010-04-30T01:01:01.1234567-07:00');

La siguiente instrucción devuelve 1900, 1, 1 . El argumento para date es el número 0 . SQL Server interpreta 0
como 1 de enero de 1900.

SELECT YEAR(0), MONTH(0), DAY(0);

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
La siguiente instrucción devuelve 1900, 1, 1 . El argumento para date es el número 0 . SQL Server interpreta 0
como 1 de enero de 1900.

SELECT TOP 1 YEAR(0), MONTH(0), DAY(0);

Ver también
CAST y CONVERT (Transact-SQL )
Funciones JSON (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Use las funciones descritas en las páginas de esta sección para validar o cambiar el texto JSON o para extraer
valores simples o complejos.

FUNCIÓN DESCRIPCIÓN

ISJSON Prueba si una cadena contiene un valor JSON válido.

JSON_VALUE Extrae un valor escalar de una cadena JSON.

JSON_QUERY Extrae un objeto o una matriz desde una cadena JSON.

JSON_MODIFY Actualiza el valor de una propiedad en una cadena JSON y


devuelve la cadena JSON actualizada.

Para obtener más información sobre la compatibilidad integrada con JSON en SQL Server, vea Datos JSON (SQL
Server).

Ver también
Validar, consultar y cambiar datos JSON con funciones integradas (SQL Server)
Expresiones de ruta de acceso JSON (SQL Server)
Datos JSON (SQL Server)
ISJSON (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Prueba si una cadena contiene un valor JSON válido.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ISJSON ( expression )

Argumentos
expression
Cadena que se va a comprobar.

Valor devuelto
Devuelve 1 si la cadena contiene un valor JSON válido; en caso contrario, devuelve 0. Devuelve null si expression
es null.
No devuelve errores.

Notas
ISJSON no comprueba la unicidad de las claves en el mismo nivel.

Ejemplos
Ejemplo 1
En el siguiente ejemplo se ejecuta un bloque de instrucciones de forma condicional si el valor del parámetro
@param contiene un valor JSON válido.

DECLARE @param <data type>


SET @param = <value>

IF (ISJSON(@param) > 0)
BEGIN
-- Do something with the valid JSON value of @param.
END

Ejemplo 2
En el ejemplo siguiente, se devuelven las filas en las que la columna json_col contiene JSON válido.
SELECT id, json_col
FROM tab1
WHERE ISJSON(json_col) > 0

Ver también
Datos JSON (SQL Server)
JSON_VALUE (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Extrae un valor escalar de una cadena JSON.
Para extraer un objeto o una matriz de una cadena JSON en lugar de un valor escalar, vea JSON_QUERY
(Transact-SQL ). Para información sobre las diferencias entre JSON_VALUE y JSON_QUERY, vea Comparación
de JSON_VALUE y JSON_QUERY.
Convenciones de sintaxis de Transact-SQL

Sintaxis
JSON_VALUE ( expression , path )

Argumentos
expression
Expresión. Suele ser el nombre de una variable o una columna con texto JSON.
Si JSON_VALUE detecta JSON que no es válido en expression antes de encontrar el valor identificado por path,
la función devuelve un error. Si *JSON_VALUE no encuentra el valor identificado por path, examina todo el texto y
devuelve un error si detecta JSON que no es válido en algún lugar de expression.
path
Ruta de acceso JSON que especifica la propiedad que se va a extraer. Para más información, vea Expresiones de
ruta de acceso JSON (SQL Server).
En SQL Server 2017 (14.x) y en Base de datos SQL de Azure, puede proporcionar una variable como el valor de
path.
Si el formato de path no es válido, JSON_VALUE devuelve un error.

Valor devuelto
Devuelve un solo valor de texto de tipo nvarchar (4000). La intercalación del valor devuelto es la misma que la
intercalación de la expresión de entrada.
Si el valor es mayor que 4000 caracteres:
En el modo lax, JSON_VALUE devuelve NULL.
En el modo strict, JSON_VALUE devuelve un error.
Si tiene que devolver valores escalares mayores que 4000 caracteres, use OPENJSON en lugar de
JSON_VALUE. Para obtener más información, vea OPENJSON (Transact-SQL ).

Notas
Modo lax y modo strict
Observe el siguiente texto JSON:

DECLARE @jsonInfo NVARCHAR(MAX)

SET @jsonInfo=N'{
"info":{
"type":1,
"address":{
"town":"Bristol",
"county":"Avon",
"country":"England"
},
"tags":["Sport", "Water polo"]
},
"type":"Basic"
}'

En la tabla siguiente se compara el comportamiento de JSON_VALUE en modo lax y modo strict. Para más
información sobre la especificación del modo de ruta de acceso opcional (lax o strict), vea Expresiones de ruta de
acceso JSON (SQL Server).

VALOR DEVUELTO EN EL MODO VALOR DEVUELTO EN EL MODO


RUTA DE ACCESO LAX STRICT MÁS INFORMACIÓN

$ NULL Error No es un valor escalar.

Use JSON_QUERY en su
lugar.

$.info.type N'1' N'1' N/A

$.info.address.town N'Bristol' N'Bristol' N/A

$.info."address" NULL Error No es un valor escalar.

Use JSON_QUERY en su
lugar.

$.info.tags NULL Error No es un valor escalar.

Use JSON_QUERY en su
lugar.

$.info.type[0] NULL Error No es una matriz.

$.info.none NULL Error La propiedad no existe.

Ejemplos
Ejemplo 1
En el ejemplo siguiente se usan los valores de las propiedades JSON town y state en los resultados de la
consulta. Puesto que JSON_VALUE conserva la intercalación del origen, el criterio de ordenación de los
resultados depende de la intercalación de la columna jsonInfo .
NOTE
(En este ejemplo se da por supuesto que una tabla denominada Person.Person contiene una columna de texto JSON
jsonInfo y que esta columna tiene la estructura que se ha mostrado anteriormente en el análisis del modo lax y el modo
strict. En la base de datos de ejemplo de AdventureWorks, la tabla Person realmente no contiene una columna jsonInfo
).

SELECT FirstName, LastName,


JSON_VALUE(jsonInfo,'$.info.address[0].town') AS Town
FROM Person.Person
WHERE JSON_VALUE(jsonInfo,'$.info.address[0].state') LIKE 'US%'
ORDER BY JSON_VALUE(jsonInfo,'$.info.address[0].town')

Ejemplo 2
En el ejemplo siguiente se extrae el valor de la propiedad JSON town en una variable local.

DECLARE @jsonInfo NVARCHAR(MAX)


DECLARE @town NVARCHAR(32)

SET @jsonInfo=N'<array of address info>'

SET @town=JSON_VALUE(@jsonInfo,'$.info.address.town')

Ejemplo 3
En el ejemplo siguiente se crean columnas calculadas en función de los valores de propiedades JSON.

CREATE TABLE dbo.Store


(
StoreID INT IDENTITY(1,1) NOT NULL,
Address VARCHAR(500),
jsonContent NVARCHAR(8000),
Longitude AS JSON_VALUE(jsonContent, '$.address[0].longitude'),
Latitude AS JSON_VALUE(jsonContent, '$.address[0].latitude')
)

Ver también
Expresiones de ruta de acceso JSON (SQL Server)
Datos JSON (SQL Server)
JSON_QUERY (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Extrae un objeto o una matriz desde una cadena JSON.
Para extraer un valor escalar de una cadena JSON en lugar de un objeto o una matriz, vea JSON_VALUE
(Transact-SQL ). Para información sobre las diferencias entre JSON_VALUE y JSON_QUERY, vea Comparación
de JSON_VALUE y JSON_QUERY.
Convenciones de sintaxis de Transact-SQL

Sintaxis
JSON_QUERY ( expression [ , path ] )

Argumentos
expression
Expresión. Suele ser el nombre de una variable o una columna con texto JSON.
Si JSON_QUERY detecta JSON que no es válido en expresión antes de encontrar el valor identificado por path,
la función devuelve un error. Si JSON_QUERY no encuentra el valor identificado por path, examina todo el texto
y devuelve un error si detecta JSON que no es válido en algún lugar de expresión.
path
Ruta de acceso JSON que especifica el objeto o la matriz que se va a extraer.
En SQL Server 2017 (14.x) y en Base de datos SQL de Azure, puede proporcionar una variable como el valor de
path.
La ruta de acceso JSON puede especificar el modo lax o strict para el análisis. Si no se especifica el modo de
análisis, el modo lax es el valor predeterminado. Para más información, vea Expresiones de ruta de acceso JSON
(SQL Server).
El valor predeterminado para path es "$". Como resultado, si no se proporciona un valor para path,
JSON_QUERY devuelve la expresión de entrada.
Si el formato de path no es válido, JSON_QUERY devuelve un error.

Valor devuelto
Devuelve un fragmento de JSON de tipo nvarchar(max). La intercalación del valor devuelto es la misma que la
intercalación de la expresión de entrada.
Si el valor no es un objeto o una matriz:
En el modo lax, JSON_QUERY devuelve NULL.
En el modo strict, JSON_QUERY devuelve un error.
Notas
Modo lax y modo strict
Observe el siguiente texto JSON:

{
"info": {
"type": 1,
"address": {
"town": "Bristol",
"county": "Avon",
"country": "England"
},
"tags": ["Sport", "Water polo"]
},
"type": "Basic"
}

En la tabla siguiente se compara el comportamiento de JSON_QUERY en modo lax y modo strict. Para más
información sobre la especificación del modo de ruta de acceso opcional (lax o strict), vea Expresiones de ruta de
acceso JSON (SQL Server).

VALOR DEVUELTO EN EL MODO VALOR DEVUELTO EN EL MODO


RUTA DE ACCESO LAX STRICT MÁS INFORMACIÓN

$ Devuelve todo el texto Devuelve todo el texto N/A


JSON. JSON.

$.info.type NULL Error No es un objeto o una


matriz.

Use JSON_VALUE en su
lugar.

$.info.address.town NULL Error No es un objeto o una


matriz.

Use JSON_VALUE en su
lugar.

$.info."address" N"{ "town":"Bristol", N"{ "town":"Bristol", N/A


"county":"Avon", "county":"Avon",
"country":"England" }" "country":"England" }"

$.info.tags N"[ "Sport", "Water polo"]" N"[ "Sport", "Water polo"]" N/A

$.info.type[0] NULL Error No es una matriz.

$.info.none NULL Error La propiedad no existe.

Uso de JSON_QUERY con FOR JSON


JSON_QUERY devuelve un fragmento de JSON válido. Como resultado, FOR JSON no incluye entre caracteres
de escape los caracteres especiales del valor devuelto de JSON_QUERY.
Si se van a devolver resultados con FOR JSON y se van a incluir datos que ya están en formato JSON (en una
columna o como resultado de una expresión), encapsule los datos JSON con JSON_QUERY sin el parámetro
path.
Ejemplos
Ejemplo 1
En el ejemplo siguiente se muestra cómo devolver un fragmento de JSON de una columna CustomFields en los
resultados de la consulta.

SELECT PersonID,FullName,
JSON_QUERY(CustomFields,'$.OtherLanguages') AS Languages
FROM Application.People

Ejemplo 2
En el ejemplo siguiente se muestra cómo incluir fragmentos de JSON en la salida de la cláusula FOR JSON.

SELECT StockItemID, StockItemName,


JSON_QUERY(Tags) as Tags,
JSON_QUERY(CONCAT('["',ValidFrom,'","',ValidTo,'"]')) ValidityPeriod
FROM Warehouse.StockItems
FOR JSON PATH

Ver también
Expresiones de ruta de acceso JSON (SQL Server)
Datos JSON (SQL Server)
JSON_MODIFY (Transact-SQL)
17/07/2018 • 9 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Actualiza el valor de una propiedad en una cadena JSON y devuelve la cadena JSON actualizada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
JSON_MODIFY ( expression , path , newValue )

Argumentos
expression
Expresión. Suele ser el nombre de una variable o una columna con texto JSON.
JSON_MODIFY devuelve un error si expression no contiene un valor JSON válido.
path
Expresión de ruta de acceso JSON que especifica la propiedad que se va a actualizar.
path tiene la siguiente sintaxis:
[append] [ lax | strict ] $.<json path>

append
Modificador opcional que especifica que el nuevo valor se debe anexar a la matriz a la que hace referencia
<json path>.
lax
Especifica que la propiedad a la que hace referencia <json path> no tiene que existir necesariamente. Si la
propiedad no está presente, JSON_MODIFY intenta insertar el nuevo valor en la ruta de acceso
especificada. Es posible que la inserción no se realice si la propiedad no se puede insertar en la ruta de
acceso. Si no se especifica lax o strict, lax es el modo predeterminado.
strict
Especifica que la propiedad a la que hace referencia <json path> debe estar en la expresión JSON. Si la
propiedad no está presente, JSON_MODIFY devuelve un error.
<json path>
Especifica la ruta de acceso de la propiedad que se va a actualizar. Para más información, vea Expresiones de
ruta de acceso JSON (SQL Server).
En SQL Server 2017 (14.x) y en Base de datos SQL de Azure, puede proporcionar una variable como el valor de
path.
JSON_MODIFY devuelve un error si el formato de path no es válido.
newValue
El nuevo valor de la propiedad especificada por path.
En el modo lax, JSON_MODIFY elimina la clave especificada si el nuevo valor es NULL.
JSON_MODIFY convierte todos los caracteres especiales en el nuevo valor si el tipo del valor es NVARCHAR o
VARCHAR. No se aplicará escape a un valor de texto si presenta un formato JSON correcto generado por FOR
JSON, JSON_QUERY o JSON_MODIFY.

Valor devuelto
Devuelve el valor actualizado de expression como texto con formato JSON correcto.

Notas
La función JSON_MODIFY permite actualizar el valor de una propiedad existente, insertar un nuevo par clave-
valor o eliminar una clave según una combinación de modos y valores proporcionados.
En la siguiente tabla se compara el comportamiento de JSON_MODIFY en modo lax y en modo strict. Para más
información sobre la especificación del modo de ruta de acceso opcional (lax o strict), vea Expresiones de ruta de
acceso JSON (SQL Server).

VALOR EXISTENTE LA RUTA DE ACCESO EXISTE MODO LAX MODO STRICT

Not NULL Sí Se actualiza el valor Se actualiza el valor


existente. existente.

Not NULL no Se intenta crear un par Error: INVALID_PROPERTY


clave-valor en la ruta de
acceso especificada.

Esto puede producir un


error. Por ejemplo, si se
especifica la ruta de acceso
$.user.setting.theme ,
JSON_MODIFY no inserta la
clave theme si los objetos
$.user o
$.user.settings no
existen, o bien si la
configuración es una matriz
o un valor escalar.

NULL Sí Se elimina la propiedad El valor actual se establece


existente. en NULL.

NULL no No sucede nada. El primer Error: INVALID_PROPERTY


argumento se devuelve
como resultado.

En el modo lax, JSON_MODIFY intenta crear un par clave-valor, pero en algunos casos se podría producir un error.

Ejemplos
Ejemplo: operaciones básicas
En el siguiente ejemplo se muestran las operaciones básicas que se pueden realizar con texto JSON.
Consulta
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'

PRINT @info

-- Update name

SET @info=JSON_MODIFY(@info,'$.name','Mike')

PRINT @info

-- Insert surname

SET @info=JSON_MODIFY(@info,'$.surname','Smith')

PRINT @info

-- Delete name

SET @info=JSON_MODIFY(@info,'$.name',NULL)

PRINT @info

-- Add skill

SET @info=JSON_MODIFY(@info,'append $.skills','Azure')

PRINT @info

Resultado

{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL"],
"surname": "Smith"
} {
"skills": ["C#", "SQL"],
"surname": "Smith"
} {
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}

Ejemplo: varias actualizaciones


Con JSON_MODIFY solo se puede actualizar una propiedad. Si tiene que realizar varias actualizaciones, puede
usar varias llamadas JSON_MODIFY.
Consulta
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'

PRINT @info

-- Multiple updates

SET @info=JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(@info,'$.name','Mike'),'$.surname','Smith'),'append
$.skills','Azure')

PRINT @info

Resultado

{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "Mike",
"skills": ["C#", "SQL", "Azure"],
"surname": "Smith"
}

Ejemplo: cambiar una clave de nombre


En el siguiente ejemplo se muestra cómo cambiar el nombre de una propiedad en texto JSON con la función
JSON_MODIFY. En primer lugar, puede tomar el valor de una propiedad existente e insertarlo como un nuevo par
clave-valor. Luego, puede eliminar la antigua clave estableciendo el valor de la propiedad anterior en NULL.
Consulta

DECLARE @product NVARCHAR(100)='{"price":49.99}'

PRINT @product

-- Rename property

SET @product=
JSON_MODIFY(
JSON_MODIFY(@product,'$.Price',CAST(JSON_VALUE(@product,'$.price') AS NUMERIC(4,2))),
'$.price',
NULL
)

PRINT @product

Resultado

{
"price": 49.99
} {
"Price": 49.99
}

Si no convierte el nuevo valor en un tipo numérico, JSON_MODIFY lo trata como texto y lo coloca entre comillas
dobles.
Ejemplo: aumentar un valor
En el siguiente ejemplo se muestra cómo aumentar el valor de una propiedad en texto JSON con la función
JSON_MODIFY. En primer lugar, puede tomar el valor de la propiedad existente e insertarlo como un nuevo par
clave-valor. Luego, puede eliminar la antigua clave estableciendo el valor de la propiedad anterior en NULL.
Consulta

DECLARE @stats NVARCHAR(100)='{"click_count": 173}'

PRINT @stats

-- Increment value

SET @stats=JSON_MODIFY(@stats,'$.click_count',
CAST(JSON_VALUE(@stats,'$.click_count') AS INT)+1)

PRINT @stats

Resultado

{
"click_count": 173
} {
"click_count": 174
}

Ejemplo: modificar un objeto JSON


JSON_MODIFY trata el argumento newValue como texto sin formato incluso cuando contiene texto con formato
JSON correcto. Como resultado, la salida JSON de la función se inserta entre comillas dobles y todos los
caracteres especiales son caracteres de escape, tal y como se muestra en el siguiente ejemplo.
Consulta

DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'

PRINT @info

-- Update skills array

SET @info=JSON_MODIFY(@info,'$.skills','["C#","T-SQL","Azure"]')

PRINT @info

Resultado

{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": "["C#","T-SQL","Azure"]"
}

Para evitar el escape automático, proporcione un newValue con la función JSON_QUERY. JSON_MODIFY sabe
que el valor devuelto por JSON_MODIFY tiene un formato JSON correcto, por lo que aplica escape.
Consulta
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'

PRINT @info

-- Update skills array

SET @info=JSON_MODIFY(@info,'$.skills',JSON_QUERY('["C#","T-SQL","Azure"]'))

PRINT @info

Resultado

{
"name": "John",
"skills": ["C#", "SQL"]
} {
"name": "John",
"skills": ["C#", "T-SQL", "Azure"]
}

Ejemplo: actualizar una columna JSON


En el siguiente ejemplo se actualiza el valor de una propiedad en una columna de tabla que contiene JSON.

UPDATE Employee
SET jsonCol=JSON_MODIFY(jsonCol,"$.info.address.town",'London')
WHERE EmployeeID=17

Ver también
Expresiones de ruta de acceso JSON (SQL Server)
Datos JSON (SQL Server)
Funciones matemáticas (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones escalares realizan un cálculo, normalmente basado en valores de entrada
proporcionados como argumentos, y devuelven un valor numérico:

ABS DEGREES RAND

ACOS EXP ROUND

ASIN FLOOR SIGN

ATAN LOG SIN

ATN2 LOG10 SQRT

CEILING PI SQUARE

COS POWER TAN

COT RADIANS

NOTE
Las funciones aritméticas, como ABS, CEILING, DEGREES, FLOOR, POWER, RADIANS y SIGN, devuelven un valor del
mismo tipo de datos que el valor de entrada. Las funciones trigonométricas y otras funciones, incluidas EXP, LOG, LOG10,
SQUARE y SQRT, convierten sus valores de entrada a float y devuelven un valor de tipo float.

Todas las funciones matemáticas, excepto RAND, son deterministas, lo que significa que devuelven el mismo
resultado cada vez que se llaman con un conjunto específico de valores de entrada. RAND es determinista solo
cuando se especifica un parámetro de inicialización. Para más información sobre el determinismo de las
funciones, vea Funciones deterministas y no deterministas.

Ver también
(Transact-SQL )
Funciones integradas (Transact-SQL )
ABS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Función matemática que devuelve el valor absoluto positivo de una expresión numérica específica. ( ABS cambia
los valores negativos por valores positivos. ABS no tiene ningún efecto en los valores cero o positivos).
Convenciones de sintaxis de Transact-SQL

Sintaxis
ABS ( numeric_expression )

Argumentos
numeric_expression
Una expresión de la categoría de tipo de datos numérico exacto o numérico aproximado.

Tipos devueltos
Devuelve el mismo tipo que numeric_expression.

Ejemplos
En este ejemplo se muestra el resultado de usar la función ABS en tres números distintos.

SELECT ABS(-1.0), ABS(0.0), ABS(1.0);

El conjunto de resultados es el siguiente.

---- ---- ----


1.0 .0 1.0

La función ABS puede causar un error de desbordamiento cuando el valor absoluto de un número supera el
número más grande que puede representar el tipo de datos especificado. Por ejemplo, el tipo de datos int tiene
un rango de valores comprendido entre -2,147,483,648 y 2,147,483,647 . El cálculo del valor absoluto del entero
con signo -2,147,483,648 causará un error de desbordamiento porque su valor absoluto supera el límite del
intervalo positivo para el tipo de datos int .

DECLARE @i int;
SET @i = -2147483648;
SELECT ABS(@i);
GO

Devuelve este mensaje de error:


"Mensaje 8115, nivel 16, estado 2, línea 3"
“Error de desbordamiento aritmético al convertir expresión al tipo de datos int”.

Vea también
CAST y CONVERT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones matemáticas (Transact-SQL )
Funciones integradas (Transact-SQL )
ACOS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Una función que devuelve el ángulo, expresado en radianes, cuyo coseno es la expresión float especificada.
También se denomina arcoseno.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ACOS ( float_expression )

Argumentos
float_expression
Es una expresión o bien de tipo float o bien de un tipo que se puede convierte en float de manera implícita. Solo
se admite un valor comprendido entre -1,00 y 1,00. Con valores fuera de este intervalo se devuelve NULL, y ASIN
notifica un error del dominio.

Tipos devueltos
float

Ejemplos
En este ejemplo se devuelve el valor ACOS del número especificado.

SET NOCOUNT OFF;


DECLARE @cos float;
SET @cos = -1.0;
SELECT 'The ACOS of the number is: ' + CONVERT(varchar, ACOS(@cos));

El conjunto de resultados es el siguiente.

---------------------------------
The ACOS of the number is: 3.14159

(1 row(s) affected)

Vea también
Funciones matemáticas (Transact-SQL )
Funciones
ASIN (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Una función que devuelve el ángulo, expresado en radianes, cuyo seno es la expresión float especificada. También
se denomina arcoseno.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ASIN ( float_expression )

Argumentos
float_expression
Es una expresión o bien de tipo float o bien de un tipo que se puede convierte en float de manera implícita. Solo
se admite un valor comprendido entre -1,00 y 1,00. Con valores fuera de este intervalo se devuelve NULL, y ASIN
notifica un error del dominio.

Tipos de valores devueltos


float

Ejemplos
En este ejemplo se toma una expresión float y se devuelve el valor de ASIN del ángulo especificado.

/* The first value will be -1.01. This fails because the value is
outside the range.*/
DECLARE @angle float
SET @angle = -1.01
SELECT 'The ASIN of the angle is: ' + CONVERT(varchar, ASIN(@angle))
GO

-- The next value is -1.00.


DECLARE @angle float
SET @angle = -1.00
SELECT 'The ASIN of the angle is: ' + CONVERT(varchar, ASIN(@angle))
GO

-- The next value is 0.1472738.


DECLARE @angle float
SET @angle = 0.1472738
SELECT 'The ASIN of the angle is: ' + CONVERT(varchar, ASIN(@angle))
GO

El conjunto de resultados es el siguiente.


-------------------------
.Net SqlClient Data Provider: Msg 3622, Level 16, State 1, Line 3
A domain error occurred.

---------------------------------
The ASIN of the angle is: -1.5708

(1 row(s) affected)

----------------------------------
The ASIN of the angle is: 0.147811

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
Este ejemplo devuelve el arcoseno de 1,00.

SELECT ASIN(1.00) AS asinCalc;

En este ejemplo se devuelve un error, porque se solicita el arcoseno de un valor fuera del intervalo permitido.

SELECT ASIN(1.1472738) AS asinCalc;

Vea también
CEILING (Transact-SQL )
Funciones matemáticas (Transact-SQL )
SET ARITHIGNORE (Transact-SQL )
SET ARITHABORT (Transact-SQL )
ATAN (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Una función que devuelve el ángulo en radianes cuya tangente es una expresión de tipo float especificada.
También se denomina arcotangente.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ATAN ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o bien de un tipo que se convierte en float de manera implícita.

Tipos de valores devueltos


float

Ejemplos
En este ejemplo se toma una expresión float y se devuelve el valor de ATAN del ángulo especificado.

SELECT 'The ATAN of -45.01 is: ' + CONVERT(varchar, ATAN(-45.01))


SELECT 'The ATAN of -181.01 is: ' + CONVERT(varchar, ATAN(-181.01))
SELECT 'The ATAN of 0 is: ' + CONVERT(varchar, ATAN(0))
SELECT 'The ATAN of 0.1472738 is: ' + CONVERT(varchar, ATAN(0.1472738))
SELECT 'The ATAN of 197.1099392 is: ' + CONVERT(varchar, ATAN(197.1099392))
GO

El conjunto de resultados es el siguiente.


-------------------------------
The ATAN of -45.01 is: -1.54858

(1 row(s) affected)

--------------------------------
The ATAN of -181.01 is: -1.56527

(1 row(s) affected)

--------------------------------
The ATAN of 0 is: 0

(1 row(s) affected)

----------------------------------
The ATAN of 0.1472738 is: 0.146223

(1 row(s) affected)

-----------------------------------
The ATAN of 197.1099392 is: 1.56572

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En este ejemplo se toma una expresión float y se devuelve el arcotangente del ángulo especificado.

SELECT ATAN(45.87) AS atanCalc1,


ATAN(-181.01) AS atanCalc2,
ATAN(0) AS atanCalc3,
ATAN(0.1472738) AS atanCalc4,
ATAN(197.1099392) AS atanCalc5;

El conjunto de resultados es el siguiente.

atanCalc1 atanCalc2 atanCalc3 atanCalc4 atanCalc5


--------- --------- --------- --------- ---------
1.55 -1.57 0.00 0.15 1.57

Vea también
CEILING (Transact-SQL )
(Transact-SQL )
ATN2 (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el ángulo (en radianes) formado por el eje X positivo y la línea que se extiende desde el origen al punto
(y, x), donde x e y son los valores de las dos expresiones de punto flotante especificadas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ATN2 ( float_expression , float_expression )

Argumentos
float_expression
Es una expresión de tipo de datos float.

Tipos de valores devueltos


float

Ejemplos
En el siguiente ejemplo se calcula el ATN2 de los componentes x e y especificados.

DECLARE @x float = 35.175643, @y float = 129.44;


SELECT 'The ATN2 of the angle is: ' + CONVERT(varchar, ATN2(@y, @x));
GO

El conjunto de resultados es el siguiente.

The ATN2 of the angle is: 1.30545


(1 row(s) affected)

Vea también
CAST y CONVERT (Transact-SQL )
float y real (Transact-SQL )
Funciones matemáticas (Transact-SQL )
CEILING (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número entero más pequeño que sea mayor o igual que la expresión numérica
especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CEILING ( numeric_expression )

Argumentos
numeric_expression
Una expresión de la categoría de tipo de datos numérico exacto o numérico aproximado. Para esta función, el tipo
de datos bit no es válido.

Tipos de valores devueltos


Devuelve valores que tienen el mismo tipo que numeric_expression.

Ejemplos
En este ejemplo se muestran entradas de valores numéricos positivos, valores numéricos negativos y valores cero
para la función CEILING.

SELECT CEILING($123.45), CEILING($-123.45), CEILING($0.0);


GO

El conjunto de resultados es el siguiente.

--------- --------- -------------------------


124.00 -123.00 0.00

(1 row(s) affected)

Vea también
Funciones del sistema (Transact-SQL )
COS (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Una función matemática que devuelve el coseno trigonométrico del ángulo especificado, expresado en radianes, en
la expresión dada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COS ( float_expression )

Argumentos
float_expression
Una expresión de tipo float.

Tipos de valores devueltos


float

Ejemplos
En este ejemplo se devuelve el valor COS del ángulo especificado:

DECLARE @angle float;


SET @angle = 14.78;
SELECT 'The COS of the angle is: ' + CONVERT(varchar,COS(@angle));
GO

El conjunto de resultados es el siguiente.

The COS of the angle is: -0.599465

(1 row(s) affected)

Almacenamiento de datos SQL de Azure y Almacenamiento de datos paralelos


Este ejemplo devuelve los valores COS de los ángulos especificados:

SELECT COS(14.76) AS cosCalc1, COS(-0.1472738) AS cosCalc2;

El conjunto de resultados es el siguiente.


cosCalc1 cosCalc2
-------- --------
-0.58 0.99

Vea también
Funciones matemáticas (Transact-SQL )
COT (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Una función matemática que devuelve la cotangente trigonométrica del ángulo especificado, expresada en
radianes, en la expresión float especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COT ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.

Tipos de valores devueltos


float

Ejemplos
El ejemplo siguiente devuelve el valor COT del ángulo específico:

DECLARE @angle float;


SET @angle = 124.1332;
SELECT 'The COT of the angle is: ' + CONVERT(varchar,COT(@angle));
GO

El conjunto de resultados es el siguiente.

The COT of the angle is: -0.040312

(1 row(s) affected)

Vea también
Funciones matemáticas (Transact-SQL )
DEGREES (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el ángulo correspondiente, en grados, para un ángulo especificado en radianes.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DEGREES ( numeric_expression )

Argumentos
numeric_expression
Una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit.

Valores de código de retorno


Devuelve un valor cuyo tipo de datos coincide con el tipo de datos de expresión_numérica.

Ejemplos
En este ejemplo se devuelve el número de grados en un ángulo de PI/2 radianes.

SELECT 'The number of degrees in PI/2 radians is: ' +


CONVERT(varchar, DEGREES((PI()/2)));
GO

El conjunto de resultados es el siguiente.

The number of degrees in PI/2 radians is 90

(1 row(s) affected)

Ver también
Funciones matemáticas (Transact-SQL )
EXP (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor exponencial de la expresión float especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
EXP ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.

Tipos devueltos
float

Notas
La constante e (2.718281…) es la base de los logaritmos naturales.
El exponente de un número es la constante e elevada a la potencia del número. Por ejemplo, EXP (1,0) = e^1,0 =
2,71828182845905 y EXP (10) = e^10 = 22026,4657948067.
El valor exponencial del logaritmo natural de un número es el propio número: EXP (LOG (n)) = n. Asimismo, el
logaritmo natural del valor exponencial de un número es el propio número: LOG (EXP (n)) = n.

Ejemplos
A. Obtener el exponente de un número
En el ejemplo siguiente se declara una variable y se devuelve el valor exponencial de la variable especificada ( 10 )
con una descripción de texto.

DECLARE @var float


SET @var = 10
SELECT 'The EXP of the variable is: ' + CONVERT(varchar,EXP(@var))
GO

El conjunto de resultados es el siguiente.

----------------------------------------------------------
The EXP of the variable is: 22026.5
(1 row(s) affected)
B. Obtener valores exponenciales y logaritmos naturales
En el ejemplo siguiente se devuelve el valor exponencial del logaritmo natural de 20 y el logaritmo natural del
valor exponencial de 20 . Dado que estas funciones son funciones inversas entre sí, el valor devuelto en ambos
casos es 20 .

SELECT EXP( LOG(20)), LOG( EXP(20))


GO

El conjunto de resultados es el siguiente.

---------------------- ----------------------
20 20

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Obtener el exponente de un número
En el siguiente ejemplo se devuelve el valor exponencial del valor especificado ( 10 ).

SELECT EXP(10);

El conjunto de resultados es el siguiente.

----------
22026.4657948067

D. Obtener valores exponenciales y logaritmos naturales


En el ejemplo siguiente se devuelve el valor exponencial del logaritmo natural de 20 y el logaritmo natural del
valor exponencial de 20 . Dado que estas funciones son funciones inversas entre sí, el valor devuelto en ambos
casos es 20 .

SELECT EXP( LOG(20)), LOG( EXP(20));

El conjunto de resultados es el siguiente.

-------------- -----------------
20 20

Ver también
Funciones matemáticas (Transact-SQL )
LOG (Transact-SQL )
LOG10 (Transact-SQL )
FLOOR (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el entero más grande que sea menor o igual que la expresión numérica especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FLOOR ( numeric_expression )

Argumentos
numeric_expression
Es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo
de datos bit.

Tipos devueltos
Devuelve el mismo tipo que numeric_expression.

Ejemplos
En el ejemplo siguiente se muestran valores numéricos positivos, negativos y de moneda con la función FLOOR .

SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45);

El resultado es la parte entera del valor calculado en el mismo tipo de datos que numeric_expression.

--------- --------- -----------


123 -124 123.0000

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se muestran valores numéricos positivos y negativos con la función FLOOR .

SELECT FLOOR(123.45), FLOOR(-123.45), FLOOR($123.45);

El resultado es la parte entera del valor calculado en el mismo tipo de datos que numeric_expression.

----- --------- -----------

123 -124 123


Ver también
Funciones matemáticas (Transact-SQL )
LOG (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el logaritmo natural de la expresión float especificada en SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
-- Syntax for SQL Server

LOG ( float_expression [, base ] )

-- Syntax for Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

LOG ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.
base
Argumento entero opcional que establece la base del logaritmo.
Se aplica a: de SQL Server 2012 (11.x) a SQL Server 2017

Tipos devueltos
float

Notas
De forma predeterminada, LOG() devuelve el logaritmo natural. A partir de SQL Server 2012 (11.x), puede
cambiar la base del logaritmo por otro valor mediante el parámetro base opcional.
El logaritmo natural es el logaritmo en base e, donde e es una constante irracional aproximadamente igual a
2,718281828.
El logaritmo natural del valor exponencial de un número es el propio número: LOG ( EXP ( n ) ) = n. Asimismo, el
valor exponencial del logaritmo natural de un número es el propio número: EXP ( LOG ( n ) ) = n.

Ejemplos
A. Calcular el logaritmo de un número
En el ejemplo siguiente se calcula el LOG de la expresión float especificada.
DECLARE @var float = 10;
SELECT 'The LOG of the variable is: ' + CONVERT(varchar, LOG(@var));
GO

El conjunto de resultados es el siguiente.

-------------------------------------
The LOG of the variable is: 2.30259

(1 row(s) affected)

B. Calcular el logaritmo del exponente de un número


En el ejemplo siguiente se calcula el LOG del exponente de un número.

SELECT LOG (EXP (10));

El conjunto de resultados es el siguiente.

----------------------------------
10
(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Calcular el logaritmo de un número
En el ejemplo siguiente se calcula el LOG de la expresión float especificada.

SELECT LOG(10);

El conjunto de resultados es el siguiente.

----------------`

2.30

Ver también
Funciones matemáticas (Transact-SQL )
EXP (Transact-SQL )
LOG10 (Transact-SQL )
LOG10 (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el logaritmo en base 10 de la expresión float especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
LOG10 ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.

Tipos devueltos
float

Notas
Las funciones LOG10 y POWER están relacionadas inversamente entre sí. Por ejemplo, 10 ^ LOG10(n) = n.

Ejemplos
A. Calcular el logaritmo en base 10 para una variable
En el siguiente ejemplo se calcula el LOG10 de la variable especificada.

DECLARE @var float;


SET @var = 145.175643;
SELECT 'The LOG10 of the variable is: ' + CONVERT(varchar,LOG10(@var));
GO

El conjunto de resultados es el siguiente.

The LOG10 of the variable is: 2.16189

(1 row(s) affected)

B. Calcular el resultado de elevar un logaritmo en base 10 a una potencia especificada


En el siguiente ejemplo se devuelve el resultado de elevar un logaritmo en base 10 a una potencia especificada.

SELECT POWER (10, LOG10(5));


El conjunto de resultados es el siguiente.

-----------
5

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Calcular el logaritmo en base 10 para un valor
En este ejemplo se calcula el LOG10 del valor especificado.

SELECT LOG10(145.175642);

El conjunto de resultados es el siguiente.

-------------------
2.16

Ver también
Funciones matemáticas (Transact-SQL )
POWER (Transact-SQL )
LOG (Transact-SQL )
PI (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor constante de PI.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PI ( )

Tipos devueltos
float

Ejemplos
El siguiente ejemplo devuelve el valor de PI .

SELECT PI();
GO

El conjunto de resultados es el siguiente.

------------------------
3.14159265358979

(1 row(s) affected)

Ver también
Funciones matemáticas (Transact-SQL )
POWER (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de la expresión especificada elevado a la potencia especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
POWER ( float_expression , y )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.
y
Es la potencia a la que elevar float_expression. y puede ser una expresión de la categoría de tipos de datos
numérico exacto o numérico aproximado, excepto para el tipo de datos bit.

Tipos devueltos
Devuelve el mismo tipo que el enviado en float_expression. Por ejemplo, si un decimal(2,0) se envía como
float_expression, el resultado devuelto es decimal(2,0).

Ejemplos
A. Usar POWER para devolver el cubo de un número
En el ejemplo siguiente se muestra cómo elevar un número a la potencia 3 (el cubo del número).

DECLARE @input1 float;


DECLARE @input2 float;
SET @input1= 2;
SET @input2 = 2.5;
SELECT POWER(@input1, 3) AS Result1, POWER(@input2, 3) AS Result2;

El conjunto de resultados es el siguiente.

Result1 Result2
---------------------- ----------------------
8 15.625

(1 row(s) affected)

B. Usar POWER para mostrar los resultados de la conversión del tipo de datos
En el ejemplo siguiente se muestra cómo float_expression conserva el tipo de datos que puede devolver
resultados inesperados.
SELECT
POWER(CAST(2.0 AS float), -100.0) AS FloatResult,
POWER(2, -100.0) AS IntegerResult,
POWER(CAST(2.0 AS int), -100.0) AS IntegerResult,
POWER(2.0, -100.0) AS Decimal1Result,
POWER(2.00, -100.0) AS Decimal2Result,
POWER(CAST(2.0 AS decimal(5,2)), -100.0) AS Decimal2Result;
GO

El conjunto de resultados es el siguiente.

FloatResult IntegerResult IntegerResult Decimal1Result Decimal2Result Decimal2Result


---------------------- ------------- ------------- -------------- -------------- --------------
7.88860905221012E-31 0 0 0.0 0.00 0.00

C. Usar POWER
El ejemplo siguiente devuelve los resultados de POWER para 2 .

DECLARE @value int, @counter int;


SET @value = 2;
SET @counter = 1;

WHILE @counter < 5


BEGIN
SELECT POWER(@value, @counter)
SET NOCOUNT ON
SET @counter = @counter + 1
SET NOCOUNT OFF
END;
GO

El conjunto de resultados es el siguiente.

-----------
2

(1 row(s) affected)

-----------
4

(1 row(s) affected)

-----------
8

(1 row(s) affected)

-----------
16

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Usar POWER para devolver el cubo de un número
En este ejemplo se devuelven resultados de POWER para 2.0 a la potencia 3.
SELECT POWER(2.0, 3);

El conjunto de resultados es el siguiente.

------------
8.0

Ver también
decimal y numeric (Transact-SQL )
float y real (Transact-SQL )
int, bigint, smallint y tinyint (Transact-SQL )
Funciones matemáticas (Transact-SQL )
money y smallmoney (Transact-SQL )
RADIANS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve los radianes de una expresión numérica en grados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
RADIANS ( numeric_expression )

Argumentos
numeric_expression
Es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit.

Tipos devueltos
Devuelve el mismo tipo que numeric_expression.

Ejemplos
A. Utilizar RADIANS para mostrar 0.0
En este ejemplo se devuelve el resultado 0.0 debido a que la expresión numérica que se va a convertir en
radianes es demasiado pequeña para la función RADIANS .

SELECT RADIANS(1e-307)
GO

El conjunto de resultados es el siguiente.

-------------------
0.0
(1 row(s) affected)

B. Utilizar RADIANS para devolver el ángulo equivalente de una expresión float


En este ejemplo se toma una expresión float y se devuelve el valor RADIANS del ángulo especificado.
-- First value is -45.01.
DECLARE @angle float
SET @angle = -45.01
SELECT 'The RADIANS of the angle is: ' +
CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is -181.01.
DECLARE @angle float
SET @angle = -181.01
SELECT 'The RADIANS of the angle is: ' +
CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is 0.00.
DECLARE @angle float
SET @angle = 0.00
SELECT 'The RADIANS of the angle is: ' +
CONVERT(varchar, RADIANS(@angle))
GO
-- Next value is 0.1472738.
DECLARE @angle float
SET @angle = 0.1472738
SELECT 'The RADIANS of the angle is: ' +
CONVERT(varchar, RADIANS(@angle))
GO
-- Last value is 197.1099392.
DECLARE @angle float
SET @angle = 197.1099392
SELECT 'The RADIANS of the angle is: ' +
CONVERT(varchar, RADIANS(@angle))
GO

El conjunto de resultados es el siguiente.

---------------------------------------
The RADIANS of the angle is: -0.785573
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: -3.15922
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 0
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 0.00257041
(1 row(s) affected)
---------------------------------------
The RADIANS of the angle is: 3.44022
(1 row(s) affected)

Ver también
CAST y CONVERT (Transact-SQL )
decimal and numeric (Transact-SQL ) [decimal y numeric (Transact-SQL )]
float y real (Transact-SQL )
int, bigint, smallint y tinyint (Transact-SQL )
Funciones matemáticas (Transact-SQL )
money y smallmoney (Transact-SQL )
RAND (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor float pseudoaleatorio de 0 a 1, ambos excluidos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
RAND ( [ seed ] )

Argumentos
seed
Es una expresión de tipo entero (tinyint, smallint o int) que proporciona el valor de inicialización. Si no se
especifica seed, Motor de base de datos de SQL Server asigna un valor de inicialización de forma aleatoria. Para
un valor de inicialización especificado, el resultado devuelto es siempre el mismo.

Tipos devueltos
float

Notas
Las llamadas repetitivas de RAND () con el mismo valor de inicialización devuelven los mismos resultados.
Para una conexión, si se llama a RAND () con el valor de inicialización especificado, todas las llamadas posteriores
de RAND () generan resultados basados en la llamada a RAND () inicializada. Por ejemplo, la siguiente consulta
siempre devuelve la misma secuencia de números.

SELECT RAND(100), RAND(), RAND()

Ejemplos
En el siguiente ejemplo se producen cuatro números aleatorios diferentes, generados con la función RAND.

DECLARE @counter smallint;


SET @counter = 1;
WHILE @counter < 5
BEGIN
SELECT RAND() Random_Number
SET @counter = @counter + 1
END;
GO
Ver también
Funciones matemáticas (Transact-SQL )
ROUND (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor numérico, redondeado a la longitud o precisión especificadas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ROUND ( numeric_expression , length [ ,function ] )

Argumentos
numeric_expression
Es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit.
length
Es la precisión con la que numeric_expression se va a redondear. length debe ser una expresión de tipo tinyint,
smallint o int. Si length es un número positivo, numeric_expression se redondea al número de posiciones
decimales especificado por length. Si length es un número negativo, numeric_expression se redondea al número de
posiciones decimales especificado por length.
function
Es el tipo de operación que se va a realizar. function debe ser tinyint, smallint o int. Si function se omite o tiene el
valor 0 (predeterminado), numeric_expression se redondea. Si se especifica un valor distinto de 0,
numeric_expression se trunca.

Tipos devueltos
Devuelve los tipos de datos siguientes.

RESULTADO DE LA EXPRESIÓN TIPO DE VALOR DEVUELTO

tinyint int

smallint int

int int

bigint bigint

Categorías decimal y numeric (p, s) decimal(p, s)

Categorías money y smallmoney money


RESULTADO DE LA EXPRESIÓN TIPO DE VALOR DEVUELTO

Categorías float y real float

Notas
ROUND siempre devuelve un valor. Si length es un valor negativo y mayor que el número de dígitos anteriores al
separador decimal, ROUND devuelve 0.

EJEMPLO RESULTADO

ROUND(748.58, -4) 0

ROUND devuelve un valor de numeric_expression redondeado, independientemente del tipo de datos, cuando
length es un número negativo.

EJEMPLOS RESULTADO

ROUND(748.58, -1) 750,00

ROUND(748.58, -2) 700,00

ROUND(748.58, -3) Da como resultado un desbordamiento aritmético, porque


748.58 es de forma predeterminada decimal(5,2), que no
puede devolver 1000.00.

Para redondear a cuatro dígitos, cambie el tipo de datos de la 1000,00


entrada. Por ejemplo:

SELECT ROUND(CAST (748.58 AS decimal (6,2)),-3);

Ejemplos
A. Usar ROUND y valores estimados
En el ejemplo siguiente se muestran dos expresiones que demuestran que cuando se usa la función ROUND , el
último dígito siempre es un valor estimado.

SELECT ROUND(123.9994, 3), ROUND(123.9995, 3);


GO

El conjunto de resultados es el siguiente.

----------- -----------
123.9990 124.0000

B. Usar ROUND y aproximaciones de redondeo


En el ejemplo siguiente se muestran redondeos y aproximaciones.

SELECT ROUND(123.4545, 2), ROUND(123.45, -2);

El conjunto de resultados es el siguiente.


-------- ----------
123.45 100.00

C. Usar ROUND para truncar


En el ejemplo siguiente se utilizan dos instrucciones SELECT para demostrar la diferencia entre redondear y
truncar. La primera instrucción redondea el resultado. La segunda instrucción lo trunca.

SELECT ROUND(150.75, 0);


GO
SELECT ROUND(150.75, 0, 1);
GO

El conjunto de resultados es el siguiente.

--------
151.00

(1 row(s) affected)

--------
150.00

(1 row(s) affected)

Ver también
CEILING (Transact-SQL )
Tipos de datos (Transact-SQL )
Expresiones (Transact-SQL )
FLOOR (Transact-SQL )
Funciones matemáticas (Transact-SQL )
SIGN (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el signo positivo (+1), cero (0) o negativo (-1) de la expresión especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SIGN ( numeric_expression )

Argumentos
numeric_expression
Es una expresión de la categoría de tipos de datos numérico exacto o numérico aproximado, excepto para el tipo de
datos bit.

Tipos devueltos
EXPRESIÓN ESPECIFICADA TIPO DE VALOR DEVUELTO

bigint bigint

int/smallint/tinyint int

money/smallmoney money

numeric/decimal numeric/decimal

Otros tipos float

Ejemplos
En el ejemplo siguiente se devuelven los valores de SIGN para los números de -1 a 1.

DECLARE @value real


SET @value = -1
WHILE @value < 2
BEGIN
SELECT SIGN(@value)
SET NOCOUNT ON
SELECT @value = @value + 1
SET NOCOUNT OFF
END
SET NOCOUNT OFF
GO
El conjunto de resultados es el siguiente.

(1 row(s) affected)

------------------------
-1.0

(1 row(s) affected)

------------------------
0.0

(1 row(s) affected)

------------------------
1.0

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se devuelven los valores de SIGN de tres números.

SELECT SIGN(-125), SIGN(0), SIGN(564);

El conjunto de resultados es el siguiente.

----- ----- -----


-1 0 1

Ver también
Funciones matemáticas (Transact-SQL )
SIN (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el seno trigonométrico del ángulo dado, en radianes, en una expresión float numérica aproximada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SIN ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.

Tipos devueltos
float

Ejemplos
En el ejemplo siguiente se calcula el seno de un ángulo especificado.

DECLARE @angle float;


SET @angle = 45.175643;
SELECT 'The SIN of the angle is: ' + CONVERT(varchar,SIN(@angle));
GO

El conjunto de resultados es el siguiente.

The SIN of the angle is: 0.929607

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se calcula el seno de un ángulo especificado.

SELECT SIN(45.175643);

El conjunto de resultados es el siguiente.


---------
0.929607

Ver también
Funciones matemáticas (Transact-SQL )
SQRT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la raíz cuadrada del valor de tipo flotante especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SQRT ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.

Tipos devueltos
float

Ejemplos
En el ejemplo siguiente se devuelve la raíz cuadrada de los números comprendidos entre 1.00 y 10.00 .

DECLARE @myvalue float;


SET @myvalue = 1.00;
WHILE @myvalue < 10.00
BEGIN
SELECT SQRT(@myvalue);
SET @myvalue = @myvalue + 1
END;
GO

El conjunto de resultados es el siguiente.


------------------------
1.0
------------------------
1.4142135623731
------------------------
1.73205080756888
------------------------
2.0
------------------------
2.23606797749979
------------------------
2.44948974278318
------------------------
2.64575131106459
------------------------
2.82842712474619
------------------------
3.0

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el ejemplo siguiente se devuelve la raíz cuadrada de los números comprendidos entre 1.00 y 10.00 .

SELECT SQRT(1.00), SQRT(10.00);

El conjunto de resultados es el siguiente.

---------- ------------
1.00 3.16

Ver también
Funciones matemáticas (Transact-SQL )
SQUARE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el cuadrado del valor de tipo flotante especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SQUARE ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que se puede convertir en float de manera implícita.

Tipos devueltos
float

Ejemplos
En el ejemplo siguiente se devuelve el volumen de un cilindro de 1 pulgada de radio y 5 pulgadas de alto.

DECLARE @h float, @r float;


SET @h = 5;
SET @r = 1;
SELECT PI()* SQUARE(@r)* @h AS 'Cyl Vol';

El conjunto de resultados es el siguiente.

Cyl Vol
--------------------------
15.707963267948966

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se devuelve el cuadrado de cada valor de la columna volume de la tabla containers .
-- Uses AdventureWorks

CREATE TABLE Containers (


ID int NOT NULL,
Name varchar(20),
Volume float(24));

INSERT INTO Containers VALUES (1, 'Cylinder', '125.22');


INSERT INTO Containers VALUES (2, 'Cube', '23.98');

SELECT Name, SQUARE(Volume) AS VolSquared


FROM Containers;

El conjunto de resultados es el siguiente.

Name VolSquared
------------- ----------
Cylinder 15680.05
Cube 575.04

Ver también
Funciones matemáticas (Transact-SQL )
TAN (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la tangente de la expresión de entrada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TAN ( float_expression )

Argumentos
float_expression
Es una expresión de tipo float o de un tipo que puede convertirse implícitamente a float, interpretado como un
número de radianes.

Tipos devueltos
float

Ejemplos
En el siguiente ejemplo se devuelve la tangente de PI()/2 .

SELECT TAN(PI()/2);

El conjunto de resultados es el siguiente.

----------------------
1.6331778728383844E+16

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se devuelve la tangente de .45.

SELECT TAN(.45);

El conjunto de resultados es el siguiente.

--------
0.48
Ver también
Funciones matemáticas (Transact-SQL )
Funciones lógicas - CHOOSE (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el elemento en el índice especificado de una lista de valores de SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CHOOSE ( index, val_1, val_2 [, val_n ] )

Argumentos
index
Expresión entera que representa un índice de base uno de la lista de elementos que le siguen.
Si el valor de índice proporcionado tiene un tipo de datos numérico distinto de int, el valor se convierte
implícitamente en un entero. Si el valor de índice supera los límites de la matriz de valores, CHOOSE devuelve
NULL.
val_1 … val_n
Lista de valores separados por comas de cualquier tipo de datos.

Tipos devueltos
Devuelve el tipo de datos con la mayor prioridad del conjunto de tipos pasados a la función. Para obtener más
información, vea Prioridad de tipo de datos (Transact-SQL ).

Notas
CHOOSE actúa como un índice de una matriz, donde la matriz consta de los argumentos que siguen al argumento
de índice. El argumento de índice determina cuál de los valores siguientes se devolverá.

Ejemplos
En el ejemplo siguiente se devuelve el tercer elemento de la lista de valores que se proporciona.

SELECT CHOOSE ( 3, 'Manager', 'Director', 'Developer', 'Tester' ) AS Result;

El conjunto de resultados es el siguiente.

Result
-------------
Developer

(1 row(s) affected)
En el ejemplo siguiente se devuelve una cadena de caracteres simple basada en el valor de la columna
ProductCategoryID .

USE AdventureWorks2012;
GO
SELECT ProductCategoryID, CHOOSE (ProductCategoryID, 'A','B','C','D','E') AS Expression1
FROM Production.ProductCategory;

El conjunto de resultados es el siguiente.

ProductCategoryID Expression1
----------------- -----------
3 C
1 A
2 B
4 D

(4 row(s) affected)

En el ejemplo siguiente se devuelve el trimestre en el que se contrató a un empleado. La función MONTH se usa
para devolver el valor de mes de la columna HireDate .

USE AdventureWorks2012;
GO
SELECT JobTitle, HireDate, CHOOSE(MONTH(HireDate),'Winter','Winter',
'Spring','Spring','Spring','Summer','Summer',
'Summer','Autumn','Autumn','Autumn','Winter') AS
Quarter_Hired
FROM HumanResources.Employee
WHERE YEAR(HireDate) > 2005
ORDER BY YEAR(HireDate);

El conjunto de resultados es el siguiente.

JobTitle HireDate Quarter_Hired


-------------------------------------------------- ---------- -------------
Sales Representative 2006-11-01 Autumn
European Sales Manager 2006-05-18 Spring
Sales Representative 2006-07-01 Summer
Sales Representative 2006-07-01 Summer
Sales Representative 2007-07-01 Summer
Pacific Sales Manager 2007-04-15 Spring
Sales Representative 2007-07-01 Summer

Ver también
IIF (Transact-SQL )
Funciones lógicas - IIF (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve uno de dos valores, dependiendo de si la expresión booleana se evalúa como true o como false en SQL
Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IIF ( boolean_expression, true_value, false_value )

Argumentos
boolean_expression
Una expresión booleana válida.
Si este argumento no es una expresión booleana, se produce un error de sintaxis.
true_value
Valor que se devuelve si boolean_expression se evalúa como true.
false_value
Valor que se devuelve si boolean_expression se evalúa como false.

Tipos devueltos
Devuelve el tipo de datos que tiene la prioridad más alta de los tipos de true_value y false_value. Para obtener más
información, vea Prioridad de tipo de datos (Transact-SQL ).

Notas
IIF es una manera abreviada para escribir una expresión CASE. Evalúa la expresión booleana pasada como primer
argumento y devuelve cualquiera de los otros dos argumentos según el resultado de la evaluación. Es decir, se
devuelve true_value si la expresión booleana es true y se devuelve false_value si la expresión booleana es false o
desconocida. true_value y false_value pueden ser de cualquier tipo. Las mismas reglas que se aplican a la
expresión CASE en las expresiones booleanas, el control de valores NULL y los tipos de valores devueltos también
se aplican a IIF. Para más información, vea CASE (Transact-SQL ).
El hecho de que IIF se traduzca a CASE también afecta a otros aspectos del comportamiento de esta función. Dado
que las expresiones CASE solo se pueden anidar hasta 10 niveles, las instrucciones IIF también se pueden anidar
únicamente hasta un máximo de 10. Además, IIF se envía de forma remota a otros servidores como una expresión
CASE semánticamente equivalente, con todos los comportamientos de una expresión CASE remota.

Ejemplos
A. Ejemplo sencillo de IIF
DECLARE @a int = 45, @b int = 40;
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result;

El conjunto de resultados es el siguiente.

Result
--------
TRUE

(1 row(s) affected)

B. IIF con constantes NULL

SELECT IIF ( 45 > 30, NULL, NULL ) AS Result;

El resultado de esta instrucción es un error.


C. IIF con parámetros NULL

DECLARE @P INT = NULL, @S INT = NULL;


SELECT IIF ( 45 > 30, @p, @s ) AS Result;

El conjunto de resultados es el siguiente.

Result
--------
NULL

(1 row(s) affected)

Ver también
CASE (Transact-SQL )
CHOOSE (Transact-SQL )
Funciones de metadatos (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL
Data Warehouse Almacenamiento de datos paralelos
Las siguientes funciones escalares devuelven información acerca de la base de datos y de los objetos de la
misma:

@@PROCID INDEX_COL

APP_NAME INDEXKEY_PROPERTY

APPLOCK_MODE INDEXPROPERTY

APPLOCK_TEST NEXT VALUE FOR

ASSEMBLYPROPERTY OBJECT_DEFINITION

COL_LENGTH OBJECT_ID

COL_NAME OBJECT_NAME

COLUMNPROPERTY OBJECT_SCHEMA_NAME

DATABASE_PRINCIPAL_ID OBJECTPROPERTY

DATABASEPROPERTYEX OBJECTPROPERTYEX

DB_ID ORIGINAL_DB_NAME

DB_NAME PARSENAME

FILE_ID SCHEMA_ID

FILE_IDEX SCHEMA_NAME

FILE_NAME SCOPE_IDENTITY

FILEGROUP_ID SERVERPROPERTY

FILEGROUP_NAME STATS_DATE

FILEGROUPPROPERTY TYPE_ID

FILEPROPERTY TYPE_NAME

FULLTEXTCATALOGPROPERTY TYPEPROPERTY
FULLTEXTSERVICEPROPERTY VERSION

Ninguna de las funciones de metadatos es determinista. Por ello, estas funciones no siempre devuelven el
mismo resultado cada vez que se invocan, incluso con el mismo conjunto de valores de entrada.

Ver también
Funciones integradas (Transact-SQL )
@@PROCID (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el identificador (Id.) de objeto del módulo Transact-SQL actual. Un módulo Transact-SQL puede ser un
procedimiento almacenado, una función definida por el usuario o un desencadenador. @@PROCID no se puede
especificar en módulos CLR o en el proveedor de acceso a datos en proceso.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@PROCID

Tipos devueltos
int

Ejemplos
En el siguiente ejemplo se utiliza @@PROCID como parámetro de entrada en la función OBJECT_NAME para devolver
el nombre del procedimiento almacenado en el mensaje RAISERROR .

USE AdventureWorks2012;
GO
IF OBJECT_ID ( 'usp_FindName', 'P' ) IS NOT NULL
DROP PROCEDURE usp_FindName;
GO
CREATE PROCEDURE usp_FindName
@lastname varchar(40) = '%',
@firstname varchar(20) = '%'
AS
DECLARE @Count int;
DECLARE @ProcName nvarchar(128);
SELECT LastName, FirstName
FROM Person.Person
WHERE FirstName LIKE @firstname AND LastName LIKE @lastname;
SET @Count = @@ROWCOUNT;
SET @ProcName = OBJECT_NAME(@@PROCID);
RAISERROR ('Stored procedure %s returned %d rows.', 16,10, @ProcName, @Count);
GO
EXECUTE dbo.usp_FindName 'P%', 'A%';

Ver también
CREATE FUNCTION (Transact-SQL )
CREATE PROCEDURE (Transact-SQL )
CREATE TRIGGER (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.objects (Transact-SQL )
sys.sql_modules (Transact-SQL )
RAISERROR (Transact-SQL )
APP_NAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre de aplicación de la sesión actual, si la aplicación establece ese valor de nombre.

IMPORTANT
El cliente proporciona el nombre de la aplicación y APP_NAME no verifica de ninguna manera el valor del nombre de la
aplicación. No utilice APP_NAME como parte de una comprobación de seguridad.

Convenciones de sintaxis de Transact-SQL

Sintaxis
APP_NAME ( )

Tipos devueltos
nvarchar(128)

Notas
Use APP_NAME para distinguir entre otras aplicaciones, como una manera de realizar otras acciones para esas
aplicaciones. Por ejemplo, APP_NAME puede distinguir entre aplicaciones diferentes, lo que permite otro formato de
fecha para cada aplicación. También puede permitir el envío de un mensaje informativo a ciertas aplicaciones.
Para establecer el nombre de una aplicación en Management Studio, haga clic en Opciones en el cuadro de
diálogo Conectar al motor de base de datos. En la pestaña Parámetros de conexión adicionales, indique un
atributo app con el formato ;app='application_name' .

Ejemplo
En este ejemplo se comprueba si la aplicación cliente que inició este proceso es una sesión de
SQL Server Management Studio . Después, proporciona un valor de fecha en formato de EE. UU. o ANSI.

USE AdventureWorks2012;
GO
IF APP_NAME() = 'Microsoft SQL Server Management Studio - Query'
PRINT 'This process was started by ' + APP_NAME() + '. The date is ' + CONVERT ( varchar(100) , GETDATE(),
101) + '.';
ELSE
PRINT 'This process was started by ' + APP_NAME() + '. The date is ' + CONVERT ( varchar(100) , GETDATE(),
102) + '.';
GO
Vea también
Funciones del sistema (Transact-SQL )
Funciones
APPLOCK_MODE (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el modo de bloqueo mantenido por el propietario del bloqueo en un recurso de aplicación
específico. Como función de bloqueo de la aplicación, APPLOCK_MODE funciona en la base de datos actual. La
base de datos es el ámbito de los bloqueos de la aplicación.
Convenciones de sintaxis de Transact-SQL

Sintaxis
APPLOCK_MODE( 'database_principal' , 'resource_name' , 'lock_owner' )

Argumentos
'database_principal'
Es el usuario, el rol o el rol de aplicación al que se pueden conceder permisos para los objetos de la base de datos.
Para llamar a la función correctamente, el autor de la llamada a la función debe ser miembro de
database_principal, de dbo o del rol fijo de base de datos db_owner.
'resource_name'
Es un nombre de recurso de bloqueo especificado por la aplicación cliente. La aplicación debe asegurar que el
nombre del recurso sea exclusivo. El nombre especificado se convierte internamente mediante un algoritmo hash
en un valor que puede almacenarse en el administrador de bloqueos de SQL Server. resource_name es
nvarchar(255) y no tiene ningún valor predeterminado. resource_name se compara con un binario y distingue
mayúsculas de minúsculas, independientemente de la configuración de intercalación de la base de datos actual.
'lock_owner'
El propietario del bloqueo, que es el valor de lock_owner cuando se solicitó el bloqueo. lock_owner es
nvarchar(32) y el valor puede ser Transaction (predeterminado) o Session.

Tipos de valores devueltos


nvarchar(32)

Valor devuelto
Devuelve el modo de bloqueo mantenido por el propietario del bloqueo en un recurso de aplicación específico. El
modo de bloqueo puede tener uno de estos valores:

NoLock Update *SharedIntentExclusive

IntentShared IntentExclusive *UpdateIntentExclusive

Shared Exclusivo
* Este modo de bloqueo es una combinación de otros modos de bloqueo y sp_getapplock no se puede adquirir
explícitamente.

Propiedades de las funciones


Nondeterministic
Nonindexable
Nonparallelizable

Ejemplos
Dos usuarios (usuario A y usuario B ) con sesiones independientes ejecutan la siguiente secuencia de instrucciones
Transact-SQL.
El usuario A ejecuta:

USE AdventureWorks2012;
GO
BEGIN TRAN;
DECLARE @result int;
EXEC @result=sp_getapplock
@DbPrincipal='public',
@Resource='Form1',
@LockMode='Shared',
@LockOwner='Transaction';
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');
GO

Después, el usuario B ejecuta:

Use AdventureWorks2012;
GO
BEGIN TRAN;
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');
--Result set: NoLock

SELECT APPLOCK_TEST('public', 'Form1', 'Shared', 'Transaction');


--Result set: 1 (Lock is grantable.)

SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');


--Result set: 0 (Lock is not grantable.)
GO

Después, el usuario A ejecuta:

EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';


GO

Después, el usuario B ejecuta:

SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');


--Result set: '1' (The lock is grantable.)
GO

A continuación, el usuario A y el usuario B ejecutan:


COMMIT TRAN;
GO

Vea también
APPLOCK_TEST (Transact-SQL )
sp_getapplock (Transact-SQL )
sp_releaseapplock (Transact-SQL )
APPLOCK_TEST (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve información acerca de si se puede conceder o no un bloqueo para un recurso de aplicación
determinado para el propietario de un bloqueo específico, sin adquirir el bloqueo. Como función de bloqueo de la
aplicación, APPLOCK_TEST funciona en la base de datos actual. La base de datos es el ámbito de los bloqueos de
la aplicación.
Convenciones de sintaxis de Transact-SQL

Sintaxis
APPLOCK_TEST ( 'database_principal' , 'resource_name' , 'lock_mode' , 'lock_owner' )

Argumentos
' database_principal '
Es el usuario, el rol o el rol de aplicación al que se pueden conceder permisos para los objetos de la base de datos.
Para llamar a la función correctamente, el autor de la llamada a la función debe ser miembro de
database_principal, de dbo o del rol fijo de base de datos db_owner.
' resource_name '
Es un nombre de recurso de bloqueo especificado por la aplicación cliente. La aplicación debe asegurar que el
nombre del recurso sea exclusivo. El nombre especificado se convierte internamente mediante un algoritmo hash
en un valor que puede almacenarse en el administrador de bloqueos de SQL Server. resource_name es
nvarchar(255) y no tiene ningún valor predeterminado. resource_name se compara con un binario y distingue
mayúsculas de minúsculas, independientemente de la configuración de intercalación de la base de datos actual.
' lock_mode '
El modo de bloqueo que se debe obtener para un recurso concreto. lock_mode es nvarchar(32) y carece de valor
predeterminado. lock_mode puede tener cualquiera de estos valores: Shared, Update, IntentShared,
IntentExclusive, Exclusive.
' lock_owner '
El propietario del bloqueo, que es el valor de lock_owner cuando se solicitó el bloqueo. lock_owner es
nvarchar(32) y el valor puede ser Transaction (predeterminado) o Session. Si se especifica el valor
predeterminado o Transaction explícitamente, debe ejecutarse APPLOCK_TEST desde una transacción.

Tipos de valores devueltos


smallint

Valor devuelto
0 si no se puede conceder el bloqueo al propietario especificado o 1 si se puede conceder el bloqueo.

Propiedades de las funciones


Nondeterministic
Nonindexable
Nonparallelizable

Ejemplos
Dos usuarios (usuario A y usuario B ) con sesiones independientes ejecutan la siguiente secuencia de
instrucciones Transact-SQL.
El Usuario A ejecuta:

USE AdventureWorks2012;
GO
BEGIN TRAN;
DECLARE @result int;
EXEC @result=sp_getapplock
@DbPrincipal='public',
@Resource='Form1',
@LockMode='Shared',
@LockOwner='Transaction';
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');
GO

Después, el Usuario B ejecuta:

Use AdventureWorks2012;
GO
BEGIN TRAN;
SELECT APPLOCK_MODE('public', 'Form1', 'Transaction');
--Result set: NoLock

SELECT APPLOCK_TEST('public', 'Form1', 'Shared', 'Transaction');


--Result set: 1 (Lock is grantable.)

SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');


--Result set: 0 (Lock is not grantable.)
GO

Después, el Usuario A ejecuta:

EXEC sp_releaseapplock @Resource='Form1', @DbPrincipal='public';


GO

Después, el Usuario B ejecuta:

SELECT APPLOCK_TEST('public', 'Form1', 'Exclusive', 'Transaction');


--Result set: '1' (The lock is grantable.)
GO

Después, el Usuario A y el Usuario B ejecutan:

COMMIT TRAN;
GO
Vea también
APPLOCK_MODE (Transact-SQL )
sp_getapplock (Transact-SQL )
sp_releaseapplock (Transact-SQL )
ASSEMBLYPROPERTY (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve información sobre una propiedad de un ensamblado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ASSEMBLYPROPERTY('assembly_name', 'property_name')

Argumentos
assembly_name
Nombre del ensamblado.
property_name
El nombre de una propiedad de la que se va a recuperar información. property_name puede tener uno de los
valores siguientes:

VALOR DESCRIPCIÓN

CultureInfo Configuración regional del ensamblado.

PublicKey Clave pública o símbolo (token) de clave pública del


ensamblado.

MvID Número completo de identificación de versión del ensamblado


generado por el compilador.

VersionMajor Componente principal (primera parte) del número de


identificación de la versión de cuatro partes del ensamblado.

VersionMinor Componente secundario (segunda parte) del número de


identificación de la versión de cuatro partes del ensamblado.

VersionBuild Componente de generación (tercera parte) del número de


identificación de la versión de cuatro partes del ensamblado.

VersionRevision Componente de revisión (cuarta parte) del número de


identificación de la versión de cuatro partes del ensamblado.

SimpleName Nombre sencillo del ensamblado.

Arquitectura Arquitectura del procesador del ensamblado.


VALOR DESCRIPCIÓN

CLRName Cadena canónica que codifica el nombre sencillo, número de


versión, referencia cultural, clave pública y arquitectura del
ensamblado. Este valor identifica de forma única el
ensamblado en Common Language Runtime (CLR).

Tipo de valor devuelto


sql_variant

Ejemplos
En este ejemplo, se supone que se registra un ensamblado de HelloWorld en la base de datos
AdventureWorks2012. Para más información, vea Ejemplo de Hola a todos.

USE AdventureWorks2012;
GO
SELECT ASSEMBLYPROPERTY ('HelloWorld' , 'PublicKey');

Vea también
CREATE ASSEMBLY (Transact-SQL )
DROP ASSEMBLY (Transact-SQL )
COL_LENGTH (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve la longitud definida de una columna, en bytes.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COL_LENGTH ( 'table' , 'column' )

Argumentos
' table '
El nombre de la tabla para la que se quiere determinar la información de longitud de columna. table es una
expresión de tipo nvarchar.
' column '
El nombre de la columna cuya longitud se quiere determinar. column es una expresión de tipo nvarchar.

Tipo de valor devuelto


smallint

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene el permiso correcto para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de los elementos protegibles que posea o para los que se
le haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos como
COL_LENGTH es posible que devuelvan NULL, si el usuario no tiene el permiso correcto para el objeto. Vea
Configuración de visibilidad de los metadatos para obtener más información.

Notas
Para las columnas de tipo varchar declaradas con el especificador max (varchar(max)), COL_LENGTH devuelve
el valor -1.

Ejemplos
En este ejemplo se muestran los valores devueltos para una columna de tipo varchar(40) y una columna de tipo
nvarchar(40) :
USE AdventureWorks2012;
GO
CREATE TABLE t1(c1 varchar(40), c2 nvarchar(40) );
GO
SELECT COL_LENGTH('t1','c1')AS 'VarChar',
COL_LENGTH('t1','c2')AS 'NVarChar';
GO
DROP TABLE t1;

El conjunto de resultados es el siguiente.

VarChar NVarChar
40 80

Vea también
Expresiones (Transact-SQL )
Funciones de metadatos (Transact-SQL )
COL_NAME (Transact-SQL )
COLUMNPROPERTY (Transact-SQL )
COL_NAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre de una columna de tabla, en función de los valores de número de identificación
de tabla y de columna de esa columna de tabla.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COL_NAME ( table_id , column_id )

Argumentos
table_id
El número de identificación de la tabla que contiene esa columna. El argumento id_tabla tiene un tipo de datos int.
column_id
El número de identificación de la columna. El argumento id_columna tiene un tipo de datos int.

Tipos de valores devueltos


sysname

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene el permiso correcto para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de los elementos protegibles que posea o para los que se
le haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como COL_NAME ,
es posible que devuelvan NULL si el usuario no tiene los permisos correctos para el objeto. Vea Configuración de
visibilidad de los metadatos para obtener más información.

Notas
Los parámetros table_id y column_id generan juntos una cadena de nombre de columna.
Vea OBJECT_ID (Transact-SQL )para más información sobre cómo obtener los números de identificación de tablas
y columnas.

Ejemplos
En este ejemplo se devuelve el nombre de la primera columna de una tabla Employee de ejemplo.
-- Uses AdventureWorks

SELECT COL_NAME(OBJECT_ID('dbo.FactResellerSales'), 1) AS FirstColumnName,


COL_NAME(OBJECT_ID('dbo.FactResellerSales'), 2) AS SecondColumnName;

El conjunto de resultados es el siguiente.

ColumnName
------------
BusinessEntityID

Vea también
Expresiones (Transact-SQL )
Funciones de metadatos (Transact-SQL )
COLUMNPROPERTY (Transact-SQL )
COL_LENGTH (Transact-SQL )
COLUMNPROPERTY (Transact-SQL)
18/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve información de la columna o el parámetro.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COLUMNPROPERTY ( id , column , property )

Argumentos
id
Una expresión que contiene el identificador (Id.) de la tabla o del procedimiento.
column
Una expresión que contiene el nombre de la columna o del parámetro.
property
Para el argumento id, el argumento propiedad especifica el tipo de información que devolverá la función
COLUMNPROPERTY . El argumento propiedad puede tener uno de estos valores:

VALOR DESCRIPCIÓN VALOR DEVUELTO

AllowsNull Permite valores NULL. 1: TRUE

0: FALSE

NULL: entrada no válida

ColumnId Valor del Id. de columna Identificador de columna


correspondiente a
sys.columns.column_id. Nota: Cuando se consultan varias
columnas, pueden aparecer espacios en
la secuencia de valores de los Id. de
columna.

FullTextTypeColumn El valor TYPE COLUMN de la tabla que Id. de TYPE COLUMN de texto
contiene la información del tipo de completo para la expresión de nombre
documento de la columna. de columna que se pasa como segundo
parámetro de esta función.
VALOR DESCRIPCIÓN VALOR DEVUELTO

GeneratedAlwaysType Es el valor de columna generado por el Se aplica a: desde SQL Server 2016
sistema. Corresponde a (13.x) hasta SQL Server 2017.
sys.columns.generated_always_type
0: no siempre se genera.

1: se genera siempre como comienzo


de fila.

2: se genera siempre como fin de fila.

IsColumnSet La columna es un conjunto de 1: TRUE


columnas. Para obtener más
información, vea Usar conjuntos de 0: FALSE
columnas.
NULL: entrada no válida

IsComputed La columna es una columna calculada. 1: TRUE

0: FALSE

NULL: entrada no válida

IsCursorType El parámetro de procedimiento es del 1: TRUE


tipo CURSOR.
0: FALSE

NULL: entrada no válida

IsDeterministic La columna es determinista. Esta 1: TRUE


propiedad solo se aplica a columnas
calculadas y columnas de vistas. 0: FALSE

NULL: entrada no válida No es una


columna calculada o una columna de
vista.

IsFulltextIndexed La columna se registra para la 1: TRUE


indización de texto completo.
0: FALSE

NULL: entrada no válida

IsHidden Es el valor de columna generado por el Se aplica a: desde SQL Server 2017
sistema. Corresponde a hasta SQL Server 2017.
sys.columns.is_hidden
0: no está oculto

1: oculto

IsIdentity La columna utiliza la propiedad 1: TRUE


IDENTITY.
0: FALSE

NULL: entrada no válida


VALOR DESCRIPCIÓN VALOR DEVUELTO

IsIdNotForRepl La columna comprueba el valor 1: TRUE


IDENTITY_INSERT.
0: FALSE

NULL: entrada no válida

IsIndexable La columna se puede indizar. 1: TRUE

0: FALSE

NULL: entrada no válida

IsOutParam El parámetro de procedimiento es un 1: TRUE


parámetro de salida.
0: FALSE

NULL: entrada no válida

IsPrecise La columna es precisa. Esta propiedad 1: TRUE


solo se aplica a columnas deterministas.
0: FALSE

NULL: entrada no válida No es una


columna determinista

IsRowGuidCol La columna es del tipo de datos 1: TRUE


uniqueidentifier y se define con la
propiedad ROWGUIDCOL. 0: FALSE

NULL: entrada no válida

IsSparse La columna es una columna dispersa. 1: TRUE


Para obtener más información, vea Usar
columnas dispersas. 0: FALSE

NULL: entrada no válida

IsSystemVerified El Motor de base de datos puede 1: TRUE


comprobar las propiedades de
determinismo y precisión de la 0: FALSE
columna. Esta propiedad solo se aplica
a columnas calculadas y columnas de NULL: entrada no válida
vistas.

IsXmlIndexable La columna XML se puede utilizar en 1: TRUE


un índice XML.
0: FALSE

NULL: entrada no válida

Precisión Longitud del tipo de datos de la Longitud del tipo de datos especificado
columna o el parámetro. para la columna

-1: xml o tipos de valor grandes

NULL: entrada no válida


VALOR DESCRIPCIÓN VALOR DEVUELTO

Escala Escala del tipo de datos de la columna El valor de escala.


o del parámetro.
NULL: entrada no válida

StatisticalSemantics La columna está habilitada para la 1: TRUE


indización semántica.
0: FALSE

SystemDataAccess La columna se deriva de una función 1: TRUE (indica acceso de solo lectura)
que tiene acceso a los datos de los
catálogos del sistema o de las tablas 0: FALSE
virtuales del sistema de SQL Server.
Esta propiedad solo se aplica a NULL: entrada no válida
columnas calculadas y columnas de
vistas.

UserDataAccess La columna se deriva de una función 1: TRUE (indica acceso de solo lectura)
que tiene acceso a los datos de las
tablas de usuario, incluidas las vistas y 0: FALSE
tablas temporales, almacenadas en la
instancia local de SQL Server. Esta NULL: entrada no válida
propiedad solo se aplica a columnas
calculadas y columnas de vistas.

UsesAnsiTrim ANSI_PADDING se estableció em ON al 1: TRUE


crear la tabla. Esta propiedad solo se
aplica a columnas o parámetros de tipo 0: FALSE
char o varchar.
NULL: entrada no válida

Tipos de valores devueltos


int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como COLUMNPROPERTY , es posible
que devuelvan NULL si el usuario no tiene el permiso correcto para el objeto. Vea Configuración de visibilidad de
los metadatos para obtener más información.

Notas
Cuando se comprueba la propiedad determinista de una columna, primero se comprueba si se trata de una
columna calculada. El argumento IsDeterministic devuelve NULL para las columnas no calculadas. Las
columnas calculadas se pueden especificar como columnas de índice.

Ejemplos
En este ejemplo se devuelve la longitud de la columna LastName .
USE AdventureWorks2012;
GO
SELECT COLUMNPROPERTY( OBJECT_ID('Person.Person'),'LastName','PRECISION')AS 'Column Length';
GO

El conjunto de resultados es el siguiente.

Column Length
-------------
50

Vea también
Funciones de metadatos (Transact-SQL )
TYPEPROPERTY (Transact-SQL )
DATABASE_PRINCIPAL_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de Id. de una entidad de seguridad de la base de datos actual. Vea Entidades de
seguridad (motor de base de datos) para obtener más información sobre las entidades de seguridad.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATABASE_PRINCIPAL_ID ( 'principal_name' )

Argumentos
principal_name
Una expresión de tipo sysname que representa la entidad de seguridad. Si se omite principal_name,
DATABASE_PRINCIPAL_ID devuelve el identificador del usuario actual. DATABASE_PRINCIPAL_ID requiere los paréntesis.

Tipos de valores devueltos


int
NULL si la entidad de seguridad de base de datos no existe.

Notas
Use DATABASE_PRINCIPAL_ID en una lista de selección, en una cláusula WHERE o en cualquier lugar que permita
una expresión. Para más información, vea Expresiones (Transact-SQL ).

Ejemplos
A. Recuperar el Id. del usuario actual
En este ejemplo se devuelve el identificador de la entidad de seguridad de base de datos del usuario actual.

SELECT DATABASE_PRINCIPAL_ID();
GO

B. Recuperar el Id. de la entidad de seguridad de base de datos especificada


En este ejemplo se devuelve el identificador de la entidad de seguridad de base de datos del rol de base de datos
db_owner .

SELECT DATABASE_PRINCIPAL_ID('db_owner');
GO

Vea también
Entidades de seguridad (motor de base de datos)
Jerarquía de permisos (motor de base de datos)
sys.database_principals (Transact-SQL )
DATABASEPROPERTYEX (Transact-SQL)
17/07/2018 • 21 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Para una base de datos especificada en SQL Server, esta función devuelve la configuración actual de la opción o
propiedad de base de datos especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DATABASEPROPERTYEX ( database , property )

Argumentos
database
Una expresión que especifica el nombre de la base de datos para la que DATABASEPROPERTYEX devolverá la
información de la propiedad con nombre. database tiene un tipo de datos nvarchar(128).
Para SQL Database, DATABASEPROPERTYEX necesita el nombre de la base de datos actual. Devuelve NULL para todas
las propiedades si se proporciona un nombre de base de datos diferente.
property
Una expresión que especifica el nombre de la propiedad de base de datos que se va a devolver. property tiene un
tipo de datos varchar(128) y admite uno de los valores de esta tabla:

NOTE
Si la base de datos aún no se ha iniciado, las llamadas a DATABASEPROPERTYEX devolverán NULL si DATABASEPROPERTYEX
recupera esos valores mediante el acceso directo de la base de datos, en lugar de hacerlo mediante la recuperación a partir
de los metadatos. Si hay una base de datos con AUTO_CLOSE establecido en ON (o, de lo contrario, sin conexión), se definirá
como "no iniciada".

PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

Intercalación Nombre de intercalación Nombre de intercalación


predeterminado para la base de datos.
NULL: La base de datos no se ha
iniciado.

Tipo de datos base: nvarchar(128)


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

ComparisonStyle El estilo de comparación de Windows de Devuelve el estilo de comparación.


la intercalación. Use los siguientes
valores de estilo para generar un mapa Devuelve 0 para todas las
de bits para el valor ComparisonStyle intercalaciones binarias.
terminado:
Tipo de datos base: int
Omitir mayúsculas y minúsculas: 1

Omitir acento: 2

Omitir Kana: 65536

Omitir ancho: 131072

Por ejemplo, el valor predeterminado


196609 es el resultado de combinar las
opciones de omitir mayúsculas y
minúsculas, omitir Kana y omitir ancho.

Edición El nivel de servicio o edición de la base Se aplica a: Base de datos SQL de


de datos. Azure, Almacenamiento de datos SQL.

Uso general

Crucial para la empresa

Básico

Estándar

Premium

System (de la base de datos maestra)

NULL: La base de datos no se ha


iniciado.

Tipo de datos base: nvarchar(64)

IsAnsiNullDefault La base de datos sigue las reglas ISO 1: TRUE


para permitir los valores NULL.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsAnsiNullsEnabled Todas las comparaciones con un valor 1: TRUE


NULL tienen un resultado desconocido.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

IsAnsiPaddingEnabled Las cadenas se rellenan a la misma 1: TRUE


longitud antes de comparar o insertar.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsAnsiWarningsEnabled SQL Server emite mensajes de error o 1: TRUE


de advertencia cuando se producen
condiciones de error estándar. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsArithmeticAbortEnabled Las consultas se finalizan cuando hay 1: TRUE


un error de desbordamiento o división
por cero durante su ejecución. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsAutoClose La base de datos se cierra sin 1: TRUE


problemas y libera los recursos cuando
sale el último usuario. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsAutoCreateStatistics El optimizador de consultas crea 1: TRUE


estadísticas de columna única, según
sea necesario, para mejorar el 0: FALSE
rendimiento de las consultas.
NULL: entrada no válida

Tipo de datos base: int

IsAutoCreateStatisticsIncremental Las estadísticas de columna única Se aplica a: desde SQL Server 2014
creadas automáticamente son (12.x) hasta SQL Server 2017.
incrementales siempre que sea posible.
1: TRUE

0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsAutoShrink Los archivos de base de datos son 1: TRUE


candidatos para la reducción periódica
automática. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

IsAutoUpdateStatistics Cuando una consulta usa estadísticas 1: TRUE


existentes potencialmente obsoletas, el
optimizador de consultas actualiza 0: FALSE
dichas estadísticas.
NULL: entrada no válida

Tipo de datos base: int

IsClone La base de datos es una copia de solo Se aplica a: de SQL Server 2014 (12.x)
estadísticas y esquema de una base de SP2 a SQL Server 2017.
datos de usuario creada con DBCC
CLONEDATABASE. Vea este artículo de 1: TRUE
Soporte técnico de Microsoft para más
información. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsCloseCursorsOnCommitEnabled Cuando se confirme una transacción, se 1: TRUE


cerrarán todos los cursores abiertos.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsFulltextEnabled La base de datos está habilitada para la Se aplica a: desde SQL Server 2008
indización semántica y de texto hasta SQL Server 2017.
completo.

1: TRUE

0: FALSE

NULL: entrada no válida

Tipo de datos base: int

Nota: El valor de esta propiedad ya no


tiene ningún efecto. En las bases de
datos de usuario siempre está habilitada
la búsqueda de texto completo. Una
versión futura de SQL Server quitará
esta propiedad. No use esta propiedad
en nuevos trabajos de desarrollo, y
modifique lo antes posible las
aplicaciones que la usen actualmente.

IsInStandBy La base de datos está en línea como de 1: TRUE


solo lectura con el registro de
restauración permitido. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

IsLocalCursorsDefault El valor predeterminado de las 1: TRUE


declaraciones de cursores es LOCAL.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsMemoryOptimizedElevateToSnapshot Se obtiene acceso a las tablas Se aplica a: desde SQL Server 2014
Enabled optimizadas para memoria mediante el (12.x) hasta SQL Server 2017.
aislamiento de SNAPSHOT cuando el
valor de configuración de sesión
TRANSACTION ISOLATION LEVEL se
establece en READ COMMITTED, READ 1: TRUE
UNCOMMITTED o en un nivel de
aislamiento inferior. 0: FALSE

Tipo de datos base: int

IsMergePublished SQL Server admite la publicación de 1: TRUE


tablas de base de datos para la
replicación de mezcla, en el caso de que 0: FALSE
la replicación esté instalada.
NULL: entrada no válida

Tipo de datos base: int

IsNullConcat La concatenación con un operando 1: TRUE


NULL da como resultado NULL.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsNumericRoundAbortEnabled Se generan errores cuando se produce 1: TRUE


una pérdida de precisión en
expresiones. 0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsParameterizationForced La opción de base de datos 1: TRUE


PARAMETERIZATION es FORCED por
medio del comando SET. 0: FALSE

NULL: entrada no válida

IsQuotedIdentifiersEnabled Se pueden usar comillas dobles en los 1: TRUE


identificadores.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

IsPublished Si la replicación está instalada, SQL 1: TRUE


Server admite la publicación de tablas
de base de datos para la replicación 0: FALSE
transaccional o de instantáneas.
NULL: entrada no válida

Tipo de datos base: int

IsRecursiveTriggersEnabled Se habilita la activación recursiva de 1: TRUE


desencadenadores.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsSubscribed La base de datos está suscrita a una 1: TRUE


publicación.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int

IsSyncWithBackup La base de datos es una base de datos 1: TRUE


publicada o una base de datos de
distribución y admite una restauración 0: FALSE
que no interrumpirá la replicación
transaccional. NULL: entrada no válida

Tipo de datos base: int

IsTornPageDetectionEnabled Motor de base de datos de SQL Server 1: TRUE


detecta operaciones de E/S incompletas
debido a problemas con el suministro 0: FALSE
eléctrico u otros errores del sistema.
NULL: entrada no válida

Tipo de datos base: int

IsVerifiedClone La base de datos es una copia de solo Se aplica a: a partir de SQL Server
estadísticas y esquema de una base de 2016 (13.x) SP2.
datos de usuario, creada con la opción
WITH VERIFY_CLONEDB de DBCC
CLONEDATABASE. Vea este artículo de
Soporte técnico de Microsoft para más 1: TRUE
información.
0: FALSE

NULL: entrada no válida

Tipo de datos base: int


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

IsXTPSupported Indica si la base de datos es compatible Se aplica a: SQL Server (de SQL Server
con OLTP en memoria; es decir, si 2016 (13.x) a SQL Server 2017) y a Base
permite crear y usar tablas optimizadas de datos SQL de Azure.
para memoria y módulos compilados de
forma nativa. 1: TRUE

Específica de SQL Server: 0: FALSE

IsXTPSupported es independiente de la NULL: Entrada no válida, error o no


existencia de algún grupo de archivos aplicable
MEMORY_OPTIMIZED_DATA, necesario
para crear objetos de OLTP en memoria. Tipo de datos base: int

LastGoodCheckDbTime La fecha y hora de la última operación Se aplica a: a partir de SQL Server


DBCC CHECKDB que se ejecutó 2016 (13.x) SP2.
correctamente en la base de datos
especificada. 1 Si DBCC CHECKDB no se Un valor de fecha y hora
ha ejecutado en una base de datos, se
devuelve 01-01-1900 00:00:00.000. NULL: entrada no válida

Tipo de datos base: datetime

LCID El identificador de configuración Valor de LCID (en formato decimal).


regional (LCID) de Windows para la
intercalación. Tipo de datos base: int

MaxSizeInBytes Tamaño máximo de la base de datos (en Se aplica a: Base de datos SQL de
bytes). Azure, Almacenamiento de datos SQL.

1073741824

5368709120

10737418240

21474836480

32212254720

42949672960

53687091200

NULL: La base de datos no se ha


iniciado

Tipo de base de datos: bigint

Recuperación Modelo de recuperación de base de FULL: Modelo de recuperación completa


datos
BULK_LOGGED: Modelo de registro
masivo

SIMPLE: Modelo de recuperación simple

Tipo de datos base: nvarchar(128)


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

ServiceObjective Describe el nivel de rendimiento de la Uno de los siguientes:


base de datos en SQL Database o
Almacenamiento de datos SQL. NULL = La base de datos no se ha
iniciado

Compartido (para las ediciones Web o


Business)

Básico

S0

S1

S2

S3

P1

P2

P3

ElasticPool

Sistema (para la base de datos maestra)

Tipo de datos base: nvarchar(32)

ServiceObjectiveId El identificador del objetivo del servicio uniqueidentifier que identifica el


en SQL Database. objetivo del servicio.

SQLSortOrder Id. de orden de SQL Server compatible 0: La base de datos usa la intercalación
con versiones anteriores de SQL Server. de Windows

>0: Identificador de criterio de


ordenación de SQL Server

NULL: Entrada no válida o no se ha


iniciado la base de datos

Tipo de datos base: tinyint


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

Estado Estado de la base de datos. ONLINE: La base de datos está


disponible para consultas.

Nota: El estado ONLINE se puede


devolver mientras se abre la base de
datos y aún no se haya recuperado.
Para saber cuándo puede aceptar
conexiones una base de datos, consulte
la propiedad Collation de
DATABASEPROPERTYEX. La base de
datos puede aceptar conexiones cuando
la intercalación de base de datos
devuelve un valor distinto de NULL. En
el caso de las bases de datos Always
On, consulte las columnas
database_state o database_state_desc
de
sys.dm_hadr_database_replica_states
.

OFFLINE: La base de datos está


explícitamente sin conexión.

RESTORING: Se ha iniciado la
restauración de la base de datos.

RECOVERING: Se ha iniciado la
recuperación de la base de datos, que
aún no está lista para las consultas.

SUSPECT: La base de datos no se


recuperó.

EMERGENCY: La base de datos está en


un estado de emergencia de solo
lectura. El acceso se restringe a los
miembros del rol sysadmin

Tipo de datos base: nvarchar(128)

Updateability Indica si los datos se pueden modificar. READ_ONLY: La base de datos admite
las lecturas de datos, pero no las
modificaciones de datos.

READ_WRITE: La base de datos admite


las lecturas y modificaciones de datos.

Tipo de datos base: nvarchar(128)

UserAccess Indica qué usuarios pueden tener SINGLE_USER: Solo un usuario


acceso a la base de datos. db_owner, dbcreator o sysadmin a la
vez

RESTRICTED_USER: Solo los miembros


de los roles db_owner, dbcreator O
sysadmin

MULTI_USER: Todos los usuarios

Tipo de datos base: nvarchar(128)


PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

Versión Número interno de versión del código Número de versión: La base de datos
de SQL Server con el que se creó la está abierta.
base de datos. Solamente se identifica
con fines informativos. No compatible. NULL: La base de datos no se ha
La compatibilidad con versiones iniciado.
posteriores no está garantizada.
Tipo de datos base: int

NOTE
1Para las bases de datos que forman parte de un grupo de disponibilidad, LastGoodCheckDbTime devolverá la fecha y hora
de la última operación DBCC CHECKDB que se ejecutó correctamente en la réplica principal, con independencia de la réplica
desde la que se ejecute el comando.

Tipos de valores devueltos


sql_variant

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le
haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECT_ID ,
podrían devolver NULL si el usuario no tiene permisos en el objeto. Vea Configuración de visibilidad de los
metadatos para obtener más información.

Notas
DATABASEPROPERTYEX devuelve un único valor de propiedad cada vez. Para ver varios valores de propiedad, use la
vista de catálogo sys.databases.

Ejemplos
A. Recuperar el estado de la opción de base de datos AUTO_SHRINK
Este ejemplo devuelve el estado de la opción de base de datos AUTO_SHRINK para la base de datos
AdventureWorks .

SELECT DATABASEPROPERTYEX('AdventureWorks2014', 'IsAutoShrink');

El conjunto de resultados es el siguiente. Esto indica que AUTO_SHRINK está desactivado.

------------------
0

B. Recuperar la intercalación predeterminada de una base de datos


Este ejemplo devuelve varios atributos de la base de datos AdventureWorks .
SELECT
DATABASEPROPERTYEX('AdventureWorks2014', 'Collation') AS Collation,
DATABASEPROPERTYEX('AdventureWorks2014', 'Edition') AS Edition,
DATABASEPROPERTYEX('AdventureWorks2014', 'ServiceObjective') AS ServiceObjective,
DATABASEPROPERTYEX('AdventureWorks2014', 'MaxSizeInBytes') AS MaxSizeInBytes

El conjunto de resultados es el siguiente.

Collation Edition ServiceObjective MaxSizeInBytes


---------------------------- ------------- ---------------- --------------
SQL_Latin1_General_CP1_CI_AS DataWarehouse DW1000 5368709120

Vea también
ALTER DATABASE (Transact-SQL )
Estados de base de datos
sys.databases (Transact-SQL )
sys.database_files (Transact-SQL )
SERVERPROPERTY (Transact-SQL )
DB_ID (Transact-SQL)
19/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de identificación de base de datos de una base de datos especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DB_ID ( [ 'database_name' ] )

Argumentos
'database_name'
El nombre de la base de datos cuyo número de identificación de base de datos devolverá DB_ID . Si la llamada a
DB_ID omite database_name, DB_ID devuelve el identificador de la base de datos actual.

Tipos de valores devueltos


int

Notas
DB_ID solo se puede usar para devolver el identificador de la base de datos actual de Azure SQL Database. Se
devuelve NULL si el nombre de la base de datos que especificó es distinto de la base de datos actual.

Permisos
Si el autor de la llamada de DB_ID no posee una base de datos master o distinta de tempdb determinada, como
mínimo se requieren los permisos ALTER ANY DATABASE o VIEW ANY DATABASE de nivel de servidor para ver la fila
DB_ID correspondiente. Para la base de datos master, DB_ID necesita el permiso CREATE DATABASE como mínimo.
La base de datos a la que se conecta el autor de la llamada siempre aparece en sys.databases.

IMPORTANT
El rol público tiene el permiso VIEW ANY DATABASE de forma predeterminada, lo que permite a todos los inicios de sesión
ver información de la base de datos. Para evitar que un inicio de sesión detecte una base de datos, use REVOKE para revocar
el permiso VIEW ANY DATABASE del público, o bien use DENY para denegar el permiso VIEW ANY DATABASE para inicios de
sesión individuales.

Ejemplos
A. Devolver el Id. de base de datos de la base de datos actual
En este ejemplo se devuelve el identificador de base de datos de la base de datos actual.
SELECT DB_ID() AS [Database ID];
GO

B. Devolver el Id. de base de datos de una base de datos específica


En este ejemplo se devuelve el identificador de base de datos de la base de datos AdventureWorks2012.

SELECT DB_ID(N'AdventureWorks2008R2') AS [Database ID];


GO

C. Usar DB_ID para especificar el valor de un parámetro de una función del sistema
En este ejemplo se usa DB_ID para devolver el identificador de base de datos de la base de datos
AdventureWorks2012 en la función del sistema sys.dm_db_index_operational_stats . La función toma un Id. de
base de datos como primer parámetro.

DECLARE @db_id int;


DECLARE @object_id int;
SET @db_id = DB_ID(N'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.Person.Address');
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);
END;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Devolver el identificador de la base de datos actual
En este ejemplo se devuelve el identificador de base de datos de la base de datos actual.

SELECT DB_ID();

E. Devolver el identificador de la base de datos con nombre


En este ejemplo se devuelve el identificador de base de datos de la base de datos AdventureWorksDW2012.

SELECT DB_ID('AdventureWorksPDW2012');

Vea también
DB_NAME (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.databases (Transact-SQL )
sys.dm_db_index_operational_stats (Transact-SQL )
DB_NAME (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre de una base de datos especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DB_NAME ( [ database_id ] )

Argumentos
database_id
El número de identificación de la base de datos cuyo nombre va a devolver DB_NAME . Si la llamada a DB_NAME
omite database_id, DB_NAME devuelve el nombre de la base de datos actual.

Tipos de valores devueltos


nvarchar(128)

Permisos
Si el autor de la llamada de DB_NAME no posee una base de datos master o distinta de tempdb determinada,
como mínimo se requieren los permisos ALTER ANY DATABASE o VIEW ANY DATABASE de nivel de servidor para ver la
fila DB_ID correspondiente. Para la base de datos master, DB_ID necesita el permiso CREATE DATABASE como
mínimo. La base de datos a la que se conecta el autor de la llamada siempre aparece en sys.databases.

IMPORTANT
El rol público tiene el permiso VIEW ANY DATABASE de forma predeterminada, lo que permite a todos los inicios de sesión
ver información de la base de datos. Para evitar que un inicio de sesión detecte una base de datos, use REVOKE para
revocar el permiso VIEW ANY DATABASE del público, o bien use DENY para denegar el permiso VIEW ANY DATABASE para
inicios de sesión individuales.

Ejemplos
A. Devolver el nombre de la base de datos actual
En este ejemplo se devuelve el nombre de la base de datos actual.

SELECT DB_NAME() AS [Current Database];


GO

B. Devolver el nombre de la base de datos de un identificador de base de datos específico


En este ejemplo se devuelve el nombre de la base de datos con el identificador 3 .

USE master;
GO
SELECT DB_NAME(3)AS [Database Name];
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Devolver el nombre de la base de datos actual

SELECT DB_NAME() AS [Current Database];

D. Devolver el nombre de la base de datos usando el identificador de base de datos


En este ejemplo se devuelve el nombre y el identificador de base de datos de cada base de datos.

SELECT DB_NAME(database_id) AS [Database], database_id


FROM sys.databases;

Vea también
DB_ID (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.databases (Transact-SQL )
FILE_ID (Transact-SQL)
19/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Para el nombre lógico dado de un archivo de componente de la base de datos actual, esta función devuelve el
número de identificación (id.) del archivo.

IMPORTANT
Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL
Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que
actualmente la utilizan. Use FILE_IDEX en su lugar.

Convenciones de sintaxis de Transact-SQL

Sintaxis
FILE_ID ( file_name )

Argumentos
file_name
Una expresión de tipo sysname, que representa el nombre lógico del archivo cuyo valor de identificador de
archivo FILE_ID va a devolver.

Tipos devueltos
smallint

Notas
file_name corresponde al nombre de archivo lógico mostrado en la columna name de las vistas de catálogo
sys.master_files o sys.database_files.
FILE_ID devuelve NULL si file_name no corresponde al nombre lógico de un archivo de componente de la base
de datos actual.
En SQL Server, el número de identificación de archivo asignado a los catálogos de texto completo excede 32767.
Como la función FILE_ID tiene un tipo de devolución smallint, FILE_ID no admitirá los archivos de texto
completo. Use FILE_IDEX en su lugar.

Ejemplos
En este ejemplo se devuelve el valor de identificador de archivo del archivo AdventureWorks_Data , un archivo de
componente de la base de datos ADVENTUREWORKS2012 .
USE AdventureWorks2012;
GO
SELECT FILE_ID('AdventureWorks2012_Data')AS 'File ID';
GO

El conjunto de resultados es el siguiente.

File ID
-------
1
(1 row(s) affected)

Ver también
Características desusadas del motor de base de datos de SQL Server 2016
FILE_NAME (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.database_files (Transact-SQL )
sys.master_files (Transact-SQL )
FILE_IDEX (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de identificación del archivo (Id.) para el nombre del archivo lógico de datos, registro o texto
completo de la base de datos actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FILE_IDEX ( file_name )

Argumentos
file_name
Es una expresión de tipo sysname que representa el nombre del archivo para el que se devuelve el identificador
del archivo.

Tipos devueltos
int
NULL en caso de error

Notas
file_name corresponde al nombre de archivo lógico mostrado en la columna name en las vistas de catálogo
sys.master_files o sys.database_files.
FILE_IDEX se puede utilizar en una lista de selección, en una cláusula WHERE o en cualquier lugar en el que se
permita una expresión. Para obtener más información, vea Expresiones (Transact-SQL ).

Ejemplos
A. Recuperar el Id. de archivo de un archivo especificado
El siguiente ejemplo devuelve el Id. de archivo para el archivo AdventureWorks_Data .

USE AdventureWorks2012;
GO
SELECT FILE_IDEX('AdventureWorks2012_Data') AS 'File ID';
GO

El conjunto de resultados es el siguiente.


File ID
-------
1
(1 row(s) affected)

B. Recuperar el Id. de archivo cuando se desconoce el nombre del archivo


En el siguiente ejemplo se devuelve el identificador de archivo del archivo de registro de AdventureWorks
seleccionando el nombre del archivo lógico de la vista de catálogo sys.database_files en la que el tipo de
archivo es igual a 1 (registro).

USE AdventureWorks2012;
GO
SELECT FILE_IDEX((SELECT TOP (1) name FROM sys.database_files WHERE type = 1)) AS 'File ID';
GO

El conjunto de resultados es el siguiente.

File ID
-------
2

C. Recuperar el Id. de archivo de un archivo de catálogo de texto completo


En el siguiente ejemplo se devuelve el identificador de archivo de un archivo de texto completo seleccionando el
nombre del archivo lógico de la vista de catálogo sys.database_files en la que el tipo de archivo es igual a 4
(texto completo). En este ejemplo se devuelve NULL si no existe ningún catálogo de texto completo.

SELECT FILE_IDEX((SELECT name FROM sys.master_files WHERE type = 4))


AS 'File_ID';

Ver también
Funciones de metadatos (Transact-SQL )
sys.database_files (Transact-SQL )
sys.master_files (Transact-SQL )
FILE_NAME (Transact-SQL)
19/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre de archivo lógico correspondiente a un número de identificación (id.) de archivo
dado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FILE_NAME ( file_id )

Argumentos
file_id
Número de identificación de archivo cuyo nombre de archivo FILE_NAME va a devolver. file_id tiene un tipo de
datos int.

Tipos devueltos
nvarchar(128)

Notas
file_ID corresponde a la columna file_id de la vista de catálogo sys.master_files o la vista de catálogo
sys.database_files.

Ejemplos
En este ejemplo se devuelven los nombres de archivo de file_ID 1 y file_ID de la base de datos
AdventureWorks2012.

SELECT FILE_NAME(1) AS 'File Name 1', FILE_NAME(2) AS 'File Name 2';


GO

El conjunto de resultados es el siguiente.

File Name 1 File Name 2


------------------------- ------------------------
AdventureWorks2012_Data AdventureWorks2012_Log

(1 row(s) affected)

Ver también
FILE_IDEX (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.database_files (Transact-SQL )
sys.master_files (Transact-SQL )
FILEGROUP_ID (Transact-SQL)
19/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de identificación (id.) del grupo de archivos correspondiente al nombre del grupo
de archivos especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FILEGROUP_ID ( 'filegroup_name' )

Argumentos
filegroup_name expresión de tipo sysname que representa el nombre del grupo de archivos cuyo identificador de
grupo de archivos FILEGROUP_ID va a devolver.

Tipos devueltos
int

Notas
filegroup_name corresponde a la columna name de la vista de catálogo sys.filegroups.

Ejemplos
En este ejemplo se devuelve el identificador del grupo de archivos denominado PRIMARY de la base de datos
AdventureWorks2012.

SELECT FILEGROUP_ID('PRIMARY') AS [Filegroup ID];


GO

El conjunto de resultados es el siguiente.

Filegroup ID
------------
1

(1 row(s) affected)

Ver también
FILEGROUP_NAME (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.filegroups (Transact-SQL )
FILEGROUP_NAME (Transact-SQL)
19/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre del grupo de archivos correspondiente al número de identificación (id.) del grupo
de archivos especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FILEGROUP_NAME ( filegroup_id )

Argumentos
filegroup_id
El número de identificación del grupo de archivos cuyo nombre de grupo de archivos FILEGROUP_NAME va a
devolver. filegroup_id tiene un tipo de datos smallint.

Tipos devueltos
nvarchar(128)

Notas
filegroup_id corresponde a la columna data_space_id de la vista de catálogo sys.filegroups.

Ejemplos
En este ejemplo se devuelve el nombre del grupo de archivos del identificador de grupo de archivos 1 en la base
de datos AdventureWorks2012.

SELECT FILEGROUP_NAME(1) AS [Filegroup Name];


GO

El conjunto de resultados es el siguiente.

Filegroup Name
-----------------------
PRIMARY

(1 row(s) affected)

Ver también
Funciones de metadatos (Transact-SQL )
SELECT (Transact-SQL )
sys.filegroups (Transact-SQL )
FILEGROUPPROPERTY (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de una propiedad determinada del grupo de archivos cuando se proporciona con el nombre de
un grupo de archivos y de una propiedad.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FILEGROUPPROPERTY ( filegroup_name , property )

Argumentos
filegroup_name
Es una expresión de tipo sysname que representa el nombre del grupo de archivos del que se va a devolver
información de una propiedad con nombre.
property
Es una expresión de tipo varchar(128) que contiene el nombre de la propiedad del grupo de archivos que se va a
devolver. property puede ser uno de estos valores.

VALOR DESCRIPCIÓN VALOR DEVUELTO

IsReadOnly El grupo de archivos es de solo lectura. 1 = True

0 = False

NULL = La entrada no es válida.

IsUserDefinedFG El grupo de archivos es un grupo de 1 = True


archivos definido por el usuario.
0 = False

NULL = La entrada no es válida.

IsDefault El grupo de archivos es el grupo de 1 = True


archivos predeterminado.
0 = False

NULL = La entrada no es válida.

Tipos devueltos
int

Notas
filegroup_name corresponde a la columna name de la vista de catálogo sys.filegroups.

Ejemplos
En este ejemplo se devuelve el valor de la propiedad IsDefault del grupo de archivos principal de la base de
datos AdventureWorks2012.

SELECT FILEGROUPPROPERTY('PRIMARY', 'IsDefault') AS 'Default Filegroup';


GO

El conjunto de resultados es el siguiente.

Default Filegroup
---------------------
1

(1 row(s) affected)

Ver también
FILEGROUP_ID (Transact-SQL )
FILEGROUP_NAME (Transact-SQL )
Funciones de metadatos (Transact-SQL )
SELECT (Transact-SQL )
sys.filegroups (Transact-SQL )
FILEPROPERTY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de una propiedad de nombre de archivo especificada al especificar un nombre de archivo en la
base de datos actual y un nombre de propiedad. Devuelve NULL para los archivos que no estén en la base de
datos actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FILEPROPERTY ( file_name , property )

Argumentos
file_name
Es una expresión que contiene el nombre del archivo asociado a la base de datos actual de la que se va a devolver
información de propiedades. file_name es nchar(128).
property
Es una expresión que contiene el nombre de la propiedad de archivo que se va a devolver. property es varchar
(128) y puede ser uno de estos valores.

VALOR DESCRIPCIÓN VALOR DEVUELTO

IsReadOnly El grupo de archivos es de solo lectura. 1 = True

0 = False

NULL = La entrada no es válida.

IsPrimaryFile El archivo es el archivo principal. 1 = True

0 = False

NULL = La entrada no es válida.

IsLogFile El archivo es un archivo de registro. 1 = True

0 = False

NULL = La entrada no es válida.

SpaceUsed Cantidad de espacio utilizada por el Número de páginas asignadas en el


archivo especificado. archivo.

Tipos devueltos
int

Notas
file_name corresponde a la columna name de la vista de catálogo sys.master_files o sys.database_files.

Ejemplos
En el siguiente ejemplo se devuelve el valor de la propiedad IsPrimaryFile del nombre de archivo
AdventureWorks_Data de la base de datos AdventureWorks2012.

SELECT FILEPROPERTY('AdventureWorks2012_Data', 'IsPrimaryFile')AS [Primary File];


GO

El conjunto de resultados es el siguiente.

Primary File
-------------
1
(1 row(s) affected)

Ver también
FILEGROUPPROPERTY (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sp_spaceused (Transact-SQL )
sys.database_files (Transact-SQL )
sys.master_files (Transact-SQL )
FULLTEXTCATALOGPROPERTY (Transact-SQL)
18/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de las propiedades de catálogo de texto completo de SQL Server 2017.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FULLTEXTCATALOGPROPERTY ('catalog_name' ,'property')

Argumentos
NOTE
Se quitarán las propiedades siguientes de una versión futura de SQL Server: LogSize y PopulateStatus. Evite el uso de estas
propiedades en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que las usan actualmente.

catalog_name
Es una expresión que contiene el nombre del catálogo de texto completo.
property
Es una expresión que contiene el nombre de la propiedad del catálogo de texto completo. La tabla presenta las
propiedades y proporciona descripciones de la información que se devuelve.

PROPIEDAD DESCRIPCIÓN

AccentSensitivity Opción de distinción de acentos.

0 = No distinguir acentos

1 = Distinguir acentos

IndexSize Tamaño lógico del catálogo de texto completo en megabytes


(MB). Incluye el tamaño de los índices semánticos de similitud
de documentos y frases clave.

Para obtener más información, vea la sección "Comentarios"


más adelante en este tema.

ItemCount Número de elementos indizados que incluyen todos los


índices de similitud de documentos, frases clave y texto
completo en un catálogo
PROPIEDAD DESCRIPCIÓN

LogSize Se admite únicamente por compatibilidad con versiones


anteriores. Siempre devuelve 0.

Tamaño, en bytes, del conjunto combinado de los registros de


errores asociados a un catálogo de texto completo de los
servicios de Microsoft Search.

MergeStatus Si hay una combinación maestra en curso.

0 = La mezcla principal no está en curso.

1 = La mezcla principal está en curso.

PopulateCompletionAge Diferencia, en segundos, entre la terminación del último


rellenado del índice de texto completo y 01/01/1990
00:00:00.

Solo se actualiza para rastreos completos e incrementales.


Devuelve 0 si no se ha producido ningún rellenado.

PopulateStatus 0 = Inactivo

1 = Rellenado completo en curso

2 = En pausa

3 = Acelerado

4 = En recuperación

5 = Apagado

6 = Rellenado incremental en curso

7 = Generación del índice

8 = El disco está lleno. En pausa.

9 = Seguimiento de cambios

UniqueKeyCount Número de claves únicas en el catálogo de texto completo.

ImportStatus Si se va a importar el catálogo de texto completo.

0 = Si no se va a importar el catálogo de texto completo.

1 = Si se va a importar el catálogo de texto completo.

Tipos devueltos
int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server 2017, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que
se le haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como
FULLTEXTCATALOGPROPERTY, pueden devolver NULL si el usuario no tiene ningún permiso para el objeto.
Para más información, vea sp_help_fulltext_catalogs (Transact-SQL ).

Notas
FULLTEXTCATALOGPROPERTY ('catalog_name','IndexSize') solo examina fragmentos con el estado 4 o 6,
como se muestra en sys.fulltext_index_fragments. Estos fragmentos forman parte del índice lógico. Por lo tanto, la
propiedad IndexSize solo devuelve el tamaño del índice lógico. Sin embargo, durante una mezcla de índice, el
tamaño de índice real podría ser el doble de su tamaño lógico. Para encontrar el tamaño real que está usando un
índice de texto completo durante una combinación, use el procedimiento almacenado del sistema sp_spaceused.
Ese procedimiento mira en todos los fragmentos asociados a un índice de texto completo. Si limita el crecimiento
del archivo de catálogo de texto completo y no permite suficiente espacio para el proceso de mezcla, el relleno de
texto completo puede producir un error. En este caso, FULLTEXTCATALOGPROPERTY ('catalog_name'
,'IndexSize') devuelve 0 y se escribe el error siguiente en el registro de texto completo:
Error: 30059, Severity: 16, State: 1. A fatal error occurred during a full-text population and caused the
population to be cancelled. Population type is: FULL; database name is FTS_Test (id: 13); catalog name is
t1_cat (id: 5); table name t1 (id: 2105058535). Fix the errors that are logged in the full-text crawl log.
Then, resume the population. The basic Transact-SQL syntax for this is: ALTER FULLTEXT INDEX ON table_name
RESUME POPULATION.

Es importante que las aplicaciones no entren en bucles de espera; para ello, compruebe si la propiedad
PopulateStatus indica inactividad (indicando que el rellenado se ha completado) porque esto quita muchos ciclos
de la CPU a la base de datos y a los procesos de búsqueda de texto completo, y provoca tiempos de espera.
Además, siempre es recomendable comprobar la propiedad PopulateStatus correspondiente a nivel de tabla,
TableFullTextPopulateStatus, de la función del sistema OBJECTPROPERTYEX. Ésta y otras nuevas propiedades
de texto completo en OBJECTPROPERTYEX proporcionan información más detallada sobre las tablas de
indización de texto completo. Para obtener más información, vea OBJECTPROPERTYEX (Transact-SQL ).

Ejemplos
En el ejemplo siguiente se devuelve el número de elementos de texto completo indizados que se encuentran en el
catálogo de texto completo Cat_Desc .

USE AdventureWorks2012;
GO
SELECT fulltextcatalogproperty('Cat_Desc', 'ItemCount');
GO

Ver también
FULLTEXTSERVICEPROPERTY (Transact-SQL )
Metadata Functions (Transact-SQL ) [Funciones de metadatos (Transact-SQL )]
sp_help_fulltext_catalogs (Transact-SQL )
FULLTEXTSERVICEPROPERTY (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información relacionada con las propiedades del motor de búsqueda de texto completo. Estas
propiedades se pueden establecer y recuperar usando sp_fulltext_service.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FULLTEXTSERVICEPROPERTY ('property')

Argumentos
property
Es una expresión que contiene el nombre de la propiedad del servicio de búsqueda en texto completo. La tabla
presenta las propiedades y proporciona descripciones de la información que se devuelve.

NOTE
Las propiedades siguientes se quitarán en una futura versión de Microsoft SQL Server: ConnectTimeout, DataTimeout y
ResourceUsage. Evite el uso de estas propiedades en nuevos trabajos de desarrollo y piense en modificar las aplicaciones
que las usan actualmente.

PROPIEDAD VALOR

ResourceUsage Devuelve 0. Se admite únicamente por compatibilidad con


versiones anteriores.

ConnectTimeout Devuelve 0. Se admite únicamente por compatibilidad con


versiones anteriores.

IsFulltextInstalled El componente de texto completo se instala con la instancia


actual de SQL Server.

0 = El componente de texto completo no está instalado.

1 = El componente de texto completo está instalado.

NULL = Entrada no válida o error.

DataTimeout Devuelve 0. Se admite únicamente por compatibilidad con


versiones anteriores.
PROPIEDAD VALOR

LoadOSResources Indica si los separadores de palabras y filtros del sistema


operativo se registran y utilizan con esta instancia de SQL
Server. De forma predeterminada, esta propiedad está
deshabilitada para impedir cambios de comportamiento
involuntarios por actualizaciones del sistema operativo.
Habilitar el uso de recursos del sistema operativo proporciona
acceso a recursos de idiomas y tipos de documento
registrados en los Servicios de Microsoft Index Server, pero
que no tienen instalado un recurso específico de la instancia.
Si habilita la carga de recursos del sistema operativo,
asegúrese de que son binarios con firma de confianza; de lo
contrario, no se pueden cargar cuando VerifySignature se
establece en 1.

0 = Utiliza solo los filtros y separadores de palabras


específicos de esta instancia de SQL Server.

1 = Cargar filtros del sistema operativo y separadores de


palabras.

VerifySignature Especifica si el servicio de Microsoft Search carga solo binarios


con firma. De forma predeterminada, solo se cargan binarios
con firma de confianza.

0 = No comprueba si los binarios están firmados.

1 = Comprueba que solo se cargan binarios con firma de


confianza.

Tipos devueltos
int

Ejemplos
En el ejemplo siguiente se comprueba si solo se cargan binarios con firma, y el valor devuelto indica que esta
comprobación no se está produciendo.

SELECT fulltextserviceproperty('VerifySignature');

El conjunto de resultados es el siguiente.

-----------
0

Tenga en cuenta que para restablecer la comprobación de firmas en su valor predeterminado, 1, puede utilizar la
instrucción sp_fulltext_service siguiente:

EXEC sp_fulltext_service @action='verify_signature', @value=1;


GO

Ver también
FULLTEXTCATALOGPROPERTY (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sp_fulltext_service (Transact-SQL )
INDEX_COL (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de columna indizado. Devuelve NULL para los índices XML.
Convenciones de sintaxis de Transact-SQL

Sintaxis
INDEX_COL ( '[ database_name . [ schema_name ] .| schema_name ]
table_or_view_name', index_id , key_id )

Argumentos
database_name
Es el nombre de la base de datos.
schema_name
Es el nombre del esquema al que pertenece el índice.
table_or_view_name
Es el nombre de la tabla o la vista indizada. table_or_view_name debe delimitarse con comillas simples y dobles y
los literales deben delimitarse con comillas simples y puede ser un nombre completo e incluir el nombre de la
base de datos y el nombre del esquema.
id_de_índice
Es el identificador del índice. index_ID es int.
key_id
Es la posición de la columna de clave de índice. key_ID es int.

Tipos devueltos
nvarchar (128 )

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como INDEX_COL, pueden
devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información, consulte
Metadata Visibility Configuration.

Ejemplos
A. Utilizar INDEX_COL para devolver un nombre de columna de índice
En el ejemplo siguiente se devuelven los nombres de columna de las dos columnas de clave del índice
PK_SalesOrderDetail_SalesOrderID_LineNumber .

USE AdventureWorks2012;
GO
SELECT
INDEX_COL (N'AdventureWorks2012.Sales.SalesOrderDetail', 1,1) AS
[Index Column 1],
INDEX_COL (N'AdventureWorks2012.Sales.SalesOrderDetail', 1,2) AS
[Index Column 2]
;
GO

El conjunto de resultados es:

Index Column 1 Index Column 2


-----------------------------------------------
SalesOrderID SalesOrderDetailID

Ver también
Expresiones (Transact-SQL )
Funciones de metadatos (Transact-SQL )
sys.indexes (Transact-SQL )
sys.index_columns (Transact-SQL )
INDEXKEY_PROPERTY (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de la clave de índice. Devuelve NULL para los índices XML.

IMPORTANT
Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL
Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que
actualmente la utilizan. Use mejor sys.index_columns (Transact-SQL).

Convenciones de sintaxis de Transact-SQL

Sintaxis
INDEXKEY_PROPERTY ( object_ID ,index_ID ,key_ID ,property )

Argumentos
object_ID
Es el número de identificación de objeto de la tabla o vista indizada. object_ID es int.
index_ID
Es el número de identificación del índice. index_ID es int.
key_ID
Es la posición de la columna de clave de índice. key_ID es int.
property
Es el nombre de la propiedad cuya información se va a devolver. property es una cadena de caracteres y puede
tener uno de los valores siguientes.

VALOR DESCRIPCIÓN

ColumnId Identificador de columna en la posición key_ID del índice.

IsDescending Orden en el que se almacena la columna de índice.

1 = Descendente ?0 = Ascendente

Tipos devueltos
int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como INDEXKEY_PROPERTY,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.

Ejemplos
En el ejemplo siguiente, se devuelven ambas propiedades para el identificador de índice 1 , la columna de clave 1
de la tabla Production.Location .

USE AdventureWorks2012;
GO
SELECT
INDEXKEY_PROPERTY(OBJECT_ID('Production.Location', 'U'),
1,1,'ColumnId') AS [Column ID],
INDEXKEY_PROPERTY(OBJECT_ID('Production.Location', 'U'),
1,1,'IsDescending') AS [Asc or Desc order];

El conjunto de resultados es:

Column ID Asc or Desc order


----------- -----------------
1 0

(1 row(s) affected)

Ver también
INDEX_COL (Transact-SQL )
INDEXPROPERTY (Transact-SQL )
sys.objects (Transact-SQL )
sys.indexes (Transact-SQL )
sys.index_columns (Transact-SQL )
INDEXPROPERTY (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de propiedad del índice con nombre o las estadísticas de un número de identificación, nombre
de índice o estadísticas y nombre de propiedad de una tabla especificada. Devuelve NULL para los índices XML.
Convenciones de sintaxis de Transact-SQL

Sintaxis
INDEXPROPERTY ( object_ID , index_or_statistics_name , property )

Argumentos
object_ID
Es una expresión que contiene el número de identificación de objeto de la tabla o de la vista indizada de la que se
va a proporcionar información de propiedades del índice. object_ID es int.
index_or_statistics_name
Es una expresión que contiene el nombre del índice o las estadísticas para los cuales se va a devolver la
información de la propiedad. index_or_statistics_name es nvarchar(128).
property
Es una expresión que contiene el nombre de la propiedad de base de datos que se va a devolver. property es de
tipo varchar(128) y puede tener uno de estos valores.

NOTE
A menos que se especifique lo contrario, se devuelve NULL si property no es un nombre de propiedad válido, si object_ID no
es un identificador de objeto válido, si object_ID es un tipo de objeto incompatible con la propiedad especificada o si el autor
de la llamada no tiene permiso para ver los metadatos del objeto.

PROPIEDAD DESCRIPCIÓN VALOR

IndexDepth Profundidad del índice. Número de niveles del índice.

NULL = El índice o la entrada XML no


es válido.

IndexFillFactor Valor de factor de relleno utilizado al Factor de relleno


crear o volver a generar el índice por
última vez.

IndexID Id. del índice de una tabla o vista Id. del índice
indizada especificada.
PROPIEDAD DESCRIPCIÓN VALOR

IsAutoStatistics Las estadísticas han sido generadas por 1 = True


la opción AUTO_CREATE_STATISTICS de
ALTER DATABASE. 0 = Falso o índice XML.

IsClustered El índice está agrupado. 1 = True

0 = Falso o índice XML.

IsDisabled El índice está deshabilitado. 1 = True

0 = False

NULL = La entrada no es válida.

IsFulltextKey El índice es la clave de indización Se aplica a: desde SQL Server 2008


semántica y de texto completo de una hasta SQL Server 2017.
tabla.
1 = True

0 = Falso o índice XML.

NULL = La entrada no es válida.

IsHypothetical El índice es hipotético y no se puede 1 = True


utilizar directamente como ruta de
acceso a datos. Los índices hipotéticos 0 = False o índice XML
contienen estadísticas de nivel de
columna y son conservados y utilizados NULL = La entrada no es válida.
por el Asistente para la optimización de
motor de base de datos.

IsPadIndex El índice especifica el espacio que debe Se aplica a: desde SQL Server 2008
dejarse abierto en cada nodo interior. hasta SQL Server 2017.

1 = True

0 = Falso o índice XML.

IsPageLockDisallowed El valor de bloqueo de página Se aplica a: desde SQL Server 2008


establecido por la opción hasta SQL Server 2017.
ALLOW_PAGE_LOCKS de ALTER INDEX.
1 = No se permite el bloqueo de
página.

0 = Se permite el bloqueo de página.

NULL = La entrada no es válida.

IsRowLockDisallowed El valor de bloqueo de fila establecido Se aplica a: desde SQL Server 2008
por la opción ALLOW_ROW_LOCKS de hasta SQL Server 2017.
ALTER INDEX.
1 = No se permite el bloqueo de fila.

0 = Se permite el bloqueo de fila.

NULL = La entrada no es válida.


PROPIEDAD DESCRIPCIÓN VALOR

IsStatistics index_or_statistics_name son 1 = True


estadísticas creadas por la instrucción
CREATE STATISTICS o por la opción 0 = Falso o índice XML.
AUTO_CREATE_STATISTICS de ALTER
DATABASE.

IsUnique El índice es exclusivo. 1 = True

0 = Falso o índice XML.

IsColumnstore El índice es un índice de almacén de Se aplica a: desde SQL Server 2012


columnas optimizado de memoria (11.x) hasta SQL Server 2017.
xVelocity.
1 = True

0 = False

Tipos devueltos
int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como INDEXPROPERTY, pueden
devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información, consulte
Metadata Visibility Configuration.

Ejemplos
En el ejemplo siguiente se devuelven los valores de las propiedades IsClustered, IndexDepth e IndexFillFactor
del índice PK_Employee_BusinessEntityID de la tabla Employee en la base de datos AdventureWorks2012.

SELECT
INDEXPROPERTY(OBJECT_ID('HumanResources.Employee'),
'PK_Employee_BusinessEntityID','IsClustered')AS [Is Clustered],
INDEXPROPERTY(OBJECT_ID('HumanResources.Employee'),
'PK_Employee_BusinessEntityID','IndexDepth') AS [Index Depth],
INDEXPROPERTY(OBJECT_ID('HumanResources.Employee'),
'PK_Employee_BusinessEntityID','IndexFillFactor') AS [Fill Factor];

El conjunto de resultados es:

Is Clustered Index Depth Fill Factor


------------ ----------- -----------
1 2 0

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se examinan las propiedades de uno de los índices de la tabla FactResellerSales .

-- Uses AdventureWorks

SELECT
INDEXPROPERTY(OBJECT_ID('dbo.FactResellerSales'),
'ClusteredIndex_6d10fa223e5e4c1fbba087e29e16a7a2','IsClustered') AS [Is Clustered],
INDEXPROPERTY(OBJECT_ID('dbo.FactResellerSales'),
'ClusteredIndex_6d10fa223e5e4c1fbba087e29e16a7a2','IsColumnstore') AS [Is Columnstore Index],
INDEXPROPERTY(OBJECT_ID('dbo.FactResellerSales'),
'ClusteredIndex_6d10fa223e5e4c1fbba087e29e16a7a2','IndexFillFactor') AS [Fill Factor];
GO

Ver también
CREATE INDEX (Transact-SQL )
Utilizar las estadísticas para mejorar el rendimiento de las consultas
sys.indexes (Transact-SQL )
sys.index_columns (Transact-SQL )
sys.stats (Transact-SQL )
sys.stats_columns (Transact-SQL )
NEXT VALUE FOR (Transact-SQL)
17/07/2018 • 16 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Genera un número de secuencia a partir del objeto de secuencia especificado.
Para más información sobre cómo crear y usar secuencias, vea Números de secuencia. Use
sp_sequence_get_range para generar una reserva de un intervalo de números de secuencia.
Convenciones de sintaxis de Transact-SQL

Sintaxis
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name
[ OVER (<over_order_by_clause>) ]

Argumentos
database_name
Nombre de la base de datos que contiene el objeto de secuencia.
schema_name
Nombre del esquema que contiene el objeto de secuencia.
sequence_name
Nombre del objeto de secuencia que genera el número.
over_order_by_clause
Determina el orden en el que se asigna el valor de secuencia a las filas de una partición. Para más información, vea
Cláusula OVER (Transact-SQL ).

Tipos devueltos
Devuelve un número utilizando el tipo de la secuencia.

Notas
La función NEXT VALUE FOR se puede usar en procedimientos almacenados y en desencadenadores.
Cuando la función NEXT VALUE FOR se usa en una consulta o restricción predeterminada, si se usa más de una
vez el mismo objeto de secuencia, o si se usa el mismo objeto de secuencia en la instrucción que proporciona los
valores y en una restricción predeterminada que se está ejecutando, se devolverá el mismo valor para todas las
columnas que hagan referencia a la misma secuencia dentro de una fila del conjunto de resultados.
La función NEXT VALUE FOR es no determinista y solo se permite en contextos donde se define bien el número
de valores de secuencia generados. A continuación se encuentra la definición de cuántos valores se utilizarán para
cada objeto de secuencia al que se hace referencia en una instrucción determinada:
SELECT: por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo una vez por fila
en el resultado de la instrucción.
INSERT … VALUES: por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo una
vez por cada fila insertada en la instrucción.
UPDATE: por cada objeto de secuencia al que se hace referencia, se genera un valor nuevo para cada fila
que actualiza la instrucción.
Instrucciones de procedimiento (como DECLARE, SET, etc.): por cada objeto de secuencia al que se hace
referencia, se genera un valor nuevo para cada instrucción.

Limitaciones y restricciones
La función NEXT VALUE FOR no se puede usar en las siguientes situaciones:
Cuando una base de datos está en modo de solo lectura.
Como argumento a una función con valores de tabla.
Como argumento a una función de agregado.
En subconsultas que contienen expresiones de tabla comunes y tablas derivadas.
En vistas, en funciones definidas por el usuario o en columnas calculadas.
En una instrucción que use los operadores DISTINCT, UNION, UNION ALL, EXCEPT o INTERSECT.
En una instrucción que use la cláusula ORDER BY, a menos que se use NEXT VALUE FOR… OVER
(ORDER BY…).
En las siguientes cláusulas: FETCH, OVER, OUTPUT, ON, PIVOT, UNPIVOT, GROUP BY, HAVING,
COMPUTE, COMPUTE BY o FOR XML.
En expresiones condicionales que usan CASE, CHOOSE, COALESCE, IIF, ISNULL o NULLIF.
En una cláusula VALUES que no forme parte de una instrucción INSERT.
En la definición de una restricción CHECK.
En la definición de una regla u objeto predeterminado. (Se puede utilizar en una restricción
predeterminada).
Como valor predeterminado de un tipo de tabla definido por el usuario.
En una instrucción que use TOP, OFFSET o cuando se establece la opción ROWCOUNT.
En la cláusula WHERE de una instrucción.
En una instrucción MERGE (salvo cuando la función NEXT VALUE FOR se use en una restricción
predeterminada en la tabla de destino y el valor predeterminado se use en la instrucción CREATE de la
instrucción MERGE ).

Utilizar un objeto de secuencia en una restricción predeterminada


Al usar la función NEXT VALUE FOR en una restricción predeterminada, se aplican las siguientes reglas:
Se puede hacer referencia a un objeto de secuencia único desde restricciones Default en varias tablas.
La tabla y el objeto de secuencia deben residir en la misma base de datos.
El usuario que agrega la restricción predeterminada debe tener el permiso REFERENCES en el objeto de
secuencia.
No se puede quitar un objeto de secuencia al que se haga referencia desde una restricción predeterminada
antes de quitar la restricción predeterminada.
Se devuelve el mismo número de secuencia para todas las columnas de una fila si varias restricciones
Default utilizan el mismo objeto de secuencia, o si el mismo objeto de secuencia se utiliza en la instrucción
que proporciona los valores y en una restricción Default que se esté ejecutando.
Las referencias a la función NEXT VALUE FOR de una restricción predeterminada no pueden especificar la
cláusula OVER.
Se puede modificar un objeto de secuencia al que se haga referencia en una restricción predeterminada.
En el caso de las instrucciones INSERT … SELECT o INSERT … EXEC en las que los datos que se van a insertar
procedan de una consulta con una cláusula ORDER BY, los valores que devuelva la función NEXT VALUE
FOR se generarán en el orden especificado por la cláusula ORDER BY.

Utilizar un objeto de secuencia con una cláusula OVER ORDER BY


La función NEXT VALUE FOR permite generar valores de secuencia ordenados aplicando la cláusula OVER a la
llamada a NEXT VALUE FOR. Si usa la cláusula OVER, el usuario tiene la garantía de que los valores que se
devuelven se generan en el orden de la subcláusula ORDER BY de la cláusula OVER. Al usar la función NEXT
VALUE FOR con la cláusula OVER, se aplican las siguientes reglas adicionales:
Si hay varias llamadas a la función NEXT VALUE FOR para el mismo generador de secuencias en una
única instrucción, todas deben usar la misma definición de la cláusula OVER.
Si hay varias llamadas a la función NEXT VALUE FOR que hacen referencia a distintos generadores de
secuencias en una única instrucción, pueden tener distintas definiciones de la cláusula OVER.
Una cláusula OVER aplicada a la función NEXT VALUE FOR no admite la subcláusula PARTITION BY.
Si todas las llamadas a la función NEXT VALUE FOR de una instrucción SELECT especifican la cláusula
OVER, se puede usar una cláusula ORDER BY en la instrucción SELECT.
La cláusula OVER se admite con la función NEXT VALUE FOR si se usa en una instrucción SELECT o una
instrucción INSERT … SELECT … . No se puede usar la cláusula OVER con la función NEXT VALUE FOR en
las instrucciones UPDATE ni MERGE.
Si otro proceso está teniendo acceso al objeto de secuencia a la vez, los números devueltos podrían tener
lagunas.

Metadatos

Para más información sobre las secuencias, consulte la vista de catálogo sys.sequences.

Seguridad
Permisos
Requiere el permiso UPDATE en el objeto de secuencia o el esquema de la secuencia. Para obtener un ejemplo de
concesión de permisos, vea el ejemplo F más adelante en este tema.
Encadenamiento de propiedad
Los objetos de secuencia son compatibles con el encadenamiento de propiedad. Si el objeto de secuencia tiene el
mismo propietario que el procedimiento almacenado, desencadenador o tabla que hace la llamada (y un objeto de
secuencia como restricción predeterminada), no se necesita ninguna comprobación de permiso en el objeto de
secuencia. Si el objeto de secuencia no pertenece al mismo propietario que el procedimiento almacenado,
desencadenador o tabla que hace la llamada, se requiere una comprobación de permiso en el objeto de secuencia.
Cuando la función NEXT VALUE FOR se usa como valor predeterminado en una tabla, los usuarios deben tener
el permiso INSERT en la tabla y el permiso UPDATE en el objeto de secuencia para insertar datos por medio del
valor predeterminado.
Si la restricción predeterminada tiene el mismo propietario que el objeto de secuencia, no es necesario
ningún permiso en el objeto de secuencia cuando se llama a la restricción predeterminada.
Si la restricción predeterminada y el objeto de secuencia no son propiedad del mismo usuario, se necesitan
permisos en el objeto de secuencia aunque la llamada se haga mediante la restricción predeterminada.
Auditar
Para auditar la función NEXT VALUE FOR supervise SCHEMA_OBJECT_ACCESS_GROUP.

Ejemplos
Para ver ejemplos de cómo crear secuencias y cómo usar la función NEXT VALUE FOR para generar números de
secuencia, vea Números de secuencia.
En los siguientes ejemplos se utiliza una secuencia denominada CountBy1 en un esquema denominado Test .
Ejecute la siguiente instrucción para crear la secuencia Test.CountBy1 . En los ejemplos C y E se utiliza la base de
datos AdventureWorks2012, de modo que la secuencia CountBy1 se cree en esa base de datos.

USE AdventureWorks2012 ;
GO

CREATE SCHEMA Test;


GO

CREATE SEQUENCE Test.CountBy1


START WITH 1
INCREMENT BY 1 ;
GO

A. Usar una secuencia en una instrucción SELECT


En el siguiente ejemplo se crea una secuencia denominada CountBy1 que aumenta en uno cada vez que se utiliza.

SELECT NEXT VALUE FOR Test.CountBy1 AS FirstUse;


SELECT NEXT VALUE FOR Test.CountBy1 AS SecondUse;

El conjunto de resultados es el siguiente.

FirstUse
1

SecondUse
2

B. Establecer una variable en el siguiente valor de la secuencia


En el ejemplo siguiente se muestran tres maneras de establecer una variable en el siguiente valor de un número de
secuencia.
DECLARE @myvar1 bigint = NEXT VALUE FOR Test.CountBy1
DECLARE @myvar2 bigint ;
DECLARE @myvar3 bigint ;
SET @myvar2 = NEXT VALUE FOR Test.CountBy1 ;
SELECT @myvar3 = NEXT VALUE FOR Test.CountBy1 ;
SELECT @myvar1 AS myvar1, @myvar2 AS myvar2, @myvar3 AS myvar3 ;
GO

C. Usar una secuencia con una función de ventana de categoría

USE AdventureWorks2012 ;
GO

SELECT NEXT VALUE FOR Test.CountBy1 OVER (ORDER BY LastName) AS ListNumber,


FirstName, LastName
FROM Person.Contact ;
GO

D. Usar la función NEXT VALUE FOR en la definición de una restricción predeterminada


La función NEXT VALUE FOR se puede usar en la definición de una restricción predeterminada. Para ver un
ejemplo de uso de NEXT VALUE FOR en una instrucción CREATE TABLE, vea el ejemplo C de Números de
secuencia. En el siguiente ejemplo se utiliza ALTER TABLE para agregar una secuencia como valor predeterminado
a una tabla actual.

CREATE TABLE Test.MyTable


(
IDColumn nvarchar(25) PRIMARY KEY,
name varchar(25) NOT NULL
) ;
GO

CREATE SEQUENCE Test.CounterSeq


AS int
START WITH 1
INCREMENT BY 1 ;
GO

ALTER TABLE Test.MyTable


ADD
DEFAULT N'AdvWorks_' +
CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20))
FOR IDColumn;
GO

INSERT Test.MyTable (name)


VALUES ('Larry') ;
GO

SELECT * FROM Test.MyTable;


GO

E. Usar la función NEXT VALUE FOR en una instrucción INSERT


En el siguiente ejemplo se crea una tabla denominada TestTable y, a continuación, se utiliza la función
NEXT VALUE FOR para insertar una fila.
CREATE TABLE Test.TestTable
(CounterColumn int PRIMARY KEY,
Name nvarchar(25) NOT NULL) ;
GO

INSERT Test.TestTable (CounterColumn,Name)


VALUES (NEXT VALUE FOR Test.CountBy1, 'Syed') ;
GO

SELECT * FROM Test.TestTable;


GO

E. Usar la función NEXT VALUE FOR con SELECT ... INTO


En el siguiente ejemplo se usa la instrucción SELECT … INTO para crear una tabla denominada
Production.NewLocation y se usa la función NEXT VALUE FOR para numerar cada fila.

USE AdventureWorks2012 ;
GO

SELECT NEXT VALUE FOR Test.CountBy1 AS LocNumber, Name


INTO Production.NewLocation
FROM Production.Location ;
GO

SELECT * FROM Production.NewLocation ;


GO

F. Conceder permiso para ejecutar NEXT VALUE FOR


En el siguiente ejemplo se concede el permiso UPDATE a un usuario denominado AdventureWorks\Larry para
ejecutar NEXT VALUE FOR con Test.CounterSeq .

GRANT UPDATE ON OBJECT::Test.CounterSeq TO [AdventureWorks\Larry] ;

Ver también
CREATE SEQUENCE (Transact-SQL )
ALTER SEQUENCE (Transact-SQL )
Números de secuencia
OBJECT_DEFINITION (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el texto de origen de Transact-SQL para la definición de un objeto especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
OBJECT_DEFINITION ( object_id )

Argumentos
object_id
Es el identificador del objeto que se va a utilizar. object_id es int y se considera que representa un objeto del
contexto de la base de datos actual.

Tipos devueltos
nvarchar(max)

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECT_DEFINITION,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.

Notas
El Motor de base de datos de SQL Server da por hecho que object_id se encuentra en el contexto de la base de
datos actual. La intercalación de la definición del objeto siempre coincide con la del contexto de la base de datos
que realiza la llamada.
OBJECT_DEFINITION se aplica a los siguientes tipos de objeto:
C = Restricción CHECK
D = Default (restricción o independiente)
P = Procedimiento almacenado de SQL
FN = Función escalar de SQL
R = Regla
RF = Procedimiento de filtro de replicación
TR = Desencadenador SQL (desencadenador DML en el ámbito del esquema o desencadenador DDL en
el ámbito de la base de datos o del servidor)
IF = Función SQL insertada con valores de tabla
TF = Función con valores de tabla de SQL
V = Vista

Permisos
Las definiciones de los objetos del sistema están visibles públicamente. La definición de los objetos de usuario
está visible para el propietario del objeto o los receptores de los permisos siguientes: ALTER, CONTROL, TAKE
OWNERSHIP o VIEW DEFINITION. Estos permisos corresponden implícitamente a los miembros de los roles
fijos de base de datos db_owner, db_ddladminy db_securityadmin .

Ejemplos
A. Devolver el texto de origen de un objeto definido por el usuario
En el ejemplo siguiente se devuelve la definición de un desencadenador definido por el usuario, uAddress , en el
esquema Person . Se utiliza la función integrada OBJECT_ID para devolver el Id. de objeto del desencadenador a la
instrucción OBJECT_DEFINITION .

USE AdventureWorks2012;
GO
SELECT OBJECT_DEFINITION (OBJECT_ID(N'Person.uAddress')) AS [Trigger Definition];
GO

B. Devolver el texto de origen de un objeto del sistema


En el ejemplo siguiente se devuelve la definición del procedimiento almacenado del sistema sys.sp_columns .

USE AdventureWorks2012;
GO
SELECT OBJECT_DEFINITION (OBJECT_ID(N'sys.sp_columns')) AS [Object Definition];
GO

Ver también
Funciones de metadatos (Transact-SQL )
OBJECT_NAME (Transact-SQL )
OBJECT_ID (Transact-SQL )
sp_helptext (Transact-SQL )
sys.sql_modules (Transact-SQL )
sys.server_sql_modules (Transact-SQL )
OBJECT_ID (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de Id. del objeto de base de datos de un objeto de ámbito de esquema.

IMPORTANT
Los objetos que no están en el ámbito del esquema, por ejemplo los desencadenadores DDL, no se pueden consultar
utilizando OBJECT_ID. En el caso de objetos que no están en la vista de catálogo sys.objects, debe obtener los números de
identificación de objeto mediante consultas realizadas a la vista de catálogo correspondiente. Por ejemplo, para devolver el
número de identificación de objeto de un desencadenador DDL, use
SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog``' .

Convenciones de sintaxis de Transact-SQL

Sintaxis
OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ]
object_name' [ ,'object_type' ] )

Argumentos
' object_name '
Es el objeto que va a utilizarse. object_name es varchar o nvarchar. Si object_name es varchar, se convierte
implícitamente a nvarchar. Especificar los nombres de la base de datos y del esquema es opcional.
' object_type '
Es el tipo de objeto de ámbito del esquema. object_type es varchar o nvarchar. Si object_type es varchar, se
convierte implícitamente en nvarchar. Para ver una lista de tipos de objeto, eche un vistazo a la columna type
en sys.objects (Transact-SQL ).

Tipos devueltos
int

Excepciones
Para un índice espacial, OBJECT_ID devuelve NULL.
Devuelve NULL si se produce un error.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya
concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECT_ID,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.
Notas
Cuando el parámetro de una función del sistema es opcional, se asumen la base de datos, el equipo host, el
usuario del servidor o el usuario de la base de datos actuales. Las funciones integradas siempre deben ir
seguidas de paréntesis.
Cuando se especifica un nombre de tabla temporal, el nombre de base de datos debe ir antes del nombre de
tabla temporal, a menos que la base de datos temporal sea tempdb. Por ejemplo:
SELECT OBJECT_ID('tempdb..#mytemptable') .

Las funciones del sistema se pueden usar en la lista de selección, en la cláusula WHERE y en cualquier lugar
donde se permita una expresión. Para más información, vea Expresiones (Transact-SQL ) y WHERE (Transact-
SQL ).

Ejemplos
A. Devolver el identificador de objeto de un objeto especificado
En este ejemplo se devuelve el Id. de objeto para la tabla Production.WorkOrder en la base de datos
AdventureWorks2012.

USE master;
GO
SELECT OBJECT_ID(N'AdventureWorks2012.Production.WorkOrder') AS 'Object ID';
GO

B. Comprobar la existencia de un objeto


En el ejemplo siguiente se comprueba la existencia de una tabla especificada comprobando si la tabla tiene un
identificador de objeto. Si la tabla existe, se elimina. Si la tabla no existe, la instrucción DROP TABLE no se ejecuta.

USE AdventureWorks2012;
GO
IF OBJECT_ID (N'dbo.AWBuildVersion', N'U') IS NOT NULL
DROP TABLE dbo.AWBuildVersion;
GO

C. Usar OBJECT_ID para especificar el valor de un parámetro de función del sistema


En este ejemplo se devuelve información de todos los índices y particiones de la tabla Person.Address en la base
de datos AdventureWorks2012 con la función sys.dm_db_index_operational_stats.

IMPORTANT
Cuando utilice las funciones DB_ID y OBJECT_ID de Transact-SQL para devolver un valor de parámetro, asegúrese de que
siempre se devuelva un Id. válido. Si el nombre de objeto o base de datos no se puede encontrar, por ejemplo, cuando no
existe o se ha escrito incorrectamente, las dos funciones devolverán NULL. La función
sys.dm_db_index_operational_stats interpreta NULL como un valor de carácter comodín que especifica todas las bases
de datos o todos los objetos. Puesto que ésta puede ser una operación accidental, los ejemplos de esta sección
demuestran una forma segura para determinar los Id. de bases de datos y objetos.
DECLARE @db_id int;
DECLARE @object_id int;
SET @db_id = DB_ID(N'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.Person.Address');
IF @db_id IS NULL
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);
END;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Devolver el identificador de objeto de un objeto especificado
En este ejemplo se devuelve el Id. de objeto para la tabla FactFinance en la base de datos
AdventureWorksPDW2012.

SELECT OBJECT_ID('AdventureWorksPDW2012.dbo.FactFinance') AS 'Object ID';

Ver también
Funciones de metadatos (Transact-SQL )
sys.objects (Transact-SQL )
sys.dm_db_index_operational_stats (Transact-SQL )
OBJECT_DEFINITION (Transact-SQL )
OBJECT_NAME (Transact-SQL )
OBJECT_NAME (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre del objeto de la base de datos para los objetos de ámbito de esquema. Para obtener una lista
de los objetos de ámbito de esquema, vea sys.objects (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
OBJECT_NAME ( object_id [, database_id ] )

Argumentos
object_id
Es el identificador del objeto que se va a utilizar. object_id es de tipo int y se considera que se trata de un objeto
de ámbito de esquema en la base de datos especificada o en el contexto de la base de datos actual.
database_id
Identificador de la base de datos donde se va a buscar el objeto. database_id es int.

Tipos devueltos
sysname

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto. Si la base
de datos de destino tiene la opción AUTO_CLOSE establecida en ON, la función abrirá la base de datos.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya
concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECT_NAME,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.

Permisos
Requiere el permiso ANY en el objeto. Para especificar un identificador de base de datos, también se requiere el
permiso CONNECT en la base de datos o se debe habilitar la cuenta de invitado.

Notas
Las funciones del sistema se pueden usar en la lista de selección, en la cláusula WHERE y en cualquier lugar
donde se permita una expresión. Para obtener más información, vea Expressions y WHERE.
El valor que devuelve esta función del sistema usa la intercalación de la base de datos actual.
De manera predeterminada, Motor de base de datos de SQL Server considera que object_id está en el contexto
de la base de datos actual. Una consulta que hace referencia a un parámetro object_id de otra base de datos
devuelve NULL o resultados incorrectos. Por ejemplo, en la siguiente consulta, el contexto de la base de datos
actual es AdventureWorks2012. El Motor de base de datos intenta devolver un nombre de objeto para el
identificador de objeto especificado en esa base de datos en lugar de en la base de datos especificada en la
cláusula FROM de la consulta. Por lo tanto, se devuelve información incorrecta.

USE AdventureWorks2012;
GO
SELECT DISTINCT OBJECT_NAME(object_id)
FROM master.sys.objects;
GO

Puede resolver los nombres de objeto en el contexto de otra base de datos especificando un identificador de base
de datos. En el ejemplo siguiente, se especifica el identificador de la base de datos master en la función
OBJECT_SCHEMA_NAME y devuelve los resultados correctos.

USE AdventureWorks2012;
GO
SELECT DISTINCT OBJECT_SCHEMA_NAME(object_id, 1) AS schema_name
FROM master.sys.objects;
GO

Ejemplos
A. Usar OBJECT_NAME en una cláusula WHERE
El siguiente ejemplo devuelve columnas de la vista de catálogo sys.objects para el objeto especificado por
OBJECT_NAME en la cláusula WHERE de la instrucción SELECT .

USE AdventureWorks2012;
GO
DECLARE @MyID int;
SET @MyID = (SELECT OBJECT_ID('AdventureWorks2012.Production.Product',
'U'));
SELECT name, object_id, type_desc
FROM sys.objects
WHERE name = OBJECT_NAME(@MyID);
GO

B. Devolver el nombre del esquema de objetos y el nombre del objeto


En el ejemplo siguiente se devuelve el nombre del esquema de objetos, el nombre del objeto y el texto SQL para
todos los planes de consulta en caché que no sean instrucciones preparadas o ad hoc.

SELECT DB_NAME(st.dbid) AS database_name,


OBJECT_SCHEMA_NAME(st.objectid, st.dbid) AS schema_name,
OBJECT_NAME(st.objectid, st.dbid) AS object_name,
st.text AS query_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE st.objectid IS NOT NULL;
GO

C. Devolver nombres de objetos de tres partes


En el ejemplo siguiente se devuelve el nombre del objeto, esquema o base de datos junto con todas las demás
columnas de la vista de administración dinámica sys.dm_db_index_operational_stats de todos los objetos de
todas las bases de datos.
SELECT QUOTENAME(DB_NAME(database_id))
+ N'.'
+ QUOTENAME(OBJECT_SCHEMA_NAME(object_id, database_id))
+ N'.'
+ QUOTENAME(OBJECT_NAME(object_id, database_id))
, *
FROM sys.dm_db_index_operational_stats(null, null, null, null);
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Usar OBJECT_NAME en una cláusula WHERE
El siguiente ejemplo devuelve columnas de la vista de catálogo sys.objects para el objeto especificado por
OBJECT_NAME en la cláusula WHERE de la instrucción SELECT . ( El número de objeto [274100017 en el ejemplo
siguiente] será diferente. Para probar este ejemplo, busque un número de objeto válido mediante la ejecución de
SELECT name, object_id FROM sys.objects; en la base de datos).

SELECT name, object_id, type_desc


FROM sys.objects
WHERE name = OBJECT_NAME(274100017);

Ver también
Funciones de metadatos (Transact-SQL )
OBJECT_DEFINITION (Transact-SQL )
OBJECT_ID (Transact-SQL )
OBJECT_SCHEMA_NAME (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre del esquema de la base de datos para los objetos de ámbito de esquema. Para obtener una
lista de los objetos de ámbito de esquema, vea sys.objects (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
OBJECT_SCHEMA_NAME ( object_id [, database_id ] )

Argumentos
object_id
Es el identificador del objeto que se va a utilizar. object_id es de tipo int y se considera que se trata de un objeto de
ámbito de esquema en la base de datos especificada o en el contexto de la base de datos actual.
database_id
Identificador de la base de datos donde se va a buscar el objeto. database_id es int.

Tipos devueltos
sysname

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto. Si la base de
datos de destino tiene la opción AUTO_CLOSE establecida en ON, la función abrirá la base de datos.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECT_SCHEMA_NAME,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.

Permisos
Requiere el permiso ANY en el objeto. Para especificar un identificador de base de datos, también se requiere el
permiso CONNECT en la base de datos o se debe habilitar la cuenta de invitado.

Notas
Las funciones del sistema se pueden usar en la lista de selección, en la cláusula WHERE y en cualquier lugar donde
se permita una expresión. Para obtener más información, vea Expressions y WHERE.
El conjunto de resultados que devuelve esta función del sistema usa la intercalación de la base de datos actual.
Si no se especifica database_id, Motor de base de datos de SQL Server considera que object_id está en el contexto
de la base de datos actual. Una consulta que hace referencia a un parámetro object_id de otra base de datos
devuelve NULL o resultados incorrectos. Por ejemplo, en la siguiente consulta, el contexto de la base de datos
actual es AdventureWorks2012. Motor de base de datos intenta devolver un nombre de esquema de objetos para
el identificador de objeto especificado en esa base de datos en lugar de en la base de datos especificada en la
cláusula FROM de la consulta. Por lo tanto, se devuelve información incorrecta.

SELECT DISTINCT OBJECT_SCHEMA_NAME(object_id)


FROM master.sys.objects;

En el ejemplo siguiente, se especifica el identificador de la base de datos master en la función OBJECT_SCHEMA_NAME


y devuelve los resultados correctos.

SELECT DISTINCT OBJECT_SCHEMA_NAME(object_id, 1) AS schema_name


FROM master.sys.objects;

Ejemplos
A. Devolver el nombre del esquema de objetos y el nombre del objeto
En el ejemplo siguiente se devuelve el nombre del esquema de objetos, el nombre del objeto y el texto SQL para
todos los planes de consulta en caché que no sean instrucciones preparadas o ad hoc.

SELECT DB_NAME(st.dbid) AS database_name,


OBJECT_SCHEMA_NAME(st.objectid, st.dbid) AS schema_name,
OBJECT_NAME(st.objectid, st.dbid) AS object_name,
st.text AS query_statement
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
WHERE st.objectid IS NOT NULL;
GO

B. Devolver nombres de objetos de tres partes


En el ejemplo siguiente se devuelve el nombre del objeto, esquema o base de datos junto con todas las demás
columnas de la vista de administración dinámica sys.dm_db_index_operational_stats de todos los objetos de todas
las bases de datos.

SELECT QUOTENAME(DB_NAME(database_id))
+ N'.'
+ QUOTENAME(OBJECT_SCHEMA_NAME(object_id, database_id))
+ N'.'
+ QUOTENAME(OBJECT_NAME(object_id, database_id))
, *
FROM sys.dm_db_index_operational_stats(null, null, null, null);
GO

Ver también
Funciones de metadatos (Transact-SQL )
OBJECT_DEFINITION (Transact-SQL )
OBJECT_ID (Transact-SQL )
OBJECT_NAME (Transact-SQL )
Elementos protegibles
OBJECTPROPERTY (Transact-SQL)
18/07/2018 • 32 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de los objetos de ámbito de esquema de la base de datos actual. Para obtener una
lista de los objetos de ámbito de esquema, vea sys.objects (Transact-SQL ). Esta función no se puede utilizar para
objetos que no pertenezcan al ámbito de esquema, como notificaciones de eventos y desencadenadores DDL
(lenguaje de definición de datos).
Convenciones de sintaxis de Transact-SQL

Sintaxis
OBJECTPROPERTY ( id , property )

Argumentos
id
Es una expresión que representa el identificador del objeto en la base de datos actual. id es de tipo int y se
considera que se trata de un objeto de ámbito de esquema en el contexto de la base de datos actual.
property
Es una expresión que representa la información que se devuelve para el objeto especificado en id. property puede
tener uno de los valores siguientes.

NOTE
A menos que se especifique lo contrario, se devuelve NULL si property no es un nombre de propiedad válido, id no es un
identificador de objeto válido, id es un tipo de objeto incompatible con el valor property especificado o el autor de la llamada
no tiene permiso para ver los metadatos del objeto.

NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

CnstIsClustKey Restricción Restricción PRIMARY KEY con un índice


clúster.

1 = True

0 = False

CnstIsColumn Restricción Restricción CHECK, DEFAULT o


FOREIGN KEY en una única columna.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

CnstIsDeleteCascade Restricción Restricción FOREIGN KEY con la opción


ON DELETE CASCADE.

1 = True

0 = False

CnstIsDisabled Restricción Restricción deshabilitada.

1 = True

0 = False

CnstIsNonclustKey Restricción Restricción PRIMARY KEY o UNIQUE


con un índice no clúster.

1 = True

0 = False

CnstIsNotRepl Restricción La restricción se define utilizando las


palabras clave NOT FOR REPLICATION.

1 = True

0 = False

CnstIsNotTrusted Restricción La restricción se ha habilitado sin


comprobar las filas existentes, por lo
que es posible que no se mantenga
para todas las filas.

1 = True

0 = False

CnstIsUpdateCascade Restricción Restricción FOREIGN KEY con la opción


ON UPDATE CASCADE.

1 = True

0 = False

ExecIsAfterTrigger Desencadenador Desencadenador AFTER.

1 = True

0 = False

ExecIsAnsiNullsOn Función de Transact-SQL, procedimiento Valor de ANSI_NULLS en el momento


de Transact-SQL, desencadenador de de su creación.
Transact-SQL, vista
1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

ExecIsDeleteTrigger Desencadenador Desencadenador DELETE.

1 = True

0 = False

ExecIsFirstDeleteTrigger Desencadenador Primer desencadenador que se activa


cuando se ejecuta DELETE en la tabla.

1 = True

0 = False

ExecIsFirstInsertTrigger Desencadenador Primer desencadenador que se activa


cuando se ejecuta INSERT en la tabla.

1 = True

0 = False

ExecIsFirstUpdateTrigger Desencadenador Primer desencadenador que se activa


cuando se ejecuta UPDATE en la tabla.

1 = True

0 = False

ExecIsInsertTrigger Desencadenador Desencadenador INSERT.

1 = True

0 = False

ExecIsInsteadOfTrigger Desencadenador Desencadenador INSTEAD OF.

1 = True

0 = False

ExecIsLastDeleteTrigger Desencadenador Último desencadenador que se activa


cuando se ejecuta DELETE en la tabla.

1 = True

0 = False

ExecIsLastInsertTrigger Desencadenador Último desencadenador que se activa


cuando se ejecuta INSERT en la tabla.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

ExecIsLastUpdateTrigger Desencadenador Último desencadenador que se activa


cuando se ejecuta UPDATE en la tabla.

1 = True

0 = False

ExecIsQuotedIdentOn Función de Transact-SQL, procedimiento Valor de QUOTED_IDENTIFIER en el


de Transact-SQL, desencadenador de momento de su creación.
Transact-SQL, vista
1 = True

0 = False

ExecIsStartup Procedimiento Procedimiento de inicio.

1 = True

0 = False

ExecIsTriggerDisabled Desencadenador Desencadenador deshabilitado.

1 = True

0 = False

ExecIsTriggerNotForRepl Desencadenador Desencadenador definido como NOT


FOR REPLICATION.

1 = True

0 = False

ExecIsUpdateTrigger Desencadenador Desencadenador UPDATE.

1 = True

0 = False

ExecIsWithNativeCompilation Procedimiento de Transact-SQL Se aplica a: desde SQL Server 2014


(12.x) hasta SQL Server 2017.

El procedimiento se compila de forma


nativa.

1 = True

0 = False

Tipo de datos base: int

HasAfterTrigger Tabla, vista La tabla o la vista tiene un


desencadenador AFTER.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

HasDeleteTrigger Tabla, vista La tabla o la vista tiene un


desencadenador DELETE.

1 = True

0 = False

HasInsertTrigger Tabla, vista La tabla o la vista tiene un


desencadenador INSERT.

1 = True

0 = False

HasInsteadOfTrigger Tabla, vista La tabla o la vista tiene un


desencadenador INSTEAD OF.

1 = True

0 = False

HasUpdateTrigger Tabla, vista La tabla o la vista tiene un


desencadenador UPDATE.

1 = True

0 = False

IsAnsiNullsOn Función de Transact-SQL, procedimiento Especifica que el valor de la opción ANSI


de Transact-SQL, tabla, desencadenador NULLS de la tabla es ON. Esto significa
de Transact-SQL, vista que todas las comparaciones con un
valor NULL se evalúan como
UNKNOWN. Este valor se aplica a todas
las expresiones de la definición de tabla,
incluidas las columnas calculadas y las
restricciones, mientras la tabla exista.

1 = True

0 = False

IsCheckCnst Cualquier objeto en el ámbito de Restricción CHECK.


esquema
1 = True

0 = False

IsConstraint Cualquier objeto en el ámbito de Es una restricción CHECK, DEFAULT o


esquema FOREIGN KEY de columna única en una
columna o una tabla.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsDefault Cualquier objeto en el ámbito de Se aplica a: desde SQL Server 2008


esquema hasta SQL Server 2017.

Valor predeterminado enlazado.

1 = True

0 = False

IsDefaultCnst Cualquier objeto en el ámbito de Restricción DEFAULT.


esquema
1 = True

0 = False

IsDeterministic Función, vista Propiedad de determinismo de la


función o vista.

1 = Determinista

0 = No determinista

IsEncrypted Función de Transact-SQL, procedimiento Indica que el texto original de la


de Transact-SQL, tabla, desencadenador instrucción del módulo se ha convertido
de Transact-SQL, vista a un formato confuso. La salida de la
protección no es directamente visible en
ninguna de las vistas de catálogo de
Resultado de. Los usuarios sin acceso a
las tablas del sistema o a los archivos de
base de datos no pueden recuperar el
texto ofuscado. En cambio, está
disponible para los usuarios que
puedan obtener acceso a las tablas del
sistema a través del puerto DAC o
directamente a los archivos de base de
datos. Además, los usuarios que
pueden adjuntar un depurador al
proceso del servidor pueden recuperar
el procedimiento original de la memoria
en tiempo de ejecución.

1 = Cifrada

0 = No cifrado

Tipo de datos base: int

IsExecuted Cualquier objeto en el ámbito de El objeto se puede ejecutar (vista,


esquema procedimiento, función o
desencadenador).

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsExtendedProc Cualquier objeto en el ámbito de Procedimiento extendido.


esquema
1 = True

0 = False

IsForeignKey Cualquier objeto en el ámbito de Restricción FOREIGN KEY.


esquema
1 = True

0 = False

IsIndexed Tabla, vista Tabla o vista que tiene un índice.

1 = True

0 = False

IsIndexable Tabla, vista Tabla o vista en la que es posible crear


un índice.

1 = True

0 = False

IsInlineFunction Función Función insertada.

1 = Función insertada

0 = Función no insertada

IsMSShipped Cualquier objeto en el ámbito de Objeto creado durante la instalación de


esquema SQL Server.

1 = True

0 = False

IsPrimaryKey Cualquier objeto en el ámbito de Restricción PRIMARY KEY.


esquema
1 = True

0 = False

NULL = No es una función o el


identificador de objeto no es válido.

IsProcedure Cualquier objeto en el ámbito de Procedimiento.


esquema
1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsQuotedIdentOn Función de Transact-SQL, procedimiento Especifica que el valor del identificador


de Transact-SQL, tabla, desencadenador entre comillas para el objeto es ON.
de Transact-SQL, vista, restricción Esto significa que los identificadores
CHECK, definición DEFAULT están delimitados por comillas dobles
en todas las expresiones que participan
en la definición del objeto.

1 = ON

0 = OFF

IsQueue Cualquier objeto en el ámbito de Cola de Service Broker


esquema
1 = True

0 = False

IsReplProc Cualquier objeto en el ámbito de Procedimiento de replicación.


esquema
1 = True

0 = False

IsRule Cualquier objeto en el ámbito de Regla enlazada.


esquema
1 = True

0 = False

IsScalarFunction Función Función escalar.

1 = Función escalar

0 = Función no escalar

IsSchemaBound Función, vista Función o vista enlazada al esquema


creada mediante SCHEMABINDING.

1 = Enlazada al esquema

0 = No enlazada al esquema.

IsSystemTable Table Tabla del sistema.

1 = True

0 = False

IsTable Table Tabla.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsTableFunction Función Función con valores de tabla.

1 = Función con valores de tabla

0 = Función con valores no de tabla.

IsTrigger Cualquier objeto en el ámbito de Desencadenador.


esquema
1 = True

0 = False

IsUniqueCnst Cualquier objeto en el ámbito de Restricción UNIQUE.


esquema
1 = True

0 = False

IsUserTable Table Tabla definida por el usuario.

1 = True

0 = False

IsView Ver Vista.

1 = True

0 = False

OwnerId Cualquier objeto en el ámbito de Propietario del objeto.


esquema
Nota: El propietario del esquema no es
necesariamente el propietario del
objeto. Por ejemplo, los objetos
secundarios (aquellos en los que
parent_object_id no es NULL) siempre
devolverán el mismo identificador de
propietario que el primario.

Distinto de NULL = Identificador de


usuario de base de datos que
corresponde al propietario del objeto.

TableDeleteTrigger Table La tabla tiene un desencadenador


DELETE.

>1 = Identificador del primer


desencadenador con el tipo
especificado.

TableDeleteTriggerCount Table La tabla tiene el número especificado de


desencadenadores DELETE.

>0 = Número de desencadenadores


DELETE.
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableFullTextMergeStatus Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Indica si una tabla que tiene un índice


de texto completo se está combinando
actualmente.

0 = La tabla no tiene un índice de texto


completo o el índice de texto completo
no se está combinando.

1 = El índice de texto completo se está


combinando.

TableFullTextBackgroundUpdateIndexOn Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

La tabla tiene habilitada la opción de


actualización de índices de texto
completo en segundo plano
(seguimiento de cambios automáticos).

1 = TRUE

0 = False

TableFulltextCatalogId Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Identificador del catálogo de texto


completo en el que residen los datos de
índice de texto completo para la tabla.

Distinto de cero = Identificador del


catálogo de texto completo, asociado al
índice único que identifica las filas en
una tabla indizada de texto completo.

0 = La tabla no tiene un índice de texto


completo.

TableFulltextChangeTrackingOn Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

La tabla tiene habilitado el seguimiento


de cambios de texto completo.

1 = TRUE

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableFulltextDocsProcessed Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de filas procesadas desde el


comienzo de la indización de texto
completo. En una tabla que se indiza
para búsquedas en texto completo,
todas las columnas de una fila se
consideran como parte de un
documento que se va a indizar.

0 = No se ha completado ningún
rastreo activo ni ninguna indización de
texto completo.

> 0 = Uno de los siguientes (A o B): A)


El número de documentos procesados
por operaciones de inserción o
actualización desde el inicio del
rellenado de seguimiento de cambios
completo, incremental o manual. B) El
número de filas procesadas por
operaciones de inserción o actualización
desde que se habilitó el seguimiento de
cambios con el rellenado del índice de
actualización en segundo plano, la
modificación del esquema de índice de
texto completo, la regeneración del
catálogo de texto completo o el reinicio
de la instancia de SQL Server, etc.

NULL = La tabla no tiene un índice de


texto completo.

Esta propiedad no supervisa ni cuenta


las filas eliminadas.

TableFulltextFailCount Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de filas no indizadas por


Búsqueda de texto completo.

0 = El rellenado se ha completado.

> 0 = Uno de los siguientes (A o B): A)


El número de documentos que no se
han indizado desde el inicio del llenado
de seguimiento de cambios de
actualización completa, incremental o
manual. B) En el seguimiento de
cambios con actualización de índices en
segundo plano, el número de filas no
indizadas desde el comienzo del
rellenado o desde su reinicio. Esto
puede deberse a un cambio del
esquema, a la regeneración del
catálogo, al reinicio del servidor, etc.

NULL = La tabla no tiene un índice de


texto completo.
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableFulltextItemCount Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de filas para las que se crearon


índices de texto completo
correctamente.

TableFulltextKeyColumn Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Identificador de la columna asociada al


índice de columna único que participa
en la definición de índice de texto
completo.

0 = La tabla no tiene un índice de texto


completo.

TableFulltextPendingChanges Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de entradas de seguimiento de


cambios pendientes de procesamiento.

0 = El seguimiento de cambios no está


habilitado.

NULL = La tabla no tiene un índice de


texto completo.

TableFulltextPopulateStatus Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

0 = Inactiva

1 = Rellenado completo en curso.

2 = Rellenado incremental en curso.

3 = Propagación de cambios de
seguimiento en curso.

4 = Actualización de índices en segundo


plano en curso, como el seguimiento de
cambios automáticos.

5 = Indización de texto completo


acelerada o pausada.

TableHasActiveFulltextIndex Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

La tabla tiene un índice de texto


completo activo.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableHasCheckCnst Table La tabla tiene una restricción CHECK.

1 = True

0 = False

TableHasClustIndex Table La tabla tiene un índice clúster.

1 = True

0 = False

TableHasDefaultCnst Table La tabla tiene una restricción DEFAULT.

1 = True

0 = False

TableHasDeleteTrigger Table La tabla tiene un desencadenador


DELETE.

1 = True

0 = False

TableHasForeignKey Table La tabla tiene una restricción FOREIGN


KEY.

1 = True

0 = False

TableHasForeignRef Table Una restricción FOREIGN KEY hace


referencia a la tabla.

1 = True

0 = False

TableHasIdentity Table La tabla tiene una columna de


identidad.

1 = True

0 = False

TableHasIndex Table La tabla tiene un índice de cualquier


tipo.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableHasInsertTrigger Table El objeto tiene un desencadenador


INSERT.

1 = True

0 = False

TableHasNonclustIndex Table La tabla tiene un índice no clúster.

1 = True

0 = False

TableHasPrimaryKey Table La tabla tiene una clave principal.

1 = True

0 = False

TableHasRowGuidCol Table La tabla tiene un parámetro


ROWGUIDCOL para una columna
uniqueidentifier.

1 = True

0 = False

TableHasTextImage Table La tabla tiene una columna text, ntext


o image.

1 = True

0 = False

TableHasTimestamp Table La tabla tiene una columna timestamp.

1 = True

0 = False

TableHasUniqueCnst Table La tabla tiene una restricción UNIQUE.

1 = True

0 = False

TableHasUpdateTrigger Table El objeto tiene un desencadenador


UPDATE.

1 = True

0 = False
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableHasVarDecimalStorageFormat Table La tabla está habilitada para el formato


de almacenamiento vardecimal.

1 = True

0 = False

TableInsertTrigger Table La tabla tiene un desencadenador


INSERT.

>1 = Identificador del primer


desencadenador con el tipo
especificado.

TableInsertTriggerCount Table La tabla tiene el número especificado de


desencadenadores INSERT.

>0 = Número de desencadenadores


INSERT.

TableIsFake Table La tabla no es real. Motor de base de


datos de SQL Server la materializa
internamente a petición.

1 = True

0 = False

TableIsLockedOnBulkLoad Table La tabla está bloqueada debido a una


operación con bcp o BULK INSERT.

1 = True

0 = False

TableIsMemoryOptimized Table Se aplica a: desde SQL Server 2014


(12.x) hasta SQL Server 2017.

La tabla tiene optimización para


memoria

1 = True

0 = False

Tipo de datos base: int

Para obtener más información, vea


OLTP en memoria (optimización en
memoria).

TableIsPinned Table La tabla se ancla para que se mantenga


en la memoria caché de datos.

0 = False

Esta característica no se admite en


Resultado de ni en versiones
posteriores.
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableTextInRowLimit Table Número máximo de bytes permitidos


para text in row.

0 si no se ha establecido la opción text


in row.

TableUpdateTrigger Table La tabla tiene un desencadenador


UPDATE.

> 1 = Identificador del primer


desencadenador con el tipo
especificado.

TableUpdateTriggerCount Table La tabla tiene el número especificado de


desencadenadores UPDATE.

> 0 = Número de desencadenadores


UPDATE.

TableHasColumnSet Table La tabla tiene un conjunto de columnas.

0 = False

1 = True

Para obtener más información, vea Usar


conjuntos de columnas.

TableTemporalType Table Se aplica a: desde SQL Server 2016


(13.x) hasta SQL Server 2017.

Especifica el tipo de tabla.

0 = tabla no temporal

1 = tabla de historial para la tabla con


control de versiones del sistema

2 = tabla temporal con control de


versiones del sistema

Tipos devueltos
int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECTPROPERTY, pueden
devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información, consulte
Metadata Visibility Configuration.

Notas
El Motor de base de datos da por hecho que object_id se encuentra en el contexto de la base de datos actual. Una
consulta que hace referencia a un parámetro object_id de otra base de datos devuelve NULL o resultados
incorrectos. Por ejemplo, en la siguiente consulta, el contexto de base de datos es la base de datos maestra. El
Motor de base de datos intentará devolver el valor de propiedad correspondiente al object_id especificado en esa
base de datos, en lugar de la base de datos especificada en la consulta. La consulta devuelve resultados incorrectos
porque la vista vEmployee no se encuentra en la base de datos maestra.

USE master;
GO
SELECT OBJECTPROPERTY(OBJECT_ID(N'AdventureWorks2012.HumanResources.vEmployee'), 'IsView');
GO

OBJECTPROPERTY (view_id, 'IsIndexable') puede consumir importantes recursos del equipo porque la evaluación
de la propiedad IsIndexable requiere el análisis de la definición de la vista, la normalización y la optimización
parcial. Aunque la propiedad IsIndexable identifica tablas o vistas que se pueden indizar, es posible que se
produzca un error en la creación real del índice si no se cumplen ciertos requisitos de clave de índice. Para obtener
más información, vea CREATE INDEX (Transact-SQL ).
OBJECTPROPERTY (table_id, 'TableHasActiveFulltextIndex') devolverá el valor 1 (verdadero) si se agrega al
menos una columna de una tabla para la indización. El índice de texto completo se activa para su llenado en el
momento en que se agrega la primera columna para la indización.
Al crear una tabla, la opción QUOTED IDENTIFIER siempre se almacena como ON en los metadatos de la tabla,
incluso si la opción está establecida en OFF al crear la tabla. Por tanto, OBJECTPROPERTY (table_id,
'IsQuotedIdentOn') siempre devolverá el valor 1 (verdadero).

Ejemplos
A. Comprobar si un objeto es una tabla
En el ejemplo siguiente se comprueba si UnitMeasure es una tabla de la base de datos AdventureWorks2012.

USE AdventureWorks2012;
GO
IF OBJECTPROPERTY (OBJECT_ID(N'Production.UnitMeasure'),'ISTABLE') = 1
PRINT 'UnitMeasure is a table.'
ELSE IF OBJECTPROPERTY (OBJECT_ID(N'Production.UnitMeasure'),'ISTABLE') = 0
PRINT 'UnitMeasure is not a table.'
ELSE IF OBJECTPROPERTY (OBJECT_ID(N'Production.UnitMeasure'),'ISTABLE') IS NULL
PRINT 'ERROR: UnitMeasure is not a valid object.';
GO

B. Comprobar si una función escalar definida por el usuario es determinista


En el siguiente ejemplo se comprueba si es determinista la función escalar definida por el usuario,
ufnGetProductDealerPrice , que devuelve un valor money.

USE AdventureWorks2012;
GO
SELECT OBJECTPROPERTY(OBJECT_ID('dbo.ufnGetProductDealerPrice'), 'IsDeterministic');
GO

El conjunto de resultados muestra que ufnGetProductDealerPrice no es una función determinista.

-----
0
C. Buscar las tablas que pertenecen a un esquema específico
En el siguiente ejemplo se devuelven todas las tablas del esquema dbo.

-- Uses AdventureWorks

SELECT name, object_id, type_desc


FROM sys.objects
WHERE OBJECTPROPERTY(object_id, N'SchemaId') = SCHEMA_ID(N'dbo')
ORDER BY type_desc, name;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Comprobar si un objeto es una tabla
En el ejemplo siguiente se comprueba si dbo.DimReseller es una tabla de la base de datos
AdventureWorksPDW2012.

-- Uses AdventureWorks

IF OBJECTPROPERTY (OBJECT_ID(N'dbo.DimReseller'),'ISTABLE') = 1
SELECT 'DimReseller is a table.'
ELSE
SELECT 'DimReseller is not a table.';
GO

Ver también
COLUMNPROPERTY (Transact-SQL )
Funciones de metadatos (Transact-SQL )
OBJECTPROPERTYEX (Transact-SQL )
ALTER AUTHORIZATION (Transact-SQL )
TYPEPROPERTY (Transact-SQL )
sys.objects (Transact-SQL )
OBJECTPROPERTYEX (Transact-SQL)
17/07/2018 • 39 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de los objetos de ámbito de esquema de la base de datos actual. Para obtener una
lista de estos objetos, vea sys.objects (Transact-SQL ). OBJECTPROPERTYEX no se puede utilizar con los objetos
que no pertenecen al ámbito de esquema, como los desencadenadores de lenguaje de definición de datos (DDL )
y las notificaciones de eventos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
OBJECTPROPERTYEX ( id , property )

Argumentos
id
Es una expresión que representa el identificador del objeto en la base de datos actual. id es de tipo int y se
considera que se trata de un objeto de ámbito de esquema en el contexto de la base de datos actual.
property
Es una expresión que contiene la información sobre el objeto especificado por el identificador que se va a
devolver. El tipo de valor devuelto es sql_variant. En la siguiente tabla se muestra el tipo de datos base de cada
valor de propiedad.

NOTE
A menos que se especifique lo contrario, se devuelve NULL si property no es un nombre de propiedad válido, id no es un
identificador de objeto válido, id es un tipo de objeto incompatible con el valor property especificado o el autor de la
llamada no tiene permiso para ver los metadatos del objeto.

NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

BaseType Cualquier objeto en el ámbito de Identifica el tipo base del objeto.


esquema Cuando el objeto especificado es un
sinónimo, se devuelve el tipo base del
objeto subyacente.

NonNULL = Tipo de objeto

Tipo de datos base: char(2)


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

CnstIsClustKey Restricción Restricción PRIMARY KEY con un índice


clúster.

1 = True

0 = False

Tipo de datos base: int

CnstIsColumn Restricción Restricción CHECK, DEFAULT o


FOREIGN KEY en una única columna.

1 = True

0 = False

Tipo de datos base: int

CnstIsDeleteCascade Restricción Restricción FOREIGN KEY con la opción


ON DELETE CASCADE.

1 = True

0 = False

Tipo de datos base: int

CnstIsDisabled Restricción Restricción deshabilitada.

1 = True

0 = False

Tipo de datos base: int

CnstIsNonclustKey Restricción Restricción PRIMARY KEY con un índice


no clúster.

1 = True

0 = False

Tipo de datos base: int

CnstIsNotRepl Restricción La restricción se define utilizando las


palabras clave NOT FOR REPLICATION.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

CnstIsNotTrusted Restricción La restricción se ha habilitado sin


comprobar las filas existentes. Por lo
tanto, es posible que no pueda
mantenerse para todas las filas.

1 = True

0 = False

Tipo de datos base: int

CnstIsUpdateCascade Restricción Restricción FOREIGN KEY con la opción


ON UPDATE CASCADE.

1 = True

0 = False

Tipo de datos base: int

ExecIsAfterTrigger Desencadenador Desencadenador AFTER.

1 = True

0 = False

Tipo de datos base: int

ExecIsAnsiNullsOn Función de Transact-SQL, El valor de ANSI_NULLS en el momento


procedimiento de Transact-SQL, de su creación.
desencadenador de Transact-SQL, vista
1 = True

0 = False

Tipo de datos base: int

ExecIsDeleteTrigger Desencadenador Desencadenador DELETE.

1 = True

0 = False

Tipo de datos base: int

ExecIsFirstDeleteTrigger Desencadenador El primer desencadenador que se activa


cuando se ejecuta DELETE en la tabla.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

ExecIsFirstInsertTrigger Desencadenador El primer desencadenador que se activa


cuando se ejecuta INSERT en la tabla.

1 = True

0 = False

Tipo de datos base: int

ExecIsFirstUpdateTrigger Desencadenador El primer desencadenador que se activa


cuando se ejecuta UPDATE en la tabla.

1 = True

0 = False

Tipo de datos base: int

ExecIsInsertTrigger Desencadenador Desencadenador INSERT.

1 = True

0 = False

Tipo de datos base: int

ExecIsInsteadOfTrigger Desencadenador Desencadenador INSTEAD OF.

1 = True

0 = False

Tipo de datos base: int

ExecIsLastDeleteTrigger Desencadenador Último desencadenador que se activa


cuando se ejecuta DELETE en la tabla.

1 = True

0 = False

Tipo de datos base: int

ExecIsLastInsertTrigger Desencadenador Último desencadenador que se activa


cuando se ejecuta INSERT en la tabla.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

ExecIsLastUpdateTrigger Desencadenador Último desencadenador que se activa


cuando se ejecuta UPDATE en la tabla.

1 = True

0 = False

Tipo de datos base: int

ExecIsQuotedIdentOn Función de Transact-SQL, Valor de QUOTED_IDENTIFIER en el


procedimiento de Transact-SQL, momento de su creación.
desencadenador de Transact-SQL, vista
1 = True

0 = False

Tipo de datos base: int

ExecIsStartup Procedimiento Procedimiento de inicio.

1 = True

0 = False

Tipo de datos base: int

ExecIsTriggerDisabled Desencadenador Desencadenador deshabilitado.

1 = True

0 = False

Tipo de datos base: int

ExecIsTriggerNotForRepl Desencadenador Desencadenador definido como NOT


FOR REPLICATION.

1 = True

0 = False

Tipo de datos base: int

ExecIsUpdateTrigger Desencadenador Desencadenador UPDATE.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

ExecIsWithNativeCompilation Procedimiento de Transact-SQL Se aplica a: desde SQL Server 2014


(12.x) hasta SQL Server 2017.

El procedimiento se compila de forma


nativa.

1 = True

0 = False

Tipo de datos base: int

HasAfterTrigger Tabla, vista La tabla o la vista tiene un


desencadenador AFTER.

1 = True

0 = False

Tipo de datos base: int

HasDeleteTrigger Tabla, vista La tabla o la vista tiene un


desencadenador DELETE.

1 = True

0 = False

Tipo de datos base: int

HasInsertTrigger Tabla, vista La tabla o la vista tiene un


desencadenador INSERT.

1 = True

0 = False

Tipo de datos base: int

HasInsteadOfTrigger Tabla, vista La tabla o la vista tiene un


desencadenador INSTEAD OF.

1 = True

0 = False

Tipo de datos base: int

HasUpdateTrigger Tabla, vista La tabla o la vista tiene un


desencadenador UPDATE.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsAnsiNullsOn Función de Transact-SQL, Especifica que el valor de la opción


procedimiento de Transact-SQL, tabla, ANSI NULLS para la tabla es ON, lo que
desencadenador de Transact-SQL, vista significa que todas las comparaciones
con un valor NULL se evalúan como
UNKNOWN. Este valor se aplica a todas
las expresiones de la definición de tabla,
incluidas las columnas calculadas y las
restricciones, mientras la tabla exista.

1 = True

0 = False

Tipo de datos base: int

IsCheckCnst Cualquier objeto en el ámbito de Restricción CHECK.


esquema
1 = True

0 = False

Tipo de datos base: int

IsConstraint Cualquier objeto en el ámbito de Restricción.


esquema
1 = True

0 = False

Tipo de datos base: int

IsDefault Cualquier objeto en el ámbito de Se aplica a: desde SQL Server 2008


esquema hasta SQL Server 2017.

Valor predeterminado enlazado.

1 = True

0 = False

Tipo de datos base: int

IsDefaultCnst Cualquier objeto en el ámbito de Restricción DEFAULT.


esquema
1 = True

0 = False

Tipo de datos base: int

IsDeterministic Funciones escalares y con valores de Propiedad de determinismo de la


tabla, vista función o vista.

1 = Determinista

0 = No determinista

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsEncrypted Función de Transact-SQL, Indica que el texto original de la


procedimiento de Transact-SQL, tabla, instrucción del módulo se ha
desencadenador de Transact-SQL, vista convertido a un formato confuso. La
salida de la protección no es
directamente visible en ninguna de las
vistas de catálogo de Resultado de. Los
usuarios sin acceso a las tablas del
sistema o a los archivos de base de
datos no pueden recuperar el texto
ofuscado. En cambio, está disponible
para los usuarios que puedan obtener
acceso a las tablas del sistema a través
del puerto DAC o directamente a los
archivos de base de datos. Además, los
usuarios que pueden adjuntar un
depurador al proceso del servidor
pueden recuperar el procedimiento
original de la memoria en tiempo de
ejecución.

1 = Cifrada

0 = No cifrado

Tipo de datos base: int

IsExecuted Cualquier objeto en el ámbito de Especifica que el objeto se puede


esquema ejecutar (vista, procedimiento, función o
desencadenador).

1 = True

0 = False

Tipo de datos base: int

IsExtendedProc Cualquier objeto en el ámbito de Procedimiento extendido.


esquema
1 = True

0 = False

Tipo de datos base: int

IsForeignKey Cualquier objeto en el ámbito de Restricción FOREIGN KEY.


esquema
1 = True

0 = False

Tipo de datos base: int

IsIndexed Tabla, vista Una tabla o vista con un índice.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsIndexable Tabla, vista Una tabla o una vista en la que es


posible crear un índice.

1 = True

0 = False

Tipo de datos base: int

IsInlineFunction Función Función insertada.

1 = Función insertada

0 = Función no insertada

Tipo de datos base: int

IsMSShipped Cualquier objeto en el ámbito de Un objeto creado durante la instalación


esquema de SQL Server.

1 = True

0 = False

Tipo de datos base: int

IsPrecise Columna calculada, función, tipo Indica si el objeto contiene un cálculo


definido por el usuario, vista impreciso, como una operación de
punto flotante.

1 = Preciso

0 = Impreciso

Tipo de datos base: int

IsPrimaryKey Cualquier objeto en el ámbito de Restricción PRIMARY KEY.


esquema
1 = True

0 = False

Tipo de datos base: int

IsProcedure Cualquier objeto en el ámbito de Procedimiento.


esquema
1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsQuotedIdentOn Restricción CHECK, definición DEFAULT, Especifica que el valor del identificador
función de Transact-SQL, procedimiento entrecomillado para el objeto es ON, lo
de Transact-SQL, tabla, desencadenador que significa que las comillas dobles
de Transact-SQL, vista delimitan los identificadores en todas
las expresiones de la definición de
objeto.

1 = True

0 = False

Tipo de datos base: int

IsQueue Cualquier objeto en el ámbito de Cola de Service Broker


esquema
1 = True

0 = False

Tipo de datos base: int

IsReplProc Cualquier objeto en el ámbito de Procedimiento de replicación.


esquema
1 = True

0 = False

Tipo de datos base: int

IsRule Cualquier objeto en el ámbito de Regla enlazada.


esquema
1 = True

0 = False

Tipo de datos base: int

IsScalarFunction Función Función escalar.

1 = Función escalar

0 = Función no escalar

Tipo de datos base: int

IsSchemaBound Función, procedimiento y vista Función o vista enlazada al esquema


creada mediante SCHEMABINDING.

1 = Enlazada al esquema

0 = No enlazada al esquema

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsSystemTable Table Tabla del sistema.

1 = True

0 = False

Tipo de datos base: int

IsSystemVerified Columna calculada, función, tipo SQL Server puede comprobar las
definido por el usuario, vista propiedades de precisión y
determinismo del objeto.

1 = True

0 = False

Tipo de datos base: int

IsTable Table Tabla.

1 = True

0 = False

Tipo de datos base: int

IsTableFunction Función Función con valores de tabla.

1 = Función con valores de tabla

0 = Función con valores no de tabla.

Tipo de datos base: int

IsTrigger Cualquier objeto en el ámbito de Desencadenador.


esquema
1 = True

0 = False

Tipo de datos base: int

IsUniqueCnst Cualquier objeto en el ámbito de Restricción UNIQUE.


esquema
1 = True

0 = False

Tipo de datos base: int

IsUserTable Table Tabla definida por el usuario.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

IsView Ver Vista.

1 = True

0 = False

Tipo de datos base: int

OwnerId Cualquier objeto en el ámbito de Propietario del objeto.


esquema
Nota: El propietario del esquema no es
necesariamente el propietario del
objeto. Por ejemplo, los objetos
secundarios (aquellos en los que
parent_object_id no es NULL) siempre
devolverán el mismo identificador de
propietario que el primario.

NonNULL = Id. de usuario de la base


de datos del propietario del objeto.

NULL = Tipo de objeto no compatible o


identificador de objeto no válido.

Tipo de datos base: int

SchemaId Cualquier objeto en el ámbito de Identificador de esquema asociado al


esquema objeto.

NonNULL = Identificador de esquema


del objeto.

Tipo de datos base: int

SystemDataAccess Función, vista El objeto obtiene acceso a los datos del


sistema, los catálogos del sistema o las
tablas virtuales del sistema en la
instancia local de SQL Server.

0 = Ninguno

1 = Lectura

Tipo de datos base: int

TableDeleteTrigger Table La tabla tiene un desencadenador


DELETE.

>1 = Identificador del primer


desencadenador con el tipo
especificado.

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableDeleteTriggerCount Table La tabla tiene el número especificado


de desencadenadores DELETE.

NonNULL = Número de
desencadenadores DELETE

Tipo de datos base: int

TableFullTextMergeStatus Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Indica si una tabla que tiene un índice


de texto completo se está combinando
actualmente.

0 = La tabla no tiene un índice de texto


completo o el índice de texto completo
no se está combinando.

1 = El índice de texto completo se está


combinando.

TableFullTextBackgroundUpdateIndexO Table Se aplica a: desde SQL Server 2008


n hasta SQL Server 2017.

La tabla tiene habilitado el índice de


actualización de texto completo en
segundo plano (seguimiento de
cambios automáticos).

1 = TRUE

0 = False

Tipo de datos base: int

TableFulltextCatalogId Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Identificador del catálogo de texto


completo en el que residen los datos de
índice de texto completo para la tabla.

Distinto de cero = Identificador del


catálogo de texto completo, asociado al
índice único que identifica las filas en
una tabla indizada de texto completo.

0 = La tabla no tiene un índice de texto


completo.

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableFullTextChangeTrackingOn Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

La tabla tiene habilitado el seguimiento


de cambios de texto completo.

1 = TRUE

0 = False

Tipo de datos base: int

TableFulltextDocsProcessed Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de filas procesadas desde el


comienzo de la indización de texto
completo. En una tabla que se indiza
para búsquedas en texto completo,
todas las columnas de una fila se
consideran como parte de un
documento que se va a indizar.

0 = No se ha completado ningún
rastreo activo ni ninguna indización de
texto completo.

> 0 = Uno de los casos siguientes (A o


B): A) El número de documentos
procesados por operaciones de
inserción o actualización desde el inicio
del rellenado de seguimiento de
cambios completo, incremental o
manual; B) El número de filas
procesadas por operaciones de
inserción o actualización desde que se
habilitó el seguimiento de cambios con
el rellenado del índice de actualización
en segundo plano, la modificación del
esquema de índice de texto completo,
la regeneración del catálogo de texto
completo o el reinicio de la instancia de
SQL Server, etc.

NULL = La tabla no tiene un índice de


texto completo.

Tipo de datos base: int

Nota: Esta propiedad no supervisa ni


cuenta las filas eliminadas.
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableFulltextFailCount Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de filas que no ha indizado la


búsqueda de texto completo.

0 = El rellenado se ha completado.

> 0 = Uno de los casos siguientes (A o


B): A) Número de documentos no
indizados desde el comienzo del
rellenado de seguimiento de cambios
de actualización completa, incremental
y manual; B) Para el seguimiento de
cambios con actualización de índices en
segundo plano, el número de filas no
indizadas desde el comienzo del
rellenado o desde su reinicio. Esto
podría ser debido a un cambio de
esquema, una regeneración del
catálogo, un reinicio del servidor, etc.

NULL = La tabla no tiene un índice de


texto completo.

Tipo de datos base: int

TableFulltextItemCount Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

NonNULL = El número de filas que se


han indizado por texto completo
correctamente.

NULL = La tabla no tiene un índice de


texto completo.

Tipo de datos base: int

TableFulltextKeyColumn Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Identificador de la columna asociada al


índice único de una sola columna que
forma parte de la definición de un
índice de texto completo y un índice
semántico.

0 = La tabla no tiene un índice de texto


completo.

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableFulltextPendingChanges Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

Número de entradas de seguimiento de


cambios pendientes de procesamiento.

0 = El seguimiento de cambios no está


habilitado.

NULL = La tabla no tiene un índice de


texto completo.

Tipo de datos base: int

TableFulltextPopulateStatus Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

0 = Inactiva

1 = Rellenado completo en curso.

2 = Rellenado incremental en curso.

3 = Propagación de cambios de
seguimiento en curso.

4 = Actualización de índices en
segundo plano en curso, como el
seguimiento de cambios automáticos.

5 = Indización de texto completo


acelerada o pausada.

6 = Se produjo un error. Examine el


registro de rastreo para obtener más
información. Para obtener más
información, consulte la sección
Solución de errores en un rellenado
de texto completo (rastreo) de
Rellenar índices de texto completo.

Tipo de datos base: int

TableFullTextSemanticExtraction Table Se aplica a: desde SQL Server 2012


(11.x) hasta SQL Server 2017.

La tabla está habilitada para la


indización semántica.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableHasActiveFulltextIndex Table Se aplica a: desde SQL Server 2008


hasta SQL Server 2017.

La tabla tiene un índice de texto


completo activo.

1 = True

0 = False

Tipo de datos base: int

TableHasCheckCnst Table La tabla tiene una restricción CHECK.

1 = True

0 = False

Tipo de datos base: int

TableHasClustIndex Table La tabla tiene un índice clúster.

1 = True

0 = False

Tipo de datos base: int

TableHasDefaultCnst Table La tabla tiene una restricción DEFAULT.

1 = True

0 = False

Tipo de datos base: int

TableHasDeleteTrigger Table La tabla tiene un desencadenador


DELETE.

1 = True

0 = False

Tipo de datos base: int

TableHasForeignKey Table La tabla tiene una restricción FOREIGN


KEY.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableHasForeignRef Table Una restricción FOREIGN KEY hace


referencia a la tabla.

1 = True

0 = False

Tipo de datos base: int

TableHasIdentity Table La tabla tiene una columna de


identidad.

1 = True

0 = False

Tipo de datos base: int

TableHasIndex Table La tabla tiene un índice de cualquier


tipo.

1 = True

0 = False

Tipo de datos base: int

TableHasInsertTrigger Table El objeto tiene un desencadenador


INSERT.

1 = True

0 = False

Tipo de datos base: int

TableHasNonclustIndex Table La tabla tiene un índice no agrupado.

1 = True

0 = False

Tipo de datos base: int

TableHasPrimaryKey Table La tabla tiene una clave principal.

1 = True

0 = False

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableHasRowGuidCol Table La tabla tiene un parámetro


ROWGUIDCOL para una columna
uniqueidentifier.

1 = True

0 = False

Tipo de datos base: int

TableHasTextImage Table La tabla tiene una columna text, ntext


o image.

1 = True

0 = False

Tipo de datos base: int

TableHasTimestamp Table La tabla tiene una columna timestamp.

1 = True

0 = False

Tipo de datos base: int

TableHasUniqueCnst Table La tabla tiene una restricción UNIQUE.

1 = True

0 = False

Tipo de datos base: int

TableHasUpdateTrigger Table El objeto tiene un desencadenador


UPDATE.

1 = True

0 = False

Tipo de datos base: int

TableHasVarDecimalStorageFormat Table La tabla está habilitada para el formato


de almacenamiento vardecimal.

1 = True

0 = False

TableInsertTrigger Table La tabla tiene un desencadenador


INSERT.

>1 = Identificador del primer


desencadenador con el tipo
especificado.

Tipo de datos base: int


NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableInsertTriggerCount Table La tabla tiene el número especificado


de desencadenadores INSERT.

>0 = Número de desencadenadores


INSERT.

Tipo de datos base: int

TableIsFake Table La tabla no es real. Motor de base de


datos la materializa internamente a
petición.

1 = True

0 = False

Tipo de datos base: int

TableIsLockedOnBulkLoad Table La tabla está bloqueada debido a un


trabajo bcp o BULK INSERT.

1 = True

0 = False

Tipo de datos base: int

TableIsMemoryOptimized Table Se aplica a: desde SQL Server 2014


(12.x) hasta SQL Server 2017.

La tabla tiene optimización para


memoria

1 = True

0 = False

Tipo de datos base: int

Para obtener más información, vea


OLTP en memoria (optimización en
memoria).

TableIsPinned Table La tabla se ancla para que se mantenga


en la memoria caché de datos.

0 = False

Esta característica no es compatible con


Resultado de y versiones posteriores.
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableTextInRowLimit Table La tabla tiene establecida la opción text


in row.

> 0 = Número máximo de bytes


permitido para text in row.

0 = La opción text in row no está


establecida.

Tipo de datos base: int

TableUpdateTrigger Table La tabla tiene un desencadenador


UPDATE.

> 1 = Identificador del primer


desencadenador con el tipo
especificado.

Tipo de datos base: int

TableUpdateTriggerCount Table La tabla tiene el número especificado


de desencadenadores UPDATE.

> 0 = Número de desencadenadores


UPDATE.

Tipo de datos base: int

UserDataAccess Función, vista Indica que el objeto obtiene acceso a


datos y tablas de usuario en la instancia
local de SQL Server.

1 = Lectura

0 = Ninguno

Tipo de datos base: int

TableHasColumnSet Table La tabla tiene un conjunto de


columnas.

0 = False

1 = True

Para obtener más información, vea Usar


conjuntos de columnas.

Cardinalidad Tabla (del sistema o definida por el Se aplica a: desde SQL Server 2012
usuario), vista o índice (11.x) hasta SQL Server 2017.

El número de filas del objeto


especificado.
NOMBRE DE PROPIEDAD TIPO DE OBJETO DESCRIPCIÓN Y VALORES DEVUELTOS

TableTemporalType Table Se aplica a: desde SQL Server 2016


(13.x) hasta SQL Server 2017.

Especifica el tipo de tabla.

0 = tabla no temporal

1 = tabla de historial para la tabla con


control de versiones del sistema

2 = tabla temporal con control de


versiones del sistema

Tipos devueltos
sql_variant

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
Un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le haya concedido
permiso. Esto significa que las funciones integradas de emisión de metadatos, como OBJECTPROPERTYEX,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.

Notas
El Motor de base de datos da por hecho que object_id se encuentra en el contexto de la base de datos actual. Una
consulta que hace referencia a un parámetro object_id de otra base de datos devuelve NULL o resultados
incorrectos. Por ejemplo, en la siguiente consulta, el contexto de base de datos es la base de datos maestra. Motor
de base de datos intentará devolver el valor de propiedad correspondiente al object_id especificado en esa base
de datos, en lugar de la base de datos especificada en la consulta. La consulta devuelve resultados incorrectos
porque la vista vEmployee no se encuentra en la base de datos maestra.

USE master;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID(N'AdventureWorks2012.HumanResources.vEmployee'), 'IsView');
GO

OBJECTPROPERTYEX(view_id, 'IsIndexable') puede consumir importantes recursos del equipo porque la


evaluación de la propiedad IsIndexable requiere el análisis de la definición de la vista, la normalización y la
optimización parcial. Aunque la propiedad IsIndexable identifica tablas o vistas que se pueden indizar, es posible
que se produzca un error en la creación real del índice si no se cumplen ciertos requisitos de clave de índice. Para
obtener más información, vea CREATE INDEX (Transact-SQL ).
OBJECTPROPERTYEX (table_id, 'TableHasActiveFulltextIndex') devolverá el valor 1 (verdadero) si se agrega al
menos una columna de una tabla para la indización. El índice de texto completo se activa para su llenado en el
momento en que se agrega la primera columna para la indización.
Se aplican restricciones sobre la visibilidad de los metadatos al conjunto de resultados. Para obtener más
información, consulte Metadata Visibility Configuration.
Ejemplos
A. Buscar el tipo base de un objeto
En el siguiente ejemplo se crea un sinónimo MyEmployeeTable para la tabla Employee de la base de datos
AdventureWorks2012 y, a continuación, se devuelve el tipo base del sinónimo.

USE AdventureWorks2012;
GO
CREATE SYNONYM MyEmployeeTable FOR HumanResources.Employee;
GO
SELECT OBJECTPROPERTYEX ( object_id(N'MyEmployeeTable'), N'BaseType')AS [Base Type];
GO

El conjunto de resultados muestra que el tipo base del objeto subyacente, la tabla Employee , es una tabla de
usuario.

Base Type
--------
U

B. Devolver un valor de propiedad


En el siguiente ejemplo se devuelve el número de desencadenadores UPDATE de la tabla especificada.

USE AdventureWorks2012;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID(N'HumanResources.Employee'), N'TABLEUPDATETRIGGERCOUNT');
GO

C. Buscar tablas que tengan una restricción FOREIGN KEY


En el ejemplo siguiente se utiliza la propiedad TableHasForeignKey para devolver todas las tablas que tengan una
restricción FOREIGN KEY.

USE AdventureWorks2012;
GO
SELECT name, object_id, schema_id, type_desc
FROM sys.objects
WHERE OBJECTPROPERTYEX(object_id, N'TableHasForeignKey') = 1
ORDER BY name;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Buscar el tipo base de un objeto
En el ejemplo siguiente se devuelve el tipo de objeto dbo.DimReseller de base.

-- Uses AdventureWorks

SELECT OBJECTPROPERTYEX ( object_id(N'dbo.DimReseller'), N'BaseType')AS BaseType;

El conjunto de resultados muestra que el tipo base del objeto subyacente, la tabla dbo.DimReseller , es una tabla
de usuario.
BaseType
--------
U

Ver también
CREATE SYNONYM (Transact-SQL )
Funciones de metadatos (Transact-SQL )
OBJECT_DEFINITION (Transact-SQL )
OBJECT_ID (Transact-SQL )
OBJECT_NAME (Transact-SQL )
sys.objects (Transact-SQL )
ALTER AUTHORIZATION (Transact-SQL )
TYPEPROPERTY (Transact-SQL )
ORIGINAL_DB_NAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de la base de datos especificada por el usuario en la cadena de conexión de la base de datos.
Es la base de datos especificada con la opción sqlcmd-d (USE database) o la expresión de origen de datos ODBC
(catálogo inicial = databasename).
Esta base de datos no es la misma que la base de datos de usuario predeterminada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ORIGINAL_DB_NAME ()

Notas
Si no se especifica la base de datos inicial, la función devuelve una cadena vacía.

Ver también
sqlcmd (utilidad)
osql Utility (Utilidad osql)
SQL Server Native Client (ODBC )
PARSENAME (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la parte especificada de un nombre de objeto. Las partes de un objeto que se pueden recuperar son el
nombre del objeto, nombre del propietario, nombre de la base de datos y nombre del servidor.

NOTE
La función PARSENAME no indica si existe un objeto con el nombre especificado. PARSENAME solo devuelve la parte
especificada del nombre de objeto especificado.

Convenciones de sintaxis de Transact-SQL

Sintaxis
PARSENAME ( 'object_name' , object_piece )

Argumentos
'object_name'
Es el nombre del objeto del que se desea recuperar la parte de objeto especificada. object_name es sysname. Este
parámetro es un nombre de objeto completo opcionalmente. Si todas las partes del nombre de objeto están
completas, este nombre puede tener cuatro partes: el nombre del servidor, de la base de datos, del propietario y
del propio objeto.
object_piece
Es la parte del objeto que se va a devolver. object_piece es de tipo int y puede tener los valores siguientes:
1 = Nombre del objeto
2 = Nombre del esquema
3 = Nombre de la base de datos
4 = Nombre del servidor

Tipos devueltos
nchar

Notas
PARSENAME devuelve NULL cuando se cumple una de las siguientes condiciones:
Tanto object_name como object_piece son NULL.
Se produce un error de sintaxis.
La parte del objeto solicitada tiene una longitud 0 y no es un identificador Microsoft SQL Server válido. Un
nombre de objeto de longitud cero hace que el nombre completo no sea válido.

Ejemplos
En el siguiente ejemplo se utiliza PARSENAME para devolver información acerca de la tabla Person de la base de
datos AdventureWorks2012 .

-- Uses AdventureWorks

SELECT PARSENAME('AdventureWorksPDW2012.dbo.DimCustomer', 1) AS 'Object Name';


SELECT PARSENAME('AdventureWorksPDW2012.dbo.DimCustomer', 2) AS 'Schema Name';
SELECT PARSENAME('AdventureWorksPDW2012.dbo.DimCustomer', 3) AS 'Database Name';
SELECT PARSENAME('AdventureWorksPDW2012.dbo.DimCustomer', 4) AS 'Server Name';
GO

El conjunto de resultados es el siguiente.

Object Name
------------------------------
DimCustomer

(1 row(s) affected)

Schema Name
------------------------------
dbo

(1 row(s) affected)

Database Name
------------------------------
AdventureWorksPDW2012

(1 row(s) affected)

Server Name
------------------------------
(null)

(1 row(s) affected)

Ver también
QUOTENAME (Transact-SQL )
ALTER TABLE (Transact-SQL )
CREATE TABLE (Transact-SQL )
Funciones del sistema (Transact-SQL )
SCHEMA_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el identificador de esquema asociado a un nombre de esquema.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SCHEMA_ID ( [ schema_name ] )

Argumentos
TÉRMINO DEFINICIÓN

schema_name Es el nombre del esquema. schema_name es sysname. Si


schema_name no se especifica, SCHEMA_ID devolverá el
identificador del esquema predeterminado del autor de la
llamada.

Tipos devueltos
int
Se devolverá NULL si schema_name no es un esquema válido.

Notas
SCHEMA_ID devolverá los Id. de los esquemas del sistema y de los esquemas definidos por el usuario. Se puede
llamar a SCHEMA_ID en una lista de selección, en una cláusula WHERE y en cualquier lugar en el que se permita
una expresión.

Ejemplos
A. Devolver el identificador del esquema predeterminado del llamador

SELECT SCHEMA_ID();

B. Devolver el identificador de un esquema con nombre

SELECT SCHEMA_ID('dbo');

Ver también
Funciones de metadatos (Transact-SQL )
SCHEMA_NAME (Transact-SQL )
sys.schemas (Transact-SQL )
SCHEMA_NAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de esquema asociado a un Id. de esquema.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SCHEMA_NAME ( [ schema_id ] )

Argumentos
TÉRMINO DEFINICIÓN

schema_id Id. del esquema. schema_id es un int. Si schema_id no se


define, SCHEMA_NAME devolverá el nombre del esquema
predeterminado del autor de llamada.

Tipos devueltos
sysname
Devuelve NULL cuando schema_id no es un Id. válido.

Notas
SCHEMA_NAME devuelve nombres de esquemas del sistema y esquemas definidos por el usuario.
SCHEMA_NAME se puede llamar en una lista de selección, en una cláusula WHERE y en cualquier lugar en el que
se permita una expresión.

Ejemplos
A. Devolver el nombre del esquema predeterminado del llamador

SELECT SCHEMA_NAME();

B. Devolver el nombre de un esquema utilizando un Id.

SELECT SCHEMA_NAME(1);

Ver también
Expresiones (Transact-SQL )
SCHEMA_ID (Transact-SQL )
sys.schemas (Transact-SQL )
sys.database_principals (Transact-SQL )
Funciones de metadatos (Transact-SQL )
WHERE (Transact-SQL )
SCOPE_IDENTITY (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el último valor de identidad insertado en una columna de identidad en el mismo ámbito. Un ámbito es
un módulo: un procedimiento almacenado, desencadenador, función o lote. Por tanto, si dos instrucciones se
encuentran en el mismo procedimiento almacenado, función o lote, están en el mismo ámbito.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SCOPE_IDENTITY()

Tipos devueltos
numeric(38,0)

Notas
SCOPE_IDENTITY, IDENT_CURRENT y @@IDENTITY son funciones parecidas ya que devuelven valores
insertados en columnas de identidad.
IDENT_CURRENT no está limitado por el ámbito y la sesión; se limita a una tabla especificada.
IDENT_CURRENT devuelve el valor generado para una tabla específica en cualquier sesión y cualquier ámbito.
Para obtener más información, vea IDENT_CURRENT (Transact-SQL ).
SCOPE_IDENTITY y @@IDENTITY devuelven los últimos valores de identidad generados en una tabla en la
sesión actual. No obstante, SCOPE_IDENTITY solo devuelve los valores insertados en el ámbito actual;
@@IDENTITY no se limita a un ámbito específico.
Por ejemplo, suponga que hay dos tablas, T1 y T2, y un desencadenador INSERT definido en T1. Cuando se
inserta una fila en T1, el desencadenador se activa e inserta una fila en T2. Este escenario muestra dos ámbitos: la
inserción en T1 y la inserción en T2 como resultado del desencadenador.
Suponiendo que T1 y T2 tienen columnas de identidad, @@IDENTITY y SCOPE_IDENTITY devolverán distintos
valores al finalizar una instrucción INSERT en T1. @@IDENTITY devolverá el último valor de la columna de
identidad insertado en cualquier ámbito en la sesión actual. Este es el valor insertado en T2. SCOPE_IDENTITY ()
devuelve el valor IDENTITY insertado en T1. Es la última inserción que se ha producido en el mismo ámbito. La
función SCOPE_IDENTITY () devuelve el valor NULL si se llama a la función antes de que se ejecuten las
instrucciones INSERT en una columna de identidad del ámbito.
Las instrucciones y transacciones con errores pueden cambiar la identidad actual de una tabla y crear huecos en
los valores de columna de identidad. El valor de identidad jamás se revierte, aun cuando no se haya confirmado la
transacción que intentó insertar el valor en la tabla. Por ejemplo, si se produce un error en una instrucción
INSERT debido a una infracción de tipo IGNORE_DUP_KEY, el valor de identidad actual de la tabla se sigue
incrementando.
Ejemplos
A. Uso de @@IDENTITY y SCOPE_IDENTITY con desencadenadores
Este ejemplo crea dos tablas, TZ y TY , y un desencadenador INSERT en TZ . Cuando se inserta una fila en TZ ,
el desencadenador Ztrig se activa e inserta una fila en TY .

USE tempdb;
GO
CREATE TABLE TZ (
Z_id int IDENTITY(1,1)PRIMARY KEY,
Z_name varchar(20) NOT NULL);

INSERT TZ
VALUES ('Lisa'),('Mike'),('Carla');

SELECT * FROM TZ;

Conjunto de resultados: este es el aspecto de la tabla TZ.

Z_id Z_name
-------------
1 Lisa
2 Mike
3 Carla

CREATE TABLE TY (
Y_id int IDENTITY(100,5)PRIMARY KEY,
Y_name varchar(20) NULL);

INSERT TY (Y_name)
VALUES ('boathouse'), ('rocks'), ('elevator');

SELECT * FROM TY;

Conjunto de resultados: este es el aspecto de TY.

Y_id Y_name
---------------
100 boathouse
105 rocks
110 elevator

Cree el desencadenador que inserta una fila en una tabla TY cuando se inserta una fila en una tabla TZ.

CREATE TRIGGER Ztrig


ON TZ
FOR INSERT AS
BEGIN
INSERT TY VALUES ('')
END;

ACTIVE el desencadenador y determine los valores de identidad que se obtienen con las funciones @@IDENTITY
y SCOPE_IDENTITY.
INSERT TZ VALUES ('Rosalie');

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];


GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO

El conjunto de resultados es el siguiente.

/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`
SCOPE_IDENTITY
4

/*@@IDENTITY returns the last identity value inserted to TY by the trigger.


This fired because of an earlier insert on TZ.*/
@@IDENTITY
115

B. Uso de @@IDENTITY y SCOPE_IDENTITY () con una replicación


Los ejemplos siguientes muestran cómo se usan @@IDENTITY y SCOPE_IDENTITY() para las inserciones en una base
de datos publicada para la replicación de mezcla. Las dos tablas de los ejemplos se encuentran en la base de datos
de ejemplo AdventureWorks2012: Person.ContactType no está publicado y Sales.Customer sí. La replicación de
mezcla agrega desencadenadores a las tablas publicadas. Por lo tanto, @@IDENTITY puede devolver el valor de la
inserción en una tabla de sistema de replicación en lugar de la inserción en una tabla de usuario.
La tabla Person.ContactType tiene un valor de identidad máximo de 20. Si inserta una fila en la tabla, @@IDENTITY
y SCOPE_IDENTITY() devolverán el mismo valor.

USE AdventureWorks2012;
GO
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');
GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO

El conjunto de resultados es el siguiente.

SCOPE_IDENTITY
21
@@IDENTITY
21

La tabla Sales.Customer tiene un valor de identidad máximo de 29483. Si inserta una fila en la tabla, @@IDENTITY
y SCOPE_IDENTITY() devolverán valores diferentes. SCOPE_IDENTITY() devuelve el valor de la inserción en la tabla
de usuario, mientras que @@IDENTITY devuelve el valor de la inserción en la tabla del sistema de replicación. Use
SCOPE_IDENTITY() para las aplicaciones que necesitan obtener acceso al valor de identidad insertado.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);


GO
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
GO
SELECT @@IDENTITY AS [@@IDENTITY];
GO
El conjunto de resultados es el siguiente.

SCOPE_IDENTITY
29484
@@IDENTITY
89

Ver también
@@IDENTITY (Transact-SQL )
SERVERPROPERTY (Transact-SQL)
17/07/2018 • 22 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información de la propiedad acerca de la instancia del servidor.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los
cambios de comportamiento de T-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis
SERVERPROPERTY ( 'propertyname' )

Argumentos
propertyname
Es una expresión que contiene la información de propiedad que se va a devolver para el servidor. propertyname
puede ser uno de los valores siguientes.

PROPIEDAD VALORES DEVUELTOS

BuildClrVersion Versión de Common Language Runtime (CLR) de Microsoft


.NET Framework que se usó al generar la instancia de SQL
Server.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: nvarchar(128)

Intercalación El nombre de la intercalación predeterminada para el servidor.

NULL = La entrada no es válida o es un error.

Tipo de datos base: nvarchar(128)

CollationID Id. de la intercalación de SQL Server.

Tipo de datos base: int

ComparisonStyle Estilo de comparación de Windows de la intercalación.

Tipo de datos base: int


PROPIEDAD VALORES DEVUELTOS

ComputerNamePhysicalNetBIOS El nombre NetBIOS del equipo local en el que se está


ejecutando la instancia de SQL Server.

En el caso de una instancia en clúster de SQL Server en un


clúster de conmutación por error, este valor cambia conforme
la instancia de SQL Server se conmuta por error con otros
nodos del clúster de conmutación por error.

En una instancia independiente de SQL Server, este valor


permanece constante y devuelve el mismo valor que la
propiedad MachineName.

Nota: Si la instancia de SQL Server se encuentra en un clúster


de conmutación por error y quiere obtener el nombre de la
instancia en el clúster de conmutación por error, use la
propiedad MachineName.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: nvarchar(128)

Edición Edición de producto instalada de la instancia de SQL Server.


Use el valor de esta propiedad para determinar las
características y los límites, como por ejemplo Límites de la
capacidad de cálculo de cada edición de SQL Server. Las
versiones de 64 bits del Motor de base de datos anexan (64
bits) a la versión.

Devuelve:

'Enterprise Edition'

Enterprise Edition: licencia basada en núcleo

'Enterprise Evaluation Edition'

'Business Intelligence Edition'

'Developer Edition'

'Express Edition'

'Express Edition with Advanced Services'

'Standard Edition'

'Web Edition'

'SQL Azure' indica SQL Database o Almacenamiento de datos


SQL

Tipo de datos base: nvarchar(128)


PROPIEDAD VALORES DEVUELTOS

EditionID EditionID representa la edición instalada de la instancia de


SQL Server. Use el valor de esta propiedad para determinar
las características y los límites, como por ejemplo Límites de la
capacidad de cálculo de cada edición de SQL Server.

1804890536 = Enterprise

1872460670 = Enterprise Edition: licencia basada en núcleo

610778273= Enterprise Evaluation

284895786 = Business Intelligence

-2117995310 = Developer

-1592396055 = Express

-133711905= Express con Advanced Services

-1534726760 = Standard

1293598313 = Web

1674378470 = SQL Database o SQL Data Warehouse

Tipo de base de datos: bigint

EngineEdition Edición de Motor de base de datos de la instancia de SQL


Server instalada en el servidor.

1 = Personal o Desktop Engine (No está disponible en


Resultado de y versiones posteriores.)

2 = Standard (se devuelve para Standard, Web y Business


Intelligence.)

3 = Enterprise (es el valor que se devuelve en las ediciones


Evaluation, Developer y las dos ediciones Enterprise)

4 = Express (se devuelve para Express, Express with Tools y


Express con Advanced Services.)

5 = SQL Database

6 - Almacenamiento de datos SQL

8 = instancia administrada

Tipo de datos base: int


PROPIEDAD VALORES DEVUELTOS

HadrManagerStatus Se aplica a: desde SQL Server 2012 (11.x) hasta SQL Server
2017.

Indica si el administrador de Grupos de disponibilidad


AlwaysOn ha iniciado.

0 = No iniciado, pendiente de comunicación.

1 = Iniciado y en ejecución.

2 = No iniciado y con error.

NULL = La entrada no es válida, es un error o no es aplicable.

InstanceDefaultDataPath Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Nombre de la ruta de acceso predeterminada a los archivos


de datos de instancia.

InstanceDefaultLogPath Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Nombre de la ruta de acceso predeterminada a los archivos


de registro de instancia.

InstanceName Nombre de la instancia a la que está conectado el usuario.

Devuelve NULL si el nombre de la instancia es la instancia


predeterminada o si es una entrada no válida o un error.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: nvarchar(128)

IsAdvancedAnalyticsInstalled Devuelve 1 si se ha instalado la característica Análisis


avanzado durante la instalación; 0 si no se instaló Análisis
avanzado.

IsClustered La instancia del servidor está configurada en un clúster de


conmutación por error.

1 = Clúster.

0 = No clúster.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int


PROPIEDAD VALORES DEVUELTOS

IsFullTextInstalled Los componentes de indización de texto completo y


semántica están instalados en la instancia actual de SQL
Server.

1 = Los componentes de indización de texto completo y


semántica están instalados.

0 = Los componentes de indización de texto completo y


semántica no están instalados.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int

IsHadrEnabled Se aplica a: desde SQL Server 2012 (11.x) hasta SQL Server
2017.

Grupos de disponibilidad AlwaysOn está habilitado en esta


instancia del servidor.

0 = La característica Grupos de disponibilidad AlwaysOn está


deshabilitada.

1 = La característica Grupos de disponibilidad AlwaysOn está


habilitada.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int

Para que las réplicas de disponibilidad se creen y se ejecuten


en una instancia de SQL Server, Grupos de disponibilidad
AlwaysOn debe estar habilitado en la instancia del servidor.
Para más información, vea Habilitar y deshabilitar grupos de
disponibilidad de AlwaysOn (SQL Server).

Nota: La propiedad IsHadrEnabled pertenece solamente a


Grupos de disponibilidad AlwaysOn. Otras características de
alta disponibilidad o de recuperación ante desastres, como la
creación de reflejo de la base de datos o el trasvase de
registros, no se ven afectadas por esta propiedad de servidor.

IsIntegratedSecurityOnly El servidor está en modo de seguridad integrada.

1= Seguridad integrada (Autenticación de Windows)

0 = Seguridad no integrada. (Tanto la autenticación de


Windows como la autenticación de SQL Server).

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int

IsLocalDB Se aplica a: desde SQL Server 2012 (11.x) hasta SQL Server
2017.

El servidor es una instancia de SQL Server Express LocalDB.

NULL = La entrada no es válida, es un error o no es aplicable.


PROPIEDAD VALORES DEVUELTOS

IsPolybaseInstalled Se aplica a: SQL Server 2017.

Devuelve un valor que indica si la instancia del servidor tiene


instalada la característica PolyBase.

0 = PolyBase no está instalada.

1 = PolyBase está instalada.

Tipo de datos base: int

IsSingleUser El servidor está en modo de usuario único.

1 = Usuario único.

0 = Usuario no único.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int

IsXTPSupported Se aplica a: SQL Server (desde SQL Server 2014 (12.x) hasta
SQL Server 2017), SQL Database.

El servidor admite OLTP en memoria.

1= El servidor admite OLTP en memoria.

0= El servidor no admite OLTP en memoria.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int

LCID Identificador de configuración regional (LCID) de Windows de


la intercalación.

Tipo de datos base: int

LicenseType Sin usar. El producto de SQL Server no conserva ni mantiene


la información sobre la licencia. Siempre devuelve DISABLED.

Tipo de datos base: nvarchar(128)

MachineName Nombre del equipo con Windows en el que se está


ejecutando la instancia del servidor.

Para una instancia en clúster, una instancia de SQL Server que


se ejecuta en el Servicio de Cluster Server de Microsoft,
devuelve el nombre del servidor virtual.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: nvarchar(128)

NumLicenses Sin usar. El producto de SQL Server no conserva ni mantiene


la información sobre la licencia. Siempre devuelve NULL.

Tipo de datos base: int


PROPIEDAD VALORES DEVUELTOS

ProcessID Identificador de proceso del servicio SQL Server. ProcessID es


útil para identificar a qué Sqlservr.exe pertenece esta
instancia.

NULL = La entrada no es válida, es un error o no es aplicable.

Tipo de datos base: int

ProductBuild Se aplica a: SQL Server 2014 (12.x) a partir de octubre de


2015.

Número de compilación.

ProductBuildType Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Tipo de compilación de la compilación actual.

Devuelve una de las siguientes opciones:

OD = versión a petición de un cliente específico.

GDR = versión de distribución general publicada en Windows


Update.

NULL
= No aplicable.

ProductLevel Nivel de la versión de la instancia de SQL Server.

Devuelve una de las siguientes opciones:

'RTM' = Versión comercial original

'SPn' = versión de Service Pack

'CTPn', = versión de Community Technology Preview

Tipo de datos base: nvarchar(128)

ProductMajorVersion Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Versión principal.

ProductMinorVersion Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Versión secundaria.
PROPIEDAD VALORES DEVUELTOS

ProductUpdateLevel Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Nivel de actualización de la compilación actual. CU indica una


actualización acumulativa.

Devuelve una de las siguientes opciones:

CUn = Actualización acumulativa

NULL
= No aplicable.

ProductUpdateReference Se aplica a: SQL Server 2012 (11.x) hasta la versión actual


en actualizaciones a partir de finales de 2015.

Artículo de Knowledge Base para esa versión.

ProductVersion Versión de la instancia de SQL Server con el formato


'major.minor.build.revision'.

Tipo de datos base: nvarchar(128)

ResourceLastUpdateDateTime Devuelve la fecha y hora de la última actualización de la base


de datos de recursos.

Tipo de datos base: datetime

ResourceVersion Devuelve la versión de la base de datos de recursos.

Tipo de datos base: nvarchar(128)

ServerName La información del servidor Windows y de la instancia


asociada con una instancia especificada de SQL Server.

NULL = La entrada no es válida o es un error.

Tipo de datos base: nvarchar(128)

SqlCharSet Id. del juego de caracteres de SQL a partir del Id. de


intercalación.

Tipo de datos base: tinyint

SqlCharSetName Juego de caracteres de SQL a partir de la intercalación.

Tipo de datos base: nvarchar(128)

SqlSortOrder Id. de criterio de ordenación de SQL a partir de la


intercalación.

Tipo de datos base: tinyint

SqlSortOrderName Nombre de criterio de ordenación de SQL a partir de la


intercalación.

Tipo de datos base: nvarchar(128)


PROPIEDAD VALORES DEVUELTOS

FilestreamShareName Nombre del recurso compartido usado por FILESTREAM.

NULL = La entrada no es válida, es un error o no es aplicable.

FilestreamConfiguredLevel Nivel configurado de acceso de FILESTREAM. Para más


información, vea filestream access level (opción de
configuración del servidor).

FilestreamEffectiveLevel Nivel efectivo de acceso de FILESTREAM. Este valor puede ser


diferente de FilestreamConfiguredLevel si el nivel ha
cambiado y queda pendiente un reinicio de la instancia o del
equipo. Para más información, vea filestream access level
(opción de configuración del servidor).

Tipos devueltos
sql_variant

Notas
Propiedad ServerName
La propiedad ServerName de la función SERVERPROPERTY y @@SERVERNAME devuelven información parecida.
La propiedad ServerName proporciona el nombre de la instancia y el servidor Windows que forman la instancia
de servidor única. @@SERVERNAME proporciona el nombre del servidor local configurado actualmente.
La propiedad ServerName y @@SERVERNAME devuelven la misma información si no se cambió el nombre del
servidor predeterminado durante la instalación. El nombre del servidor local se puede configurar ejecutando lo
siguiente:

EXEC sp_dropserver 'current_server_name';


GO
EXEC sp_addserver 'new_server_name', 'local';
GO

Si durante la instalación se seleccionó un nombre para el servidor local distinto del predeterminado,
@@SERVERNAME devuelve el nombre nuevo.
Propiedades de la versión
La función SERVERPROPERTY devuelve propiedades sueltas relacionadas con la información de la versión, mientras
que la función @@VERSION combina la salida en una cadena. Si la aplicación requiere cadenas con las
propiedades por separado, puede usar la función SERVERPROPERTY para devolverlas en lugar de analizar los
resultados de @@VERSION.
NOTE
Somos conscientes de que hay un problema en el que las propiedades de la versión notificadas por SERVERPROPERTY son
incorrectas para Azure SQL Database. La versión del motor de base de datos de SQL Server que ejecuta Azure SQL
Database va siempre por delante de la versión local de SQL Server e incluye las correcciones de seguridad más recientes.
Esto significa que el nivel de revisión siempre va a la par de la versión local de SQL Server, o incluso por delante, y que las
características más recientes disponibles en SQL Server están disponibles en Azure SQL Database.
Para determinar mediante programación la edición del motor, use SELECT SERVERPROPERTY('EngineEdition'). Esta consulta
devolverá "5" para las bases de datos independiente y "8" para las instancias administradas en Azure SQL Database.
Una vez que se resuelva este problema, se actualizará la documentación.

Permisos
Todos los usuarios pueden consultar las propiedades del servidor.

Ejemplos
En este ejemplo se usa la función SERVERPROPERTY en una instrucción SELECT para devolver información sobre la
instancia actual de SQL Server.

SELECT
SERVERPROPERTY('MachineName') AS ComputerName,
SERVERPROPERTY('ServerName') AS InstanceName,
SERVERPROPERTY('Edition') AS Edition,
SERVERPROPERTY('ProductVersion') AS ProductVersion,
SERVERPROPERTY('ProductLevel') AS ProductLevel;
GO

Ver también
Ediciones y componentes de SQL Server 2016
STATS_DATE (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la fecha de la actualización más reciente de las estadísticas de una tabla o vista indizada.
Para más información sobre cómo actualizar las estadísticas, vea Estadísticas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
STATS_DATE ( object_id , stats_id )

Argumentos
object_id
Identificador de la tabla o vista indizada con las estadísticas.
stats_id
Identificador del objeto de estadísticas.

Tipos devueltos
Devuelve datetime si es correcto. Devuelve NULL si no se creó un blob de estadísticas.

Notas
Las funciones del sistema se pueden utilizar en la lista de selección, en la cláusula WHERE y en cualquier lugar
donde se permita una expresión.
La fecha de actualización de estadísticas se almacena en el objeto BLOB de estadísticas junto con el histograma y el
vector de densidad, pero no en los metadatos. Cuando no se lee ningún dato con el que generar datos de
estadísticas, el BLOB de estadísticas no se crea y la fecha no está disponible. Esto sucede en las estadísticas
filtradas, en las que el predicado no devuelve ninguna fila, o en las tablas nuevas vacías.
Si las estadísticas corresponden a un índice, el valor de stats_id de la vista de catálogo sys.stats es el mismo que el
valor de index_id de la vista de catálogo sys.indexes.

Permisos
Es necesaria la pertenencia al rol fijo de servidor db_owner o al rol fijo de base de datos maestra o al rol fijo de
servidor sysadmin.

Ejemplos
A. Devolver las fechas de las estadísticas más recientes de una tabla
En el ejemplo siguiente, se devuelve la fecha de la actualización más reciente de cada objeto de estadísticas de la
tabla Person.Address .

USE AdventureWorks2012;
GO
SELECT name AS stats_name,
STATS_DATE(object_id, stats_id) AS statistics_update_date
FROM sys.stats
WHERE object_id = OBJECT_ID('Person.Address');
GO

Si las estadísticas corresponden a un índice, el valor de stats_id de la vista de catálogo sys.stats es el mismo que el
valor de index_id de la vista de catálogo sys.indexes, y la consulta siguiente devuelve los mismos resultados que la
consulta precedente. Si las estadísticas no corresponden a un índice, aparecen en los resultados de sys.stats pero
no en los de sys.indexes.

USE AdventureWorks2012;
GO
SELECT name AS index_name,
STATS_DATE(object_id, index_id) AS statistics_update_date
FROM sys.indexes
WHERE object_id = OBJECT_ID('Person.Address');
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Saber cuándo se actualizaron las estadísticas con nombre por última vez
En el siguiente ejemplo se crean estadísticas basadas en la columna LastName de la tabla DimCustomer. Luego, se
ejecuta una consulta para mostrar la fecha de las estadísticas. Por último, las estadísticas se actualizan y la consulta
se vuelve ejecutar para mostrar la fecha de actualización.
--First, create a statistics object
USE AdventureWorksPDW2012;
GO
CREATE STATISTICS Customer_LastName_Stats
ON AdventureWorksPDW2012.dbo.DimCustomer (LastName)
WITH SAMPLE 50 PERCENT;
GO

--Return the date when Customer_LastName_Stats was last updated


USE AdventureWorksPDW2012;
GO
SELECT stats_id, name AS stats_name,
STATS_DATE(object_id, stats_id) AS statistics_date
FROM sys.stats s
WHERE s.object_id = OBJECT_ID('dbo.DimCustomer')
AND s.name = 'Customer_LastName_Stats';
GO

--Update Customer_LastName_Stats so it will have a different timestamp in the next query


GO
UPDATE STATISTICS dbo.dimCustomer (Customer_LastName_Stats);

--Return the date when Customer_LastName_Stats was last updated.


SELECT stats_id, name AS stats_name,
STATS_DATE(object_id, stats_id) AS statistics_date
FROM sys.stats s
WHERE s.object_id = OBJECT_ID('dbo.DimCustomer')
AND s.name = 'Customer_LastName_Stats';
GO

C. Ver la fecha de última actualización de todas las estadísticas en una tabla


En este ejemplo se devuelve la fecha de última actualización de cada objeto de estadísticas en la tabla
DimCustomer.

--Return the dates all statistics on the table were last updated.
SELECT stats_id, name AS stats_name,
STATS_DATE(object_id, stats_id) AS statistics_date
FROM sys.stats s
WHERE s.object_id = OBJECT_ID('dbo.DimCustomer');
GO

Si las estadísticas corresponden a un índice, el valor de stats_id de la vista de catálogo sys.stats es el mismo que el
valor de index_id de la vista de catálogo sys.indexes, y la consulta siguiente devuelve los mismos resultados que la
consulta precedente. Si las estadísticas no corresponden a un índice, aparecen en los resultados de sys.stats pero
no en los de sys.indexes.

USE AdventureWorksPDW2012;
GO
SELECT name AS index_name,
STATS_DATE(object_id, index_id) AS statistics_update_date
FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.DimCustomer');
GO

Ver también
Funciones del sistema (Transact-SQL )
UPDATE STATISTICS (Transact-SQL )
sp_autostats (Transact-SQL )
Utilizar las estadísticas para mejorar el rendimiento de las consultas
sys.dm_db_stats_properties (Transact-SQL )
sys.stats
TYPE_ID (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el Id. de un nombre de tipo de datos especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TYPE_ID ( [ schema_name ] type_name )

Argumentos
type_name
Es el nombre del tipo de datos. type_name es de tipo nvarchar. type_name puede ser un tipo de datos del sistema
o definido por el usuario.

Tipos devueltos
int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le
haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como TYPE_ID,
pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más información,
consulte Metadata Visibility Configuration.

Notas
TYPE_ID devuelve NULL si el nombre del tipo no es válido o si el autor de la llamada no tiene suficientes
permisos para hacer referencia al tipo.

Ejemplos
A. Buscar los valores de TYPE_ID para nombres de tipo de una sola parte y de dos partes
En el siguiente ejemplo se devuelve el valor de TYPE_ID para nombres de una sola parte y de dos partes.
USE tempdb;
GO
CREATE TYPE NewType FROM int;
GO
CREATE SCHEMA NewSchema;
GO
CREATE TYPE NewSchema.NewType FROM int;
GO
SELECT TYPE_ID('NewType') AS [1 Part Data Type ID],
TYPE_ID('NewSchema.NewType') AS [2 Part Data Type ID];
GO

B. Buscar el valor de TYPE_ID de un tipo de datos del sistema


En el siguiente ejemplo se devuelve el valor de TYPE ID para el tipo de datos del sistema datetime .

SELECT TYPE_NAME(TYPE_ID('datetime')) AS [TYPE_NAME]


,TYPE_ID('datetime') AS [TYPE_ID];
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Buscar el valor de TYPE_ID de un tipo de datos del sistema
En el siguiente ejemplo se devuelve el valor de TYPE ID para el tipo de datos del sistema datetime .

SELECT TYPE_NAME(TYPE_ID('datetime')) AS typeName,


TYPE_ID('datetime') AS typeID FROM table1;

Ver también
TYPE_NAME (Transact-SQL )
TYPEPROPERTY (Transact-SQL )
sys.types (Transact-SQL )
Funciones de metadatos (Transact-SQL )
TYPE_NAME (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de tipo no calificado de un Id. de tipo específico.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TYPE_NAME ( type_id )

Argumentos
type_id
Es el identificador del tipo que se va a utilizar. type_id es de tipo int y puede hacer referencia a un tipo de cualquier
esquema al que el autor de la llamada tenga permiso de acceso.

Tipos devueltos
sysname

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se le
haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como
TYPE_NAME, pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más
información, consulte Metadata Visibility Configuration.

Notas
TYPE_NAME devolverá un NULL cuando type_id no sea válido o cuando el autor de la llamada no cuente con los
permisos necesarios para hacer referencia al tipo.
TYPE_NAME funciona con tipos de datos de sistema así como con tipos de datos definidos por el usuario. El tipo
puede estar contenido en cualquier esquema, pero siempre se devuelve un nombre de tipo no calificado. Esto
significa que el nombre no tiene el prefijo schema..
Las funciones del sistema se pueden usar en la lista de selección, en la cláusula WHERE y en cualquier lugar
donde se permita una expresión. Para más información, vea Expresiones (Transact-SQL ) y WHERE (Transact-
SQL ).

Ejemplos
El ejemplo siguiente devuelve el nombre del objeto, de la columna y del tipo perteneciente a cada columna de la
tabla Vendor de la base de datos AdventureWorks2012.
SELECT o.name AS obj_name, c.name AS col_name,
TYPE_NAME(c.user_type_id) AS type_name
FROM sys.objects AS o
JOIN sys.columns AS c ON o.object_id = c.object_id
WHERE o.name = 'Vendor'
ORDER BY col_name;
GO

El conjunto de resultados es el siguiente.

obj_name col_name type_name


--------------- ------------------------ --------------
Vendor AccountNumber AccountNumber
Vendor ActiveFlag Flag
Vendor BusinessEntityID int
Vendor CreditRating tinyint
Vendor ModifiedDate datetime
Vendor Name Name
Vendor PreferredVendorStatus Flag
Vendor PurchasingWebServiceURL nvarchar

(8 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En este siguiente ejemplo se devuelve el valor de TYPE ID para el tipo de datos del sistema con identificador 1 .

SELECT TYPE_NAME(36) AS Type36, TYPE_NAME(239) AS Type239;


GO

Para ver una lista de tipos, consulte sys.types.

SELECT * FROM sys.types;


GO

Ver también
TYPE_ID (Transact-SQL )
TYPEPROPERTY (Transact-SQL )
sys.types (Transact-SQL )
Funciones de metadatos (Transact-SQL )
TYPEPROPERTY (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de un tipo de datos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TYPEPROPERTY (type , property)

Argumentos
Tipo
Es el nombre del tipo de datos.
property
Es el tipo de información que se devuelve del tipo de datos. property puede tener uno de estos valores.

PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

AllowsNull El tipo de datos permite valores nulos. 1 = True

0 = False

NULL = No se encuentra el tipo de


datos.

OwnerId Propietario del tipo. NonNULL = El Id. de usuario de la base


de datos del propietario del tipo.
Nota: El propietario del esquema no es
necesariamente el propietario del tipo. NULL = Tipo no compatible o Id. de
tipo no válido.

Precisión Precisión del tipo de datos. El número de dígitos o caracteres.

-1 = xml o un tipo de datos de valor


largo

NULL = No se encuentra el tipo de


datos.

Escala Escala para el tipo de datos. El número de decimales del tipo de


datos.

NULL = El tipo de datos no es


numeric o no se encontró.
PROPIEDAD DESCRIPCIÓN VALOR DEVUELTO

UsesAnsiTrim La configuración del relleno ANSI era 1 = True


ON cuando se creó el tipo de datos.
0 = False

NULL = No se encuentra el tipo de


datos o no es un tipo de datos de
cadena o binario.

Tipos devueltos
int

Excepciones
Devuelve NULL si se produce un error o si el autor de la llamada no tiene permiso para ver el objeto.
En SQL Server, un usuario solo puede ver los metadatos de elementos protegibles que posea o para los que se
le haya concedido permiso. Esto significa que las funciones integradas de emisión de metadatos, como
TYPEPROPERTY, pueden devolver NULL si el usuario no tiene ningún permiso para el objeto. Para obtener más
información, consulte Metadata Visibility Configuration.

Ejemplos
A. Identificar el propietario de un tipo de datos
En el ejemplo siguiente se devuelve el propietario de un tipo de datos.

SELECT TYPEPROPERTY(SCHEMA_NAME(schema_id) + '.' + name, 'OwnerId') AS owner_id, name, system_type_id,


user_type_id, schema_id
FROM sys.types;

B. Devolver la precisión del tipo de datos tinyint


En el siguiente ejemplo se devuelve la precisión o el número de dígitos del tipo de datos tinyint .

SELECT TYPEPROPERTY( 'tinyint', 'PRECISION');

Ver también
TYPE_ID (Transact-SQL )
TYPE_NAME (Transact-SQL )
COLUMNPROPERTY (Transact-SQL )
Funciones de metadatos (Transact-SQL )
OBJECTPROPERTY (Transact-SQL )
ALTER AUTHORIZATION (Transact-SQL )
sys.types (Transact-SQL )
Versión - Funciones de metadatos de Transact SQL
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server Azure SQL Database Azure SQL Data Warehouse
Almacenamiento de datos paralelos
Devuelve la versión de Almacenamiento de datos SQL o Almacenamiento de datos paralelos en ejecución en el
dispositivo.
Convenciones de sintaxis de Transact-SQL (Transact-SQL )

Sintaxis
-- Azure SQL Data Warehouse and Parallel Data Warehouse
VERSION ( )

Argumentos
Notas generales
Debe especificarse un nombre de tabla en una cláusula FROM para esta función para que devuelva resultados. Se
devolverá una fila de resultados para cada fila del conjunto de resultados de la consulta; use TOP (Transact-SQL )
para limitar el número de filas devueltas.

Ejemplos
El ejemplo siguiente se devuelve el número de la versión.

SELECT VERSION();

Ver también
SESSION_ID (Transact-SQL )
DB_NAME (Transact-SQL )
Funciones escalares de ODBC (Transact-SQL)
17/07/2018 • 9 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Puede usar funciones escalares ODBC en instrucciones Transact-SQL. SQL Server interpreta estas instrucciones.
Se pueden utilizar en procedimientos almacenados y funciones definidas por el usuario. Entre estas últimas se
incluyen funciones de cadena, de número, de hora, de fecha, de intervalo y de sistema.

Uso
SELECT {fn <function_name> [ (<argument>,....n) ] }

Funciones
Las tablas siguientes enumeran las funciones escalares de ODBC que no se duplican en Transact-SQL.
Funciones de cadena
FUNCIÓN DESCRIPCIÓN

BIT_LENGTH( string_exp ) (ODBC 3.0) Devuelve la longitud en bits de la expresión de cadena.

No funciona únicamente para los tipos de datos de cadena.


Por consiguiente, no convertirá implícitamente string_exp en
una cadena sino que, en su lugar, devolverá el tamaño
(interno) del tipo de datos que se proporcione.

CONCAT( string_exp1,string_exp2) (ODBC 1.0) Devuelve una cadena de caracteres que es el resultado de
concatenar string_exp2 con string_exp1. La cadena resultante
es dependiente de DBMS. Por ejemplo, si la columna
representada por string_exp1 contenía un valor NULL, DB2
devolvería NULL, pero SQL Server devolvería la cadena
distinta de NULL.

OCTET_LENGTH( string_exp ) (ODBC 3.0) Devuelve la longitud en bytes de la expresión de cadena. El


resultado es el entero más pequeño que no es inferior al
número de bits dividido por 8.

No funciona únicamente para los tipos de datos de cadena.


Por consiguiente, no convertirá implícitamente string_exp en
una cadena sino que, en su lugar, devolverá el tamaño
(interno) del tipo de datos que se proporcione.

Función numéricas
FUNCIÓN DESCRIPCIÓN

TRUNCATE( numeric_exp, integer_exp) (ODBC 2.0) Devuelve numeric_exp truncado en posiciones de integer_exp
a la derecha del separador decimal. Si integer_exp es negativo,
numeric_exp se trunca en posiciones de |integer_exp| a la
izquierda del separador decimal.
Funciones de hora, fecha e intervalo
FUNCIÓN DESCRIPCIÓN

CURRENT_DATE( ) (ODBC 3.0) Devuelve la fecha actual.

CURDATE( ) (ODBC 3.0) Devuelve la fecha actual.

CURRENT_TIME [( time-precision )] (ODBC 3.0) Devuelve la hora local actual. El argumento de precisión de la
hora determina la precisión en segundos del valor devuelto

CURTIME() (ODBC 3.0) Devuelve la hora local actual.

DAYNAME( date_exp ) (ODBC 2.0) Devuelve una cadena de caracteres que contiene el nombre
específico del origen de datos del día (por ejemplo, Sunday a
Saturday o Sun. a Sat. para un origen de datos que utiliza
inglés, o bien Sonntag a Samstag para un origen de datos que
utiliza alemán) para la parte del día de date_exp.

DAYOFMONTH( date_exp ) (ODBC 1.0) Devuelve el día del mes basado en el campo de mes en
date_exp como un valor entero en el intervalo de 1 a 31.

DAYOFWEEK( date_exp ) (ODBC 1.0) Devuelve el día de la semana basado en el campo de semana
en date_exp como un valor entero en el intervalo de 1 a 7,
donde 1 representa el domingo.

HOUR( time_exp ) (ODBC 1.0) Devuelve la hora basada en el campo de hora en time_exp
como un valor entero en el intervalo de 0 a 23.

MINUTE( time_exp ) (ODBC 1.0) Devuelve los minutos basados en el campo de miuntos en
time_exp como un valor entero en el intervalo de 0 a 59.

SECOND( time_exp ) (ODBC 1.0) Devuelve los segundos basados en el campo de segundos en
time_exp como un valor entero en el intervalo de 0 a 59.

MONTHNAME( date_exp ) (ODBC 2.0) Devuelve una cadena de caracteres que contiene el nombre
específico del origen de datos del mes (por ejemplo, January a
December o Jan. a Dec. para un origen de datos que utiliza
inglés, o bien Januar a Dezember para un origen de datos que
utiliza alemán) para la parte del mes de date_exp.

QUARTER( date_exp ) (ODBC 1.0) Devuelve el trimestre en date_exp como un valor entero en el
intervalo de 1 a 4, donde 1 representa el trimestre del 1 de
enero al 31 de marzo.

WEEK( date_exp ) (ODBC 1.0) Devuelve la semana del año basado en el campo de semana
en date_exp como un valor entero en el intervalo de 1 a 53.

Ejemplos
A. Utilizar una función ODBC en un procedimiento almacenado
En el siguiente ejemplo se utiliza una función ODBC en un procedimiento almacenado:
CREATE PROCEDURE dbo.ODBCprocedure
(
@string_exp nvarchar(4000)
)
AS
SELECT {fn OCTET_LENGTH( @string_exp )};

B. Utilizar una función ODBC en una función definida por el usuario


El siguiente ejemplo utiliza una función ODBC en una función definida por el usuario:

CREATE FUNCTION dbo.ODBCudf


(
@string_exp nvarchar(4000)
)
RETURNS int
AS
BEGIN
DECLARE @len int
SET @len = (SELECT {fn OCTET_LENGTH( @string_exp )})
RETURN(@len)
END ;

SELECT dbo.ODBCudf('Returns the length.');


--Returns 38

C. Utilizar funciones ODBC en instrucciones SELECT


Las siguientes instrucciones SELECT utilizan funciones ODBC:
DECLARE @string_exp nvarchar(4000) = 'Returns the length.';
SELECT {fn BIT_LENGTH( @string_exp )};
-- Returns 304
SELECT {fn OCTET_LENGTH( @string_exp )};
-- Returns 38

SELECT {fn CONCAT( 'CONCAT ','returns a character string')};


-- Returns CONCAT returns a character string
SELECT {fn TRUNCATE( 100.123456, 4)};
-- Returns 100.123400
SELECT {fn CURRENT_DATE( )};
-- Returns 2007-04-20
SELECT {fn CURRENT_TIME(6)};
-- Returns 10:27:11.973000

DECLARE @date_exp nvarchar(30) = '2007-04-21 01:01:01.1234567';


SELECT {fn DAYNAME( @date_exp )};
-- Returns Saturday
SELECT {fn DAYOFMONTH( @date_exp )};
-- Returns 21
SELECT {fn DAYOFWEEK( @date_exp )};
-- Returns 7
SELECT {fn HOUR( @date_exp)};
-- Returns 1
SELECT {fn MINUTE( @date_exp )};
-- Returns 1
SELECT {fn SECOND( @date_exp )};
-- Returns 1
SELECT {fn MONTHNAME( @date_exp )};
-- Returns April
SELECT {fn QUARTER( @date_exp )};
-- Returns 2
SELECT {fn WEEK( @date_exp )};
-- Returns 16

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Utilizar una función ODBC en un procedimiento almacenado
En el siguiente ejemplo se utiliza una función ODBC en un procedimiento almacenado:

CREATE PROCEDURE dbo.ODBCprocedure


(
@string_exp nvarchar(4000)
)
AS
SELECT {fn BIT_LENGTH( @string_exp )};

E. Utilizar una función ODBC en una función definida por el usuario


El siguiente ejemplo utiliza una función ODBC en una función definida por el usuario:
CREATE FUNCTION dbo.ODBCudf
(
@string_exp nvarchar(4000)
)
RETURNS int
AS
BEGIN
DECLARE @len int
SET @len = (SELECT {fn BIT_LENGTH( @string_exp )})
RETURN(@len)
END ;

SELECT dbo.ODBCudf('Returns the length in bits.');


--Returns 432

F. Utilizar funciones ODBC en instrucciones SELECT


Las siguientes instrucciones SELECT utilizan funciones ODBC:

DECLARE @string_exp nvarchar(4000) = 'Returns the length.';


SELECT {fn BIT_LENGTH( @string_exp )};
-- Returns 304

SELECT {fn CONCAT( 'CONCAT ','returns a character string')};


-- Returns CONCAT returns a character string
SELECT {fn CURRENT_DATE( )};
-- Returns todays date
SELECT {fn CURRENT_TIME(6)};
-- Returns the time

DECLARE @date_exp nvarchar(30) = '2007-04-21 01:01:01.1234567';


SELECT {fn DAYNAME( @date_exp )};
-- Returns Saturday
SELECT {fn DAYOFMONTH( @date_exp )};
-- Returns 21
SELECT {fn DAYOFWEEK( @date_exp )};
-- Returns 7
SELECT {fn HOUR( @date_exp)};
-- Returns 1
SELECT {fn MINUTE( @date_exp )};
-- Returns 1
SELECT {fn SECOND( @date_exp )};
-- Returns 1
SELECT {fn MONTHNAME( @date_exp )};
-- Returns April
SELECT {fn QUARTER( @date_exp )};
-- Returns 2
SELECT {fn WEEK( @date_exp )};
-- Returns 16

Ver también
Funciones integradas (Transact-SQL )
Funciones de categoría (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las funciones de categoría devuelven un valor de categoría para cada fila de una partición. Según la función que
se utilice, algunas filas pueden recibir el mismo valor que otras. Las funciones de categoría son no deterministas.
Transact-SQL proporciona las siguientes funciones de categoría:

RANK NTILE

DENSE_RANK ROW_NUMBER

Ejemplos
A continuación se muestran las cuatro funciones de categoría usadas en la misma consulta. Consulte cada función
de categoría para ver ejemplos específicos de las funciones.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"
,RANK() OVER (ORDER BY a.PostalCode) AS Rank
,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"
,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile
,s.SalesYTD
,a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;

El conjunto de resultados es el siguiente.

ROW POSTALCOD
FIRSTNAME LASTNAME NUMBER RANK DENSE RANK QUARTILE SALESYTD E

Michael Blythe 1 1 1 1 4 557 98027


045,0459

Linda Mitchell 2 1 1 1 5 200 98027


475,2313

Jillian Carson 3 1 1 1 3 857 98027


163,6332

Garrett Vargas 4 1 1 1 1 764 98027


938,9859
ROW POSTALCOD
FIRSTNAME LASTNAME NUMBER RANK DENSE RANK QUARTILE SALESYTD E

Tsvi Reiter 5 1 1 2 2 811 98027


012,7151

Shu Ito 6 6 2 2 3 018 98055


725,4858

José Saraiva 7 6 2 2 3 189 98055


356,2465

David Campbell 8 6 2 3 3 587 98055


378,4257

Tete Mensa 9 6 2 3 1 931 98055


Annan 620,1835

Lynn Tsoflias 10 6 2 3 1 758 98055


385,926

Rachel Valdez 11 6 2 4 2 241 98055


204,0424

Jae Pak 12 6 2 4 5 015 98055


682,3752

Ranjit Varkey 13 6 2 4 3 827 98055


Chudukatil 950,238

Ver también
Funciones integradas (Transact-SQL )
OVER (cláusula de Transact-SQL )
DENSE_RANK (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el rango de cada fila dentro de una partición del conjunto de resultados, sin espacios en los
valores de clasificación. El rango de una fila específica es uno más el número de valores de rango distintos
anteriores a esa fila específica.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )

Argumentos
<partition_by_clause>
Primero divide el conjunto de resultados generado por la cláusula FROM en particiones y después se aplica la
función DENSE_RANK a cada partición. Vea Cláusula OVER (Transact-SQL ) para obtener la sintaxis de
PARTITION BY .

<order_by_clause>
Determina el orden en el que se aplica la función DENSE_RANK a las filas de una partición.

Tipos devueltos
bigint

Notas
Si dos o más filas tienen el mismo valor de rango en la misma partición, cada una de esas filas recibirá el mismo
rango. Por ejemplo, si los dos mejores vendedores tienen el mismo valor de SalesYTD, los dos tendrán un valor
de rango de uno. El siguiente vendedor con mayor valor en SalesYTD tendrá un valor de rango de dos. Esto
supera en uno el número de rangos distintos anteriores a la fila en cuestión. Por tanto, los números devueltos por
la función DENSE_RANK no tienen espacios y siempre tienen valores de rango consecutivos.
El criterio de ordenación que usa la consulta global determina el orden de las filas en el conjunto de resultados.
Esto implica que una fila que tiene el rango uno no tiene que ser la primera fila de la partición.
DENSE_RANK sea no determinista. Para más información, consulte Funciones deterministas y no deterministas.

Ejemplos
A. Clasificar filas dentro de una partición
En este ejemplo se clasifican los productos de inventario, por las ubicaciones de inventario especificadas, según
sus cantidades. DENSE_RANK divide el conjunto de resultados por LocationID y ordena lógicamente el conjunto de
resultados por Quantity . Observe que los productos 494 y 495 tienen la misma cantidad. Como los dos tienen el
mismo valor de cantidad, los dos tienen un valor de rango de uno.
USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
,DENSE_RANK() OVER
(PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i
INNER JOIN Production.Product AS p
ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO

El conjunto de resultados es el siguiente.

ProductID Name LocationID Quantity Rank


----------- ---------------------------------- ---------- -------- -----
494 Paint - Silver 3 49 1
495 Paint - Blue 3 49 1
493 Paint - Red 3 41 2
496 Paint - Yellow 3 30 3
492 Paint - Black 3 17 4
495 Paint - Blue 4 35 1
496 Paint - Yellow 4 25 2
493 Paint - Red 4 24 3
492 Paint - Black 4 14 4
494 Paint - Silver 4 12 5

(10 row(s) affected)

B. Clasificar todas las filas de un conjunto de resultados


En este ejemplo se devuelven los diez primeros empleados clasificados por su salario. Como la instrucción
SELECT no especificó una cláusula PARTITION BY , la función DENSE_RANK se aplica a todas las filas del conjunto de
resultados.

USE AdventureWorks2012;
GO
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;

El conjunto de resultados es el siguiente.

BusinessEntityID Rate RankBySalary


---------------- --------------------- --------------------
1 125.50 1
25 84.1346 2
273 72.1154 3
2 63.4615 4
234 60.0962 5
263 50.4808 6
7 50.4808 6
234 48.5577 7
285 48.101 8
274 48.101 8

C. Cuatro funciones de categoría usadas en la misma consulta


En este ejemplo se muestran las cuatro funciones de categoría
DENSE_RANK()
NTILE ()
RANK()
ROW_NUMBER ()
que se usaron en la misma consulta. Vea cada función de categoría para obtener ejemplos específicos de la
función.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"
,RANK() OVER (ORDER BY a.PostalCode) AS Rank
,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"
,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile
,s.SalesYTD
,a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;

El conjunto de resultados es el siguiente.

ROW POSTALCOD
FIRSTNAME LASTNAME NUMBER RANK DENSE RANK QUARTILE SALESYTD E

Michael Blythe 1 1 1 1 4 557 98027


045,0459

Linda Mitchell 2 1 1 1 5 200 98027


475,2313

Jillian Carson 3 1 1 1 3 857 98027


163,6332

Garrett Vargas 4 1 1 1 1 764 98027


938,9859

Tsvi Reiter 5 1 1 2 2 811 98027


012,7151

Shu Ito 6 6 2 2 3 018 98055


725,4858

José Saraiva 7 6 2 2 3 189 98055


356,2465

David Campbell 8 6 2 3 3 587 98055


378,4257

Tete Mensa 9 6 2 3 1 931 98055


Annan 620,1835
ROW POSTALCOD
FIRSTNAME LASTNAME NUMBER RANK DENSE RANK QUARTILE SALESYTD E

Lynn Tsoflias 10 6 2 3 1 758 98055


385,926

Rachel Valdez 11 6 2 4 2 241 98055


204,0424

Jae Pak 12 6 2 4 5 015 98055


682,3752

Ranjit Varkey 13 6 2 4 3 827 98055


Chudukatil 950,238

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Clasificar filas dentro de una partición
En este ejemplo se clasifican los representantes de ventas de cada territorio de ventas en función de sus ventas
totales. DENSE_RANK divide el conjunto de filas por SalesTerritoryGroup y ordena el conjunto de resultados por
SalesAmountQuota .

-- Uses AdventureWorks

SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryGroup,


DENSE_RANK() OVER (PARTITION BY SalesTerritoryGroup ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq ON e.EmployeeKey = sq.EmployeeKey
INNER JOIN dbo.DimSalesTerritory AS st ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE SalesPersonFlag = 1 AND SalesTerritoryGroup != N'NA'
GROUP BY LastName, SalesTerritoryGroup;

El conjunto de resultados es el siguiente.

LastName TotalSales SalesTerritoryGroup RankResult


---------------- ------------- ------------------- --------
Pak 10514000.0000 Europe 1
Varkey Chudukatil 5557000.0000 Europe 2
Valdez 2287000.0000 Europe 3
Carson 12198000.0000 North America 1
Mitchell 11786000.0000 North America 2
Blythe 11162000.0000 North America 3
Reiter 8541000.0000 North America 4
Ito 7804000.0000 North America 5
Saraiva 7098000.0000 North America 6
Vargas 4365000.0000 North America 7
Campbell 4025000.0000 North America 8
Ansman-Wolfe 3551000.0000 North America 9
Mensa-Annan 2753000.0000 North America 10
Tsoflias 1687000.0000 Pacific 1

Ver también
RANK (Transact-SQL )
ROW_NUMBER (Transact-SQL )
NTILE (Transact-SQL )
Funciones de categoría (Transact-SQL )
Funciones
NTILE (Transact-SQL)
19/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Distribuye las filas de una partición ordenada en un número especificado de grupos. Los grupos se numeran a
partir del uno. Para cada fila, NTILE devuelve el número del grupo al que pertenece la fila.
Convenciones de sintaxis de Transact-SQL

Sintaxis
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )

Argumentos
integer_expression
Es una expresión de tipo entero positivo que especifica el número de grupos en que se debe dividir cada
partición. integer_expression puede ser de tipo int o bigint.
<partition_by_clause>
Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función.
Para obtener la sintaxis PARTITION BY, vea OVER (cláusula de Transact-SQL ).
<order_by_clause>
Determina el orden en que los valores NTILE se asignan a las filas de una partición. Un entero no puede
representar una columna cuando se usa <order_by_clause> en una función de categoría.

Tipos devueltos
bigint

Notas
Si el número de filas de una partición no se puede dividir por integer_expression, producirá grupos de dos
tamaños que difieren en un miembro. Los grupos de mayor tamaño preceden a los grupos de menor tamaño en
el orden especificado por la cláusula OVER. Por ejemplo, si el número total de filas es 53 y el número de grupos
es cinco, los tres primeros grupos tienen 11 filas y los otros dos grupos tienen 10 filas cada uno. Por otra parte, si
el número total de filas es divisible por el número de grupos, las filas se distribuyen por igual entre los grupos.
Por ejemplo, si el número total de filas es 50 y hay cinco grupos, cada grupo contiene 10 filas.
NTILE es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic Functions.

Ejemplos
A. Dividir filas en grupos
En el ejemplo siguiente se dividen las filas en cuatro grupos de empleados según sus ventas anuales hasta la
fecha. Puesto que el número total de filas no es divisible por el número de grupos, los dos primeros grupos tienen
cuatro filas y los grupos restantes tienen tres filas cada uno.
USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName
,NTILE(4) OVER(ORDER BY SalesYTD DESC) AS Quartile
,CONVERT(nvarchar(20),s.SalesYTD,1) AS SalesYTD
, a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
GO

El conjunto de resultados es el siguiente.

FirstName LastName Quartile SalesYTD PostalCode


------------- --------------------- --------- -------------- ----------
Linda Mitchell 1 4,251,368.55 98027
Jae Pak 1 4,116,871.23 98055
Michael Blythe 1 3,763,178.18 98027
Jillian Carson 1 3,189,418.37 98027
Ranjit Varkey Chudukatil 2 3,121,616.32 98055
José Saraiva 2 2,604,540.72 98055
Shu Ito 2 2,458,535.62 98055
Tsvi Reiter 2 2,315,185.61 98027
Rachel Valdez 3 1,827,066.71 98055
Tete Mensa-Annan 3 1,576,562.20 98055
David Campbell 3 1,573,012.94 98055
Garrett Vargas 4 1,453,719.47 98027
Lynn Tsoflias 4 1,421,810.92 98055
Pamela Ansman-Wolfe 4 1,352,577.13 98027

(14 row(s) affected)

B. Dividir el conjunto de resultados mediante PARTITION BY


En el ejemplo siguiente se agrega el argumento PARTITION BY al código del ejemplo A. Primero se dividen por
PostalCode y, a continuación, en cuatro grupos dentro de cada PostalCode . En el ejemplo también se declara una
variable @NTILE_Var y se usa esa variable para especificar el valor del parámetro integer_expression.

USE AdventureWorks2012;
GO
DECLARE @NTILE_Var int = 4;

SELECT p.FirstName, p.LastName


,NTILE(@NTILE_Var) OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS Quartile
,CONVERT(nvarchar(20),s.SalesYTD,1) AS SalesYTD
,a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0;
GO

El conjunto de resultados es el siguiente.


FirstName LastName Quartile SalesYTD PostalCode
------------ -------------------- -------- ------------ ----------
Linda Mitchell 1 4,251,368.55 98027
Michael Blythe 1 3,763,178.18 98027
Jillian Carson 2 3,189,418.37 98027
Tsvi Reiter 2 2,315,185.61 98027
Garrett Vargas 3 1,453,719.47 98027
Pamela Ansman-Wolfe 4 1,352,577.13 98027
Jae Pak 1 4,116,871.23 98055
Ranjit Varkey Chudukatil 1 3,121,616.32 98055
José Saraiva 2 2,604,540.72 98055
Shu Ito 2 2,458,535.62 98055
Rachel Valdez 3 1,827,066.71 98055
Tete Mensa-Annan 3 1,576,562.20 98055
David Campbell 4 1,573,012.94 98055
Lynn Tsoflias 4 1,421,810.92 98055

(14 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Dividir filas en grupos
En este ejemplo se usa la función NTILE para dividir un conjunto de vendedores en cuatro grupos, según sus
cuotas de ventas asignadas para el año 2003. Como el número total de filas no se puede dividir por el número de
grupos, el primer grupo tiene cinco filas y los grupos restantes tienen cuatro filas cada uno.

-- Uses AdventureWorks

SELECT e.LastName, NTILE(4) OVER(ORDER BY SUM(SalesAmountQuota) DESC) AS Quartile,


CONVERT (varchar(13), SUM(SalesAmountQuota), 1) AS SalesQuota
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq
ON e.EmployeeKey = sq.EmployeeKey
WHERE sq.CalendarYear = 2003
AND SalesTerritoryKey IS NOT NULL AND SalesAmountQuota <> 0
GROUP BY e.LastName
ORDER BY Quartile, e.LastName;

El conjunto de resultados es el siguiente.

LastName Quartile SalesYTD


----------------- -------- ------------`
Blythe 1 4,716,000.00
Carson 1 4,350,000.00
Mitchell 1 4,682,000.00
Pak 1 5,142,000.00
Varkey Chudukatil 1 2,940,000.00
Ito 2 2,644,000.00
Saraiva 2 2,293,000.00
Vargas 2 1,617,000.00
Ansman-Wolfe 3 1,183,000.00
Campbell 3 1,438,000.00
Mensa-Annan 3 1,481,000.00
Valdez 3 1,294,000.00
Abbas 4 172,000.00
Albert 4 651,000.00
Jiang 4 544,000.00
Tsoflias 4 867,000.00
D. Dividir el conjunto de resultados mediante PARTITION BY
En este ejemplo se agrega el argumento PARTITION BY al código del ejemplo A. Primero se dividen las filas por
SalesTerritoryCountry y, después, se dividen en dos grupos dentro de cada SalesTerritoryCountry . Observe que
ORDER BY en la cláusula OVER ordena NTILE, y ORDER BY de la instrucción SELECT ordena el conjunto de
resultados.

-- Uses AdventureWorks

SELECT e.LastName, NTILE(2) OVER(PARTITION BY e.SalesTerritoryKey ORDER BY SUM(SalesAmountQuota) DESC) AS


Quartile,
CONVERT (varchar(13), SUM(SalesAmountQuota), 1) AS SalesQuota
,st.SalesTerritoryCountry
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq
ON e.EmployeeKey = sq.EmployeeKey
INNER JOIN dbo.DimSalesTerritory AS st
ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE sq.CalendarYear = 2003
GROUP BY e.LastName,e.SalesTerritoryKey,st.SalesTerritoryCountry
ORDER BY st.SalesTerritoryCountry, Quartile;

El conjunto de resultados es el siguiente.

LastName Quartile SalesYTD SalesTerritoryCountry


----------------- -------- -------------- ------------------
Tsoflias 1 867,000.00 Australia
Saraiva 1 2,293,000.00 Canada
Varkey Chudukatil 1 2,940,000.00 France
Valdez 1 1,294,000.00 Germany
Alberts 1 651,000.00 NA
Jiang 1 544,000.00 NA
Pak 1 5,142,000.00 United Kingdom
Mensa-Annan 1 1,481,000.00 United States
Campbell 1 1,438,000.00 United States
Reiter 1 2,768,000.00 United States
Blythe 1 4,716,000.00 United States
Carson 1 4,350,000.00 United States
Mitchell 1 4,682,000.00 United States
Vargas 2 1,617,000.00 Canada
Abbas 2 172,000.00 NA
Ito 2 2,644,000.00 United States
Ansman-Wolfe 2 1,183,000.00 United States

Ver también
RANK (Transact-SQL )
DENSE_RANK (Transact-SQL )
ROW_NUMBER (Transact-SQL )
Funciones de categoría (Transact-SQL )
Funciones integradas (Transact-SQL )
RANK (Transact-SQL)
19/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el rango de cada fila en la partición de un conjunto de resultados. El rango de una fila es uno más el
número de rangos anteriores a la fila en cuestión.
ROW_NUMBER y RANK son similares. ROW_NUMBER enumera todas las filas secuencialmente (por ejemplo
1, 2, 3, 4, 5). RANK proporciona el mismo valor numérico para valores equivalentes (por ejemplo 1, 2, 2, 4, 5).

NOTE
RANK es un valor temporal que se calcula cuando se ejecuta la consulta. Para conservar los números de una tabla, vea
Propiedad IDENTITY y SEQUENCE.

Convenciones de sintaxis de Transact-SQL

Sintaxis
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Argumentos
OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se
aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como
un único grupo. order_by_clause determina el orden de los datos antes de que se aplique la función.
order_by_clause es obligatorio. La <cláusula rows o range> de la cláusula OVER no se puede especificar para la
función RANK. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
bigint

Notas
Si dos o más filas se enlazan en un rango, cada fila enlazada recibe el mismo rango. Por ejemplo, si los dos
mejores vendedores tienen el mismo valor de SalesYTD, los dos tienen el rango uno. El vendedor con el siguiente
valor más alto de SalesYTD recibe el rango tres, porque ya hay dos filas con un rango superior. Por tanto, la
función RANK no siempre devuelve enteros consecutivos.
El criterio de ordenación empleado por la consulta global determina el orden en que aparecen las filas en el
conjunto de resultados.
RANK es no determinista. Para obtener más información, consulte Deterministic and Nondeterministic
Functions.
Ejemplos
A. Clasificar filas dentro de una partición
En el ejemplo siguiente se otorga un rango a los productos de inventario de las ubicaciones de inventario
especificadas según sus cantidades. LocationID divide en particiones el conjunto de resultados y Quantity lo
ordena lógicamente. Observe que los productos 494 y 495 tienen la misma cantidad. Como están enlazados,
ambos tienen rango uno.

USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
,RANK() OVER
(PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i
INNER JOIN Production.Product AS p
ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO

El conjunto de resultados es el siguiente.

ProductID Name LocationID Quantity Rank


----------- ---------------------- ------------ -------- ----
494 Paint - Silver 3 49 1
495 Paint - Blue 3 49 1
493 Paint - Red 3 41 3
496 Paint - Yellow 3 30 4
492 Paint - Black 3 17 5
495 Paint - Blue 4 35 1
496 Paint - Yellow 4 25 2
493 Paint - Red 4 24 3
492 Paint - Black 4 14 4
494 Paint - Silver 4 12 5
(10 row(s) affected)

B. Clasificar todas las filas de un conjunto de resultados


En el ejemplo siguiente se devuelven los diez primeros empleados clasificados por su salario. Como no se
especifica ninguna cláusula PARTITION BY, la función RANK se aplica a todas las filas del conjunto de resultados.

USE AdventureWorks2012
SELECT TOP(10) BusinessEntityID, Rate,
RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (SELECT MAX(RateChangeDate)
FROM HumanResources.EmployeePayHistory AS eph2
WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)
ORDER BY BusinessEntityID;

El conjunto de resultados es el siguiente.


BusinessEntityID Rate RankBySalary
---------------- --------------------- --------------------
1 125.50 1
2 63.4615 4
3 43.2692 8
4 29.8462 19
5 32.6923 16
6 32.6923 16
7 50.4808 6
8 40.8654 10
9 40.8654 10
10 42.4808 9

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Clasificar filas dentro de una partición
En el siguiente ejemplo se clasifican los representantes de ventas de cada territorio de ventas según sus ventas
totales. Se crean particiones del conjunto de filas por SalesTerritoryGroup y se ordenan por SalesAmountQuota .

-- Uses AdventureWorks

SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,


RANK() OVER (PARTITION BY SalesTerritoryRegion ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq ON e.EmployeeKey = sq.EmployeeKey
INNER JOIN dbo.DimSalesTerritory AS st ON e.SalesTerritoryKey = st.SalesTerritoryKey
WHERE SalesPersonFlag = 1 AND SalesTerritoryRegion != N'NA'
GROUP BY LastName, SalesTerritoryRegion;

El conjunto de resultados es el siguiente.

LastName TotalSales SalesTerritoryGroup RankResult


---------------- ------------- ------------------- --------
Tsoflias 1687000.0000 Australia 1
Saraiva 7098000.0000 Canada 1
Vargas 4365000.0000 Canada 2
Carson 12198000.0000 Central 1
Varkey Chudukatil 5557000.0000 France 1
Valdez 2287000.0000 Germany 1
Blythe 11162000.0000 Northeast 1
Campbell 4025000.0000 Northwest 1
Ansman-Wolfe 3551000.0000 Northwest 2
Mensa-Annan 2753000.0000 Northwest 3
Reiter 8541000.0000 Southeast 1
Mitchell 11786000.0000 Southwest 1
Ito 7804000.0000 Southwest 2
Pak 10514000.0000 United Kingdom 1

Ver también
DENSE_RANK (Transact-SQL )
ROW_NUMBER (Transact-SQL )
NTILE (Transact-SQL )
Funciones de categoría (Transact-SQL )
Funciones integradas (Transact-SQL )
ROW_NUMBER (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Enumera los resultados de un conjunto de resultados. Concretamente, devuelve el número secuencial de una fila
dentro de una partición de un conjunto de resultados, empezando por 1 para la primera fila de cada partición.
ROW_NUMBER y RANK son similares. ROW_NUMBER enumera todas las filas secuencialmente (por ejemplo 1, 2, 3, 4, 5).
RANK proporciona el mismo valor numérico para valores equivalentes (por ejemplo 1, 2, 2, 4, 5).

NOTE
ROW_NUMBER es un valor temporal que se calcula cuando se ejecuta la consulta. Para conservar los números de una tabla,
vea Propiedad IDENTITY y SEQUENCE.

Convenciones de sintaxis de Transact-SQL

Sintaxis
ROW_NUMBER ( )
OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

Argumentos
PARTITION BY value_expression
Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función
ROW_NUMBER. value_expression especifica la columna a partir de la cual se particiona el conjunto de
resultados. Si no se especifica PARTITION BY , la función trata todas las filas del conjunto de resultados de la
consulta como un único grupo. Para más información, vea OVER Clause (Transact-SQL ) (OVER (cláusula de
Transact-SQL ).
order_by_clause
La cláusula ORDER BY determina la secuencia en la que se asigna a las filas el ROW_NUMBER único correspondiente
en una partición especificada. Es obligatorio. Para más información, vea Cláusula OVER (Transact-SQL ).

Tipos devueltos
bigint

Notas generales
No hay ninguna garantía de que las filas devueltas por una consulta con al usar ROW_NUMBER() se ordenen
exactamente igual con cada ejecución a menos que se cumplan estas condiciones:
1. Los valores de la columna de la partición sean únicos.
2. Los valores de las columnas ORDER BY sean únicos.
3. Las combinaciones de los valores de la columna de la partición y las columnas ORDER BY sean únicas.
ROW_NUMBER()sea no determinista. Para obtener más información, consulte Deterministic and
Nondeterministic Functions.

Ejemplos
A. Ejemplos sencillos
La siguiente consulta devuelve las cuatro tablas del sistema en orden alfabético.

SELECT
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5
ORDER BY name ASC;

El conjunto de resultados es el siguiente.

NAME RECOVERY_MODEL_DESC

maestra SIMPLE

model FULL

msdb SIMPLE

tempdb SIMPLE

Para agregar una columna de número de fila delante de cada fila, agregue una columna con la función
ROW_NUMBER , en este caso denominada Row# . Debe mover la cláusula ORDER BY hasta la cláusula OVER .

SELECT
ROW_NUMBER() OVER(ORDER BY name ASC) AS Row#,
name, recovery_model_desc
FROM sys.databases
WHERE database_id < 5;

El conjunto de resultados es el siguiente.

ROW# NAME RECOVERY_MODEL_DESC

1 maestra SIMPLE

2 model FULL

3 msdb SIMPLE

4 tempdb SIMPLE

Al agregar una cláusula PARTITION BY en la columna recovery_model_desc , se reiniciará la numeración cuando


cambie el valor recovery_model_desc .
SELECT
ROW_NUMBER() OVER(PARTITION BY recovery_model_desc ORDER BY name ASC)
AS Row#,
name, recovery_model_desc
FROM sys.databases WHERE database_id < 5;

El conjunto de resultados es el siguiente.

ROW# NAME RECOVERY_MODEL_DESC

1 model FULL

1 maestra SIMPLE

2 msdb SIMPLE

3 tempdb SIMPLE

B. Devolver el número de fila de vendedor


En el ejemplo siguiente se calcula un número de fila para los vendedores de Adventure Works Cycles según la
categoría de ventas anuales hasta la fecha.

USE AdventureWorks2012;
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,
FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD"
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

El conjunto de resultados es el siguiente.

Row FirstName LastName SalesYTD


--- ----------- ---------------------- -----------------
1 Linda Mitchell 4251368.54
2 Jae Pak 4116871.22
3 Michael Blythe 3763178.17
4 Jillian Carson 3189418.36
5 Ranjit Varkey Chudukatil 3121616.32
6 José Saraiva 2604540.71
7 Shu Ito 2458535.61
8 Tsvi Reiter 2315185.61
9 Rachel Valdez 1827066.71
10 Tete Mensa-Annan 1576562.19
11 David Campbell 1573012.93
12 Garrett Vargas 1453719.46
13 Lynn Tsoflias 1421810.92
14 Pamela Ansman-Wolfe 1352577.13

C. Devolver un subconjunto de filas


En el ejemplo siguiente se calculan los números de fila para todas las filas de la tabla SalesOrderHeader en el
orden de OrderDate y solo se devuelven las filas 50 a 60 inclusive.
USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
FROM Sales.SalesOrderHeader
)
SELECT SalesOrderID, OrderDate, RowNumber
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;

D. Usar ROW_NUMBER () con PARTITION


En el ejemplo siguiente se usa el argumento PARTITION BY para crear particiones del conjunto de resultados de
la consulta por la columna TerritoryName . La cláusula ORDER BY especificada en la cláusula OVER ordena las filas
de cada partición por la columna SalesYTD . La cláusula ORDER BY de la instrucción SELECT ordena todo el
conjunto de resultados de la consulta por TerritoryName .

USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1) AS SalesYTD,
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC)
AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;

El conjunto de resultados es el siguiente.

FirstName LastName TerritoryName SalesYTD Row


--------- -------------------- ------------------ ------------ ---
Lynn Tsoflias Australia 1421810.92 1
José Saraiva Canada 2604540.71 1
Garrett Vargas Canada 1453719.46 2
Jillian Carson Central 3189418.36 1
Ranjit Varkey Chudukatil France 3121616.32 1
Rachel Valdez Germany 1827066.71 1
Michael Blythe Northeast 3763178.17 1
Tete Mensa-Annan Northwest 1576562.19 1
David Campbell Northwest 1573012.93 2
Pamela Ansman-Wolfe Northwest 1352577.13 3
Tsvi Reiter Southeast 2315185.61 1
Linda Mitchell Southwest 4251368.54 1
Shu Ito Southwest 2458535.61 2
Jae Pak United Kingdom 4116871.22 1

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
E. Devolver el número de fila de vendedor
En este ejemplo se devuelve ROW_NUMBER para los representantes de ventas en función de su cuota de ventas
asignada.
-- Uses AdventureWorks

SELECT ROW_NUMBER() OVER(ORDER BY SUM(SalesAmountQuota) DESC)


AS RowNumber,
FirstName, LastName,
CONVERT(varchar(13), SUM(SalesAmountQuota),1) AS SalesQuota
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq
ON e.EmployeeKey = sq.EmployeeKey
WHERE e.SalesPersonFlag = 1
GROUP BY LastName, FirstName;

A continuación se muestra un conjunto parcial de resultados.

RowNumber FirstName LastName SalesQuota


--------- --------- ------------------ -------------
1 Jillian Carson 12,198,000.00
2 Linda Mitchell 11,786,000.00
3 Michael Blythe 11,162,000.00
4 Jae Pak 10,514,000.00

F. Usar ROW_NUMBER () con PARTITION


El ejemplo siguiente muestra cómo utilizar la función ROW_NUMBER con el argumento PARTITION BY . Esto provoca
que la función ROW_NUMBER enumere las filas de cada partición.

-- Uses AdventureWorks

SELECT ROW_NUMBER() OVER(PARTITION BY SalesTerritoryKey


ORDER BY SUM(SalesAmountQuota) DESC) AS RowNumber,
LastName, SalesTerritoryKey AS Territory,
CONVERT(varchar(13), SUM(SalesAmountQuota),1) AS SalesQuota
FROM dbo.DimEmployee AS e
INNER JOIN dbo.FactSalesQuota AS sq
ON e.EmployeeKey = sq.EmployeeKey
WHERE e.SalesPersonFlag = 1
GROUP BY LastName, FirstName, SalesTerritoryKey;

A continuación se muestra un conjunto parcial de resultados.

RowNumber LastName Territory SalesQuota


--------- ------------------ --------- -------------
1 Campbell 1 4,025,000.00
2 Ansman-Wolfe 1 3,551,000.00
3 Mensa-Annan 1 2,275,000.00
1 Blythe 2 11,162,000.00
1 Carson 3 12,198,000.00
1 Mitchell 4 11,786,000.00
2 Ito 4 7,804,000.00

Ver también
RANK (Transact-SQL )
DENSE_RANK (Transact-SQL )
NTILE (Transact-SQL )
Funciones de replicación -
PUBLISHINGSERVERNAME
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre del publicador que publica una base de datos que participa en una sesión de creación de
reflejo de la base de datos. Esta función se ejecuta en una instancia del publicador de SQL Server en la base de
datos de publicaciones. Utilícela para determinar el publicador original de la base de datos publicada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PUBLISHINGSERVERNAME()

Tipos devueltos
nvarchar

Notas
PUBLISHINGSERVERNAME se utiliza en todos los tipos de replicación.
PUBLISHINGSERVERNAME se utiliza cuando existe una sesión de creación de reflejo de la base de datos en la
base de datos de publicaciones entre el publicador y una instancia asociada reflejada.
Esta función debe ejecutarse dentro del contexto de una base de datos de publicaciones. Cuando
PUBLISHINGSERVERNAME se ejecuta en una base de datos de publicaciones en la instancia del servidor
reflejado de SQL Server, se obtiene el nombre de la instancia del publicador desde el que se publica la base de
datos. Cuando esta función se ejecuta en una base de datos en la instancia del servidor reflejado que no se ha
publicado o que se ha publicado desde la misma tras una conmutación por error, se obtiene el nombre de esta
instancia. Cuando esta función se ejecuta en la instancia del publicador original, se obtiene el nombre del
publicador.

Ver también
Replicación y creación de reflejo de la base de datos (SQL Server)
Funciones de replicación (Transact-SQL )
Funciones de conjuntos de filas (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones de conjunto de filas devuelven un objeto que se puede usar en instrucciones Transact-
SQL en lugar de una referencia de tabla.

OPENDATASOURCE OPENJSON

OPENROWSET OPENQUERY

OPENXML

Todas las funciones de conjuntos de filas son no deterministas. Por ello, estas funciones no siempre devuelven el
mismo resultado cada vez que se invocan, incluso con el mismo conjunto de valores de entrada. Para más
información sobre el determinismo de las funciones, vea Funciones deterministas y no deterministas.

Ver también
Funciones integradas (Transact-SQL )
OPENDATASOURCE (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de la versión 2008) Azure SQL Database (solo Instancia
Administrada) Azure SQL Data Warehouse Almacenamiento de datos paralelos
Proporciona información de conexión ad hoc como parte de un nombre de objeto de cuatro partes sin utilizar un
nombre de servidor vinculado.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los
cambios de comportamiento de T-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis
OPENDATASOURCE ( provider_name, init_string )

Argumentos
provider_name
Es el nombre registrado como PROGID del proveedor OLE DB utilizado para obtener acceso al origen de datos.
provider_name es un tipo de datos char que carece de valor predeterminado.
init_string
Es la cadena de conexión que se pasa a la interfaz IDataInitialize del proveedor de destino. La sintaxis de la cadena
del proveedor se basa en pares de palabra clave y valor separados por signos de punto y coma; por ejemplo:
'palabraClave1=* valor;palabraClave2= valor'*.
Para conocer los pares de palabra clave y valor admitidos, vea Microsoft Data Access SDK. En esta documentación
se define la sintaxis básica. En la siguiente tabla se muestran las palabras clave más utilizadas en el argumento
init_string.

PALABRA CLAVE PROPIEDAD OLE DB VALORES VÁLIDOS Y DESCRIPCIÓN

Origen de datos DBPROP_INIT_DATASOURCE Nombre del origen de datos al que se


va a conectar. Distintos proveedores lo
interpretan de formas distintas. Para un
proveedor OLE DB de SQL Native Client
SQL Server , indica el nombre del
servidor. Para un proveedor OLE DB
para Jet, indica la ruta de acceso
completa al archivo .mdb o al archivo
.xls.
PALABRA CLAVE PROPIEDAD OLE DB VALORES VÁLIDOS Y DESCRIPCIÓN

Ubicación DBPROP_INIT_LOCATION Ubicación de la base de datos a la que


se va a conectar.

Propiedades extendidas DBPROP_INIT_PROVIDERSTRING Cadena de conexión específica del


proveedor.

Tiempo de espera de conexión DBPROP_INIT_TIMEOUT Valor de tiempo de espera después del


cual se produce un error en el intento
de conexión.

Id. de usuario DBPROP_AUTH_USERID Id. de usuario que se va a utilizar para


la conexión.

Contraseña DBPROP_AUTH_PASSWORD Contraseña que se va a utilizar para la


conexión.

Catálogo DBPROP_INIT_CATALOG Nombre del catálogo inicial o


predeterminado al conectarse al origen
de datos.

Seguridad integrada DBPROP_AUTH_INTEGRATED SSPI, para especificar la autenticación de


Windows

Notas
OPENDATASOURCE se puede utilizar para tener acceso a datos remotos desde orígenes de datos de OLE DB
solo cuando la opción de Registro DisallowAdhocAccess está establecida explícitamente en 0 para el proveedor
especificado y la opción de configuración avanzada Ad Hoc Distributed Queries está habilitada. Cuando no se
establecen estas opciones, el comportamiento predeterminado no permite el acceso ad hoc.
Es posible utilizar la función OPENDATASOURCE en las mismas ubicaciones de la sintaxis Transact-SQL de un
nombre del servidor vinculado. Por tanto, se puede utilizar OPENDATASOURCE como la primera parte de un
nombre de cuatro partes que hace referencia a un nombre de tabla o vista en una instrucción SELECT, INSERT,
UPDATE o DELETE, o a un procedimiento almacenado remoto en una instrucción EXECUTE. Cuando se ejecutan
procedimientos almacenados remotos, OPENDATASOURCE debe hacer referencia a otra instancia de SQL
Server. OPENDATASOURCE no acepta variables como argumentos.
Al igual que la función OPENROWSET, OPENDATASOURCE solo debe hacer referencia a orígenes de datos OLE
DB a los que se tiene acceso con poca frecuencia. Defina un servidor vinculado para los orígenes de datos a los
que tiene acceso varias veces. Ni OPENDATASOURCE ni OPENROWSET proporcionan toda la funcionalidad de
definiciones de servidores vinculados, como la administración de seguridad y la capacidad de consultar
información de catálogos. Toda la información de conexión, incluidas las contraseñas, se debe proporcionar
siempre que se llama OPENDATASOURCE.

IMPORTANT
La autenticación de Windows es mucho más segura que la de SQL Server. Siempre que sea posible, debe utilizar la
Autenticación de Windows. OPENDATASOURCE no se debe utilizar con contraseñas explícitas en la cadena de conexión.

Los requisitos de conexión de cada proveedor son similares a los requisitos de esos parámetros cuando se crean
servidores vinculados. En el tema sp_addlinkedserver (Transact-SQL ) se incluye información detallada sobre
muchos proveedores comunes.
Las llamadas a OPENDATASOURCE, OPENQUERY u OPENROWSET en la cláusula FROM se evalúan por
separado y de forma independiente de otras llamadas a estas funciones utilizadas como destino de la
actualización, incluso si se han suministrado argumentos idénticos a las dos llamadas. En particular, las
condiciones de filtro o combinación aplicadas en el resultado de una de esas llamadas no tienen ningún efecto en
los resultados de la otra llamada.

Permisos
Todos los usuarios pueden ejecutar OPENDATASOURCE. Los permisos que se utilizan para conectarse al
servidor remoto se determinan a partir de la cadena de conexión.

Ejemplos
En el ejemplo siguiente se crea una conexión ad hoc a la instancia de Payroll de SQL Server en el servidor
London , y se consulta la tabla AdventureWorks2012.HumanResources.Employee . ( El uso de SQLNCLI y SQL Server
redirigirá a la última versión del proveedor OLE DB de SQL Server Native Client).

SELECT *
FROM OPENDATASOURCE('SQLNCLI',
'Data Source=London\Payroll;Integrated Security=SSPI')
.AdventureWorks2012.HumanResources.Employee

En el ejemplo siguiente se crea una conexión ad hoc a una hoja de cálculo de Excel en el formato 1997 - 2003.

SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',


'Data Source=C:\DataFolder\Documents\TestExcel.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] ;

Ver también
OPENROWSET (Transact-SQL )
sp_addlinkedserver (Transact-SQL )
OPENJSON (Transact-SQL)
17/07/2018 • 21 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
OPENJSON es una función con valores de tabla que analiza el texto JSON y devuelve objetos y propiedades de
la entrada JSON como filas y columnas. En otras palabras, OPENJSON proporciona una vista de conjunto de
filas de un documento JSON. Las columnas del conjunto de filas y las rutas de acceso de propiedades JSON que
se usan para rellenar las columnas se pueden especificar de forma explícita. Como OPENJSON devuelve un
conjunto de filas, se puede usar OPENJSON en la cláusula FROM de una instrucción Transact-SQL al igual que se
puede usar cualquier otra tabla, vista o función con valores de tabla.
Use OPENJSON para importar datos JSON a SQL Server o convertir datos JSON a formato relacional para una
aplicación o servicio que no pueda usar JSON directamente.

NOTE
La función OPENJSON solo está disponible en el nivel de compatibilidad 130 o superior. Si el nivel de compatibilidad de la
base de datos es inferior a 130, SQL Server no podrá encontrar ni ejecutar la función OPENJSON. Hay otras funciones JSON
que sí están disponibles en todos los niveles de compatibilidad.
Puede comprobar el nivel de compatibilidad en la vista sys.databases o en las propiedades de la base de datos. Se puede
cambiar el nivel de compatibilidad de una base de datos mediante el comando siguiente:
ALTER DATABASE DatabaseName SET COMPATIBILITY_LEVEL = 130

El nivel de compatibilidad 120 puede ser el valor predeterminado incluso en una base de datos nueva de Azure SQL
Database.

Convenciones de sintaxis de Transact-SQL

Sintaxis
OPENJSON( jsonExpression [ , path ] ) [ <with_clause> ]

<with_clause> ::= WITH ( { colName type [ column_path ] [ AS JSON ] } [ ,...n ] )

La función con valores de tabla OPENJSON analiza la expresiónJSON proporcionada como primer argumento y
devuelve una o varias filas que contienen datos de los objetos JSON en la expresión. expresiónJSON puede
contener objetos secundarios anidados. Si quiere analizar un subobjeto desde expresiónJSON, puede especificar
un parámetro path para el subobjeto JSON.
openjson

De forma predeterminada, la función con valores de tabla OPENJSON devuelve tres columnas, que contienen el
nombre de clave, el valor y el tipo de cada par de {clave: valor} que se encuentra en expresiónJSON. Como
alternativa, se puede especificar explícitamente el esquema del conjunto de resultados que OPENJSON devuelve
proporcionando cláusula_with.
cláusula_with

La cláusula_with contiene una lista de columnas con sus tipos que OPENJSON tiene que devolver. De forma
predeterminada, OPENJSON hace coincidir las claves en expresiónJSON con los nombres de columna en la
cláusula_with (en este caso, la coincidencia de claves implica que distingue mayúsculas de minúsculas). Si un
nombre de columna no coincide con un nombre de clave, se puede proporcionar una función opcional
column_path, que es una expresión de ruta de acceso JSON que hace referencia a una clave en la expresiónJSON.

Argumentos
expresiónJSON
Es una expresión de caracteres Unicode que contiene texto JSON.
OPENJSON recorre en iteración los elementos de la matriz o las propiedades del objeto en la expresión JSON y
devuelve una fila por cada elemento o propiedad. En el ejemplo siguiente se devuelve cada propiedad del objeto
proporcionado como expresiónJSON:

DECLARE @json NVARCHAR(4000) = N'{


"StringValue":"John",
"IntValue":45,
"TrueValue":true,
"FalseValue":false,
"NullValue":null,
"ArrayValue":["a","r","r","a","y"],
"ObjectValue":{"obj":"ect"}
}'

SELECT *
FROM OPENJSON(@json)

Resultado

KEY VALUE TIPO

StringValue John 1

IntValue 45 2

TrueValue true 3

FalseValue false 3

NullValue NULL 0

ArrayValue ["a","r","r","a","y"] 4

ObjectValue {"obj":"ect"} 5
path
Es una expresión de ruta de acceso JSON opcional que hace referencia a un objeto o una matriz dentro de
expresiónJSON. OPENJSON busca en el texto de JSON en la posición especificada y analiza solo el fragmento al
que se hace referencia. Para más información, vea Expresiones de ruta de acceso JSON (SQL Server).
En SQL Server 2017 (14.x) y en Base de datos SQL de Azure, puede proporcionar una variable como el valor de
path.
En el ejemplo siguiente se devuelve un objeto anidado especificando la path:

DECLARE @json NVARCHAR(4000) = N'{


"path": {
"to":{
"sub-object":["en-GB", "en-UK","de-AT","es-AR","sr-Cyrl"]
}
}
}';

SELECT [key], value


FROM OPENJSON(@json,'$.path.to."sub-object"')

Resultado

KEY VALOR

0 en-GB

1 en-UK

2 de-AT

3 es-AR

4 sr-Cyrl

Cuando OPENJSON analiza una matriz JSON, la función devuelve los índices de los elementos en el texto JSON
como claves.
La comparación que se usa para hacer coincidir los pasos de ruta de acceso con las propiedades de la expresión
JSON distingue mayúsculas de minúsculas, e ignora la intercalación (es decir, una comparación BIN2).
cláusula_with
Define explícitamente el esquema de salida que va a devolver la función OPENJSON. La cláusula_with opcional
puede contener los elementos siguientes:
colName es el nombre de la columna de salida.
De forma predeterminada, OPENJSON usa el nombre de la columna para que coincida con una propiedad en el
texto JSON. Por ejemplo, si especifica la columna nombre en el esquema, OPENJSON intenta rellenar esta
columna con la propiedad "nombre" en el texto JSON. Puede invalidar esta asignación predeterminada mediante
el argumento column_path.
Tipo
Es el tipo de datos para la columna de salida.
NOTE
Si también usa la opción AS JSON, el tipo de columna debe ser NVARCHAR(MAX) .

column_path
Es la ruta de acceso JSON que especifica la propiedad que se va a devolver en la columna especificada. Para
obtener más información, vea la descripción del parámetro path anteriormente en este tema.
Use ruta_de_columna para invalidar las reglas de asignación predeterminadas cuando el nombre de una columna
de salida no coincida con el nombre de la propiedad.
La comparación que se usa para hacer coincidir los pasos de ruta de acceso con las propiedades de la expresión
JSON distingue mayúsculas de minúsculas e ignora la intercalación (es decir, una comparación BIN2).
Para obtener más información sobre las rutas de acceso, vea Expresiones de ruta de acceso JSON (SQL Server).
AS JSON
Use la opción AS JSON en una definición de columna para especificar que la propiedad a la que se hace
referencia contiene un objeto JSON interno o una matriz. Si se especifica la opción AS JSON, el tipo de la
columna debe ser NVARCHAR (MAX).
Si no se especifica AS JSON para una columna, la función devuelve un valor escalar (por ejemplo, int,
string, true, false) de la propiedad JSON especificada en la ruta de acceso especificada. Si la ruta de acceso
representa un objeto o una matriz, y no se puede encontrar la propiedad en la ruta de acceso especificada,
la función devuelve NULL en modo lax o devuelve un error en modo strict. Este comportamiento es similar
al de la función JSON_VALUE.
Si se especifica AS JSON para una columna, la función devuelve un fragmento de JSON de la propiedad
JSON especificada en la ruta de acceso especificada. Si la ruta de acceso representa un valor escalar y no se
puede encontrar la propiedad en la ruta de acceso especificada, la función devuelve NULL en modo lax o
devuelve un error en modo strict. Este comportamiento es similar al de la función JSON_QUERY.

NOTE
Si quiere devolver un fragmento de JSON anidado de una propiedad JSON, tendrá que proporcionar la marca AS JSON. Sin
esta opción, si no se puede encontrar la propiedad, OPENJSON devuelve un valor NULL en lugar de la matriz o el objeto
JSON al que se hace referencia, o bien devuelve un error en tiempo de ejecución en modo strict.

Por ejemplo, en la consulta siguiente se devuelve y se da formato a los elementos de una matriz:
DECLARE @json NVARCHAR(MAX) = N'[
{
"Order": {
"Number":"SO43659",
"Date":"2011-05-31T00:00:00"
},
"AccountNumber":"AW29825",
"Item": {
"Price":2024.9940,
"Quantity":1
}
},
{
"Order": {
"Number":"SO43661",
"Date":"2011-06-01T00:00:00"
},
"AccountNumber":"AW73565",
"Item": {
"Price":2024.9940,
"Quantity":3
}
}
]'

SELECT *
FROM OPENJSON ( @json )
WITH (
Number varchar(200) '$.Order.Number',
Date datetime '$.Order.Date',
Customer varchar(200) '$.AccountNumber',
Quantity int '$.Item.Quantity',
[Order] nvarchar(MAX) AS JSON
)

Resultado

NUMBER DATE CUSTOMER CANTIDAD PEDIDO DE

SO43659 2011-05- AW29825 1 {"Number":"SO43659"


31T00:00:00 ,"Date":"2011-05-
31T00:00:00"}

SO43661 2011-06- AW73565 3 {"Number":"SO43661"


01T00:00:00 ,"Date":"2011-06-
01T00:00:00"}

Valor devuelto
Las columnas que devuelve la función OPENJSON dependen de la opción WITH.
1. Cuando se llama a OPENJSON con el esquema predeterminado, es decir, cuando no se especifica un
esquema explícito en la cláusula WITH, la función devuelve una tabla con las columnas siguientes:
a. Clave. Un valor nvarchar(4000) que contiene el nombre de la propiedad especificada o el índice del
elemento en la matriz especificada. La columna de clave tiene una intercalación BIN2.
b. Valor. Un valor nvarchar(max) que contiene el valor de la propiedad. La columna Valor hereda la
intercalación de expresiónJSON.
c. Tipo. Un valor int que contiene el tipo del valor. La columna Tipo solo se devuelve cuando se usa
OPENJSON con el esquema predeterminado. La columna Tipo tiene uno de los valores siguientes:
VALOR DE LA COLUMNA TIPO TIPO DE DATOS JSON

0 null

1 string

2 INT

3 true/false

4 array

5 objeto

Solo se devuelven las propiedades de primer nivel. Se produce un error en la instrucción si el texto
JSON no tiene el formato correcto.
2. Cuando se llama a OPENJSON y se especifica un esquema explícito en la cláusula WITH, la función
devuelve una tabla con el esquema que se haya definido en la cláusula WITH.

Notas
La json_path que se usa en el segundo argumento de OPENJSON o en la cláusula_with puede comenzar con la
palabra clave lax o strict.
En modo lax, OPENJSON no genera un error si no se encuentra el objeto o el valor en la ruta de acceso
especificada. Si no se puede encontrar la ruta de acceso, OPENJSON devuelve un conjunto de resultados
vacío o un valor NULL.
En modo strict, OPENJSON devuelve un error si no se encuentra la ruta de acceso.
En algunos de los ejemplos de esta página se especifica explícitamente el modo de ruta de acceso, lax o strict. El
modo de ruta de acceso es opcional. Si no especifica explícitamente un modo de ruta de acceso, el modo lax es el
valor predeterminado. Para más información sobre las expresiones de modo de ruta de acceso y de ruta de acceso,
vea Expresiones de ruta de acceso JSON (SQL Server).
Los nombres de columna en la cláusula_with se hacen coincidir con las claves en el texto JSON. Si se especifica el
nombre de columna [Address.Country] , se compara con la clave Address.Country . Si quiere hacer referencia a
una clave anidada Country dentro del objeto Address , tendrá que especificar la ruta de acceso $.Address.Country
en la ruta de acceso de columna.
json_path puede contener claves con caracteres alfanuméricos. Use comillas dobles como caracteres de escape
para el nombre de clave en json_path si hay caracteres especiales en las claves. Por ejemplo,
$."my key $1".regularKey."key with . dot" coincide con el valor 1 en el siguiente texto JSON:

{
"my key $1": {
"regularKey":{
"key with . dot": 1
}
}
}

Ejemplos
Ejemplo 1: conversión de una matriz JSON en una tabla temporal
En el ejemplo siguiente se proporciona una lista de identificadores como una matriz JSON de números. La
consulta convierte la matriz JSON en una tabla de identificadores y filtra todos los productos con los
identificadores especificados.

DECLARE @pSearchOptions NVARCHAR(4000) = N'[1,2,3,4]'

SELECT *
FROM products
INNER JOIN OPENJSON(@pSearchOptions) AS productTypes
ON product.productTypeID = productTypes.value

Esta consulta equivale al ejemplo siguiente. Pero en el ejemplo siguiente, se deben insertar números en la consulta
en lugar de pasarlos como parámetros.

SELECT *
FROM products
WHERE product.productTypeID IN (1,2,3,4)

Ejemplo 2: combinación de propiedades de dos objetos JSON


En el ejemplo siguiente se selecciona una unión de todas las propiedades de dos objetos JSON. Los dos objetos
tienen una propiedad nombre duplicada. En el ejemplo se usa el valor de clave para excluir la fila duplicada de los
resultados.

DECLARE @json1 NVARCHAR(MAX),@json2 NVARCHAR(MAX)

SET @json1=N'{"name": "John", "surname":"Doe"}'

SET @json2=N'{"name": "John", "age":45}'

SELECT *
FROM OPENJSON(@json1)
UNION ALL
SELECT *
FROM OPENJSON(@json2)
WHERE [key] NOT IN (SELECT [key] FROM OPENJSON(@json1))

Ejemplo 3: combinación de filas con datos JSON almacenados en celdas de tabla con CROSS APPLY
En el ejemplo siguiente, la tabla SalesOrderHeader tiene una columna de texto SalesReason que contiene una
matriz de SalesOrderReasons en formato JSON. Los objetos SalesOrderReasons contienen propiedades como
Calidad y Fabricante. En el ejemplo se crea un informe que combina todas las filas de pedido de ventas y las
razones de ventas relacionadas. El operador OPENJSON expande la matriz JSON de razones de venta como si las
razones se almacenaran en una tabla secundaria independiente. Después, el operador CROSS APPLY combina
cada fila de pedido de ventas con las filas devueltas por la función con valores de tabla OPENJSON.

SELECT SalesOrderID,OrderDate,value AS Reason


FROM Sales.SalesOrderHeader
CROSS APPLY OPENJSON(SalesReasons)

TIP
Cuando es necesario expandir matrices JSON almacenadas en campos individuales y combinarlas con sus filas primarias,
normalmente se usa el operador CROSS APPLY de Transact-SQL. Para obtener más información sobre CROSS APPLY, vea
FROM (Transact-SQL).
Se puede rescribir la misma consulta mediante OPENJSON con un esquema definido explícitamente de las filas que
se van a devolver:

SELECT SalesOrderID, OrderDate, value AS Reason


FROM Sales.SalesOrderHeader
CROSS APPLY OPENJSON (SalesReasons) WITH (value nvarchar(100) '$')

En este ejemplo, la ruta de acceso $ hace referencia a cada elemento de la matriz. Si quiere convertir
explícitamente el valor devuelto, puede usar este tipo de consulta.
Ejemplo 4: combinación de filas relacionales y elementos de JSON con CROSS APPLY
En la consulta siguiente se combinan filas relacionales y elementos de JSON en los resultados mostrados en la
tabla siguiente.

SELECT store.title, location.street, location.lat, location.long


FROM store
CROSS APPLY OPENJSON(store.jsonCol, 'lax $.location')
WITH (street varchar(500) , postcode varchar(500) '$.postcode' ,
lon int '$.geo.longitude', lat int '$.geo.latitude')
AS location

Resultado

TITLE STREET POSTCODE LON LAT

Whole Food Markets 17991 Redmond Way WA 98052 47.666124 -122.10155

Sears 148th Ave NE WA 98052 47.63024 -122.141246,17

Paso 5: importación de datos JSON a tablas de SQL Server


En el ejemplo siguiente se carga un objeto JSON completo en una tabla de SQL Server .

DECLARE @json NVARCHAR(max) = N'{


"id" : 2,
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"dateOfBirth": "2015-03-25T12:00:00",
"spouse": null
}';

INSERT INTO Person


SELECT *
FROM OPENJSON(@json)
WITH (id int,
firstName nvarchar(50), lastName nvarchar(50),
isAlive bit, age int,
dateOfBirth datetime2, spouse nvarchar(50))

Ver también
Expresiones de ruta de acceso JSON (SQL Server)
Convert JSON Data to Rows and Columns with OPENJSON (SQL Server) [Convertir datos JSON en filas y
columnas con OPENJSON (SQL Server)]
Uso de OPENJSON con el esquema predeterminado (SQL Server)
Uso de OPENJSON con un esquema explícito (SQL Server)
OPENQUERY (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Ejecuta la consulta de paso a través especificada en el servidor vinculado especificado. Este servidor es un origen
de datos OLE DB. Se puede hacer referencia a OPENQUERY en la cláusula FROM de una consulta como si fuera
un nombre de tabla. También se puede hacer referencia a OPENQUERY como la tabla de destino de una
instrucción INSERT, UPDATE, DELETE o TRUNCATE. Esto está sujeto a las capacidades del proveedor OLE DB.
Aunque la consulta puede devolver varios conjuntos de resultados, OPENQUERY solo devuelve el primero.
Convenciones de sintaxis de Transact-SQL

Sintaxis
OPENQUERY ( linked_server ,'query' )

Argumentos
linked_server
Es un identificador que representa el nombre del servidor vinculado.
' query '
Es la cadena de consulta que se ejecuta en el servidor vinculado. La longitud máxima de la cadena es de 8 KB.

Notas
OPENQUERY no acepta variables para sus argumentos.
No se puede utilizar OPENQUERY para ejecutar procedimientos almacenados extendidos en un servidor
vinculado. Sin embargo, se puede ejecutar un procedimiento almacenado extendido en un servidor vinculado
mediante un nombre de cuatro partes. Por ejemplo:

EXEC SeattleSales.master.dbo.xp_msver

Las llamadas a OPENDATASOURCE, OPENQUERY u OPENROWSET en la cláusula FROM se evalúan por


separado y de forma independiente de otras llamadas a estas funciones utilizadas como destino de la
actualización, incluso si se han suministrado argumentos idénticos a las dos llamadas. En particular, las
condiciones de filtro o combinación aplicadas en el resultado de una de esas llamadas no tienen ningún efecto en
los resultados de la otra llamada.

Permisos
Cualquier usuario puede ejecutar OPENQUERY. Los permisos utilizados para conectarse al servidor remoto se
obtienen de la configuración definida para el servidor vinculado.

Ejemplos
A. Ejecutar una consulta UPDATE de paso a través
En el ejemplo siguiente se usa una consulta UPDATE de paso a través en el servidor vinculado creado en el ejemplo
A.

UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101')


SET name = 'ADifferentName';

B. Ejecutar una consulta INSERT de paso a través


En el ejemplo siguiente se usa una consulta INSERT de paso a través en el servidor vinculado creado en el ejemplo
A.

INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles')


VALUES ('NewTitle');

C. Ejecutar una consulta DELETE de paso a través


En el ejemplo siguiente se usa una consulta DELETE de paso a través para eliminar la columna insertada en el
ejemplo C.

DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');

D. Ejecutar una consulta SELECT de paso a través


En este ejemplo se usa una consulta SELECT de paso a través para eliminar la columna insertada en el ejemplo C.

SELECT * FROM OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');

Ver también
DELETE (Transact-SQL )
FROM (Transact-SQL )
INSERT (Transact-SQL )
OPENDATASOURCE (Transact-SQL )
OPENROWSET (Transact-SQL )
Rowset Functions (Transact-SQL )
SELECT (Transact-SQL )
sp_addlinkedserver (Transact-SQL )
sp_serveroption (Transact-SQL )
UPDATE (Transact-SQL )
WHERE (Transact-SQL )
OPENROWSET (Transact-SQL)
18/07/2018 • 37 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de la versión 2008) Azure SQL Database (solo
Instancia Administrada) Azure SQL Data Warehouse Almacenamiento de datos paralelos
Contiene toda la información de conexión necesaria para tener acceso a datos remotos desde un origen de datos
OLE DB. Es un método alternativo para tener acceso a las tablas de un servidor vinculado y, al mismo tiempo, es
un método ad hoc para conectarse y tener acceso a datos remotos utilizando OLE DB. Para obtener referencias
más frecuentes a orígenes de datos OLE DB, use, en su lugar, servidores vinculados. Para obtener más
información, vea Servidores vinculados (motor de base de datos). Se puede hacer referencia a la función
OPENROWSET en la cláusula FROM de una consulta como si fuera un nombre de tabla. También se puede hacer
referencia a la función OPENROWSET como la tabla de destino de una instrucción INSERT , UPDATE o DELETE , según
cuál sea la funcionalidad del proveedor OLE DB. Aunque la consulta puede devolver varios conjuntos de
resultados, OPENROWSET solo devuelve el primero.
OPENROWSET también admite operaciones masivas a través de un proveedor integrado BULK que permite que los
datos se lean y se devuelvan como un conjunto de filas.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los
cambios de comportamiento de T-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis
OPENROWSET
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog. ] [ schema. ] object
| 'query'
}
| BULK 'data_file' ,
{ FORMATFILE = 'format_file_path' [ <bulk_options> ]
| SINGLE_BLOB | SINGLE_CLOB | SINGLE_NCLOB }
} )

<bulk_options> ::=
[ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ , DATASOURCE = 'data_source_name' ]
[ , ERRORFILE = 'file_name' ]
[ , ERRORFILE_DATASOURCE = 'data_source_name' ]
[ , FIRSTROW = first_row ]
[ , LASTROW = last_row ]
[ , MAXERRORS = maximum_errors ]
[ , ROWS_PER_BATCH = rows_per_batch ]
[ , ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) [ UNIQUE ] ]

-- bulk_options related to input file format


[ , FORMAT = 'CSV' ]
[ , FIELDQUOTE = 'quote_characters']
[ , FORMATFILE = 'format_file_path' ]

Argumentos
'provider_name'
Es una cadena de caracteres que representa el nombre descriptivo (o PROGID ) del proveedor OLE DB según se
especifica en el Registro. provider_name no tiene valor predeterminado.
'datasource'
Es una constante de cadena que corresponde a un origen de datos OLE DB determinado. datasource es la
propiedad DBPROP_INIT_DATASOURCE que se pasará a la interfaz IDBProperties del proveedor para
inicializarlo. Normalmente, esta cadena incluye el nombre del archivo de la base de datos, el nombre del servidor
de bases de datos o un nombre comprensible para que el proveedor encuentre las bases de datos.
'user_id'
Es una constante de cadena que contiene el nombre de usuario que se pasa al proveedor OLE DB especificado.
user_id indica el contexto de seguridad para la conexión y se pasa como la propiedad DBPROP_AUTH_USERID
para inicializar el proveedor. user_id no puede ser un nombre de inicio de sesión de Microsoft Windows.
'password'
Es una constante de cadena que contiene la contraseña de usuario que se debe pasar al proveedor OLE DB.
password se pasa como la propiedad DBPROP_AUTH_PASSWORD cuando el proveedor se inicializa. password
no puede ser una contraseña de Microsoft Windows.
'provider_string'
Es una cadena de conexión específica del proveedor que se pasa como la propiedad
DBPROP_INIT_PROVIDERSTRING para inicializar el proveedor OLE DB. Normalmente, provider_string
encapsula toda la información de conexión necesaria para inicializar el proveedor. Para obtener una lista de
palabras clave que el proveedor OLE DB de SQL Server Native Client pueda reconocer, vea Initialization and
Authorization Properties (Propiedades de inicialización y autorización).
catalog
Es el nombre del catálogo o de la base de datos donde reside el objeto especificado.
schema
Es el nombre del esquema o propietario del objeto para el objeto especificado.
object
Es el nombre del objeto que identifica unívocamente el objeto con el que se va a trabajar.
'query'
Es una constante de cadena que se envía al proveedor, quien la ejecuta. La instancia local de SQL Server no
procesa esta consulta, pero sí que procesa los resultados de la consulta devuelta por el proveedor (una consulta
de paso a través). Las consultas de paso a través resultan útiles cuando se utilizan en proveedores que no
muestran sus datos tabulares a través de nombres de tablas, sino solamente a través de un lenguaje de
comandos. El servidor remoto admite las consultas de paso a través siempre y cuando el proveedor de consultas
admita el objeto Command de OLE DB y sus interfaces obligatorias. Para más información, vea Referencia de
SQL Server Native Client (OLE DB ).
BULK
Utiliza el proveedor de conjuntos de filas BULK para que OPENROWSET lea datos de un archivo. En SQL Server,
OPENROWSET puede leer datos de un archivo sin necesidad de cargarlos en una tabla de destino. Esto le
permite utilizar OPENROWSET con una instrucción SELECT simple.
Los argumentos de la opción BULK le permiten elegir dónde empezar y acabar la lectura de datos, cómo abordar
los errores y cómo interpretar los datos. Por ejemplo, puede especificar que el archivo de datos se lea como un
conjunto de filas de una sola fila y una sola columna de tipo varbinary, varchar o nvarchar. El comportamiento
predeterminado se describe en las descripciones de los argumentos que se muestran a continuación.
Para obtener información acerca del uso de la opción BULK, vea la sección "Comentarios" más adelante en este
tema. Para obtener información acerca de los permisos que necesita la opción BULK, vea la sección "Permisos",
más adelante en este tema.

NOTE
Cuando se utiliza para importar datos con el modelo de recuperación completa, OPENROWSET (BULK ...) no optimiza el
registro.

Para más información sobre cómo preparar datos para importaciones masivas, vea Preparar los datos para
exportar o importar de forma masiva (SQL Server).
'data_file'
Es la ruta de acceso completa del archivo de datos cuyos datos se copian en la tabla de destino.
Se aplica a: SQL Server 2017 (14.x) CTP 1.1.
A partir de SQL Server 2017 (14.x) CTP 1.1, data_file puede estar en Azure Blob Storage. Para ver ejemplos, vea
Ejemplos de acceso masivo a datos en Azure Blob Storage.
<bulk_options>
Especifica uno o más argumentos para la opción BULK.
CODEPAGE = { 'ACP'| 'OEM'| 'RAW'| 'code_page' }
Especifica la página de códigos de los datos incluidos en el archivo de datos. CODEPAGE solo es pertinente si los
datos contienen columnas de tipo char, varchar o text con valores de caracteres mayores que 127 o menores
que 32.

IMPORTANT
CODEPAGE no es una opción admitida en Linux.
NOTE
Se recomienda especificar un nombre de intercalación para cada columna en un archivo de formato, excepto cuando quiera
que la opción 65001 tenga prioridad sobre la especificación de la página de códigos o la intercalación.

VALOR DE CODEPAGE DESCRIPCIÓN

ACP Convierte columnas de los tipos de datos char, varchar o


text de la página de códigos ANSI/ Microsoft Windows (ISO
1252) a la página de códigos de SQL Server.

OEM (valor predeterminado) Convierte columnas de los tipos de datos char, varchar o
text de la página de códigos OEM del sistema a la página de
códigos de SQL Server.

RAW No se realiza ninguna conversión entre páginas de códigos.


Ésta es la opción más rápida.

code_page Indica la página de códigos original en la que se codifican los


datos de caracteres incluidos en el archivo de datos; por
ejemplo, 850.

** Importante *\* Las versiones anteriores a SQL Server


2016 (13.x) no admiten la página de códigos 65001
(codificación UTF-8).

ERRORFILE ='file_name'
Especifica el archivo utilizado para recopilar filas que tienen errores de formato y no pueden convertirse en un
conjunto de filas OLE DB. Estas filas se copian en este archivo de errores desde el archivo de datos "tal cual".
El archivo de errores se crea cuando se inicia la ejecución del comando. Se producirá un error si el archivo ya
existe. Además, se crea un archivo de control con la extensión .ERROR.txt. Este archivo hace referencia a cada una
de las filas del archivo de errores y proporciona diagnósticos de errores. Tras corregir los errores, pueden cargarse
los datos.
Se aplica a: SQL Server 2017 (14.x) CTP 1.1. A partir de SQL Server 2017 (14.x), error_file_path puede estar
en Azure Blob Storage.
'errorfile_data_source_name'
Se aplica a: SQL Server 2017 (14.x) CTP 1.1. Es un origen de datos externo con nombre que apunta a la
ubicación de Azure Blob Storage del archivo de error que contendrá los errores encontrados durante la
importación. El origen de datos externo se debe crear con la opción TYPE = BLOB_STORAGE que se ha incluido en
SQL Server 2017 (14.x) CTP 1.1. Para más información, vea CREATE EXTERNAL DATA SOURCE.
FIRSTROW =first_row
Especifica el número de la primera fila que se va a cargar. El valor predeterminado es 1. Indica la primera fila del
archivo de datos especificado. Los números de fila vienen determinados por el recuento de terminadores de fila.
FIRSTROW está en base 1.
L ASTROW =last_row
Especifica el número de la última fila que va a cargarse. El valor predeterminado es 0. Indica la última fila del
archivo de datos especificado.
MAXERRORS =maximum_errors
Especifica el número máximo de errores de sintaxis o filas no compatibles, tal y como se define en el archivo de
formato, que pueden tener lugar antes de que OPENROWSET produzca una excepción. Hasta que se alcance el
valor de MAXERRORS, OPENROWSET omite todas las filas erróneas, sin cargarlas, y cuenta cada fila errónea
como un error.
El valor predeterminado de maximum_errors es 10.

NOTE
MAX_ERRORS no se aplica en las restricciones CHECK o para convertir tipos de datos money y bigint.

ROWS_PER_BATCH =rows_per_batch
Especifica el número aproximado de filas de datos del archivo de datos. Este valor debe ser del mismo tipo que el
número de filas real.
OPENROWSET siempre importa un archivo de datos como un solo lote. Con todo, si especifica rows_per_batch
con un valor > 0, el procesador de consulta usará el valor de rows_per_batch como sugerencia para asignar
recursos en el plan de consulta.
De forma predeterminada, el valor de ROWS_PER_BATCH es desconocido. Especificar ROWS_PER_BATCH = 0
es lo mismo que omitir ROWS_PER_BATCH.
ORDER ( { column [ ASC | DESC ] } [ ,... n ] [ UNIQUE ] )
Sugerencia opcional que especifica la forma en que están ordenados los datos en el archivo. De forma
predeterminada, la operación masiva presupone que los datos del archivo no están ordenados. El rendimiento
podría mejorar si el optimizador de consultas puede aprovechar el orden especificado para generar un plan de
consulta más eficaz. A continuación se citan algunos ejemplos en los que especificar una ordenación puede ser
beneficioso:
La inserción de filas en una tabla que tiene un índice clúster, donde los datos del conjunto de filas están
ordenados en la clave del índice clúster.
La combinación del conjunto de filas con otra tabla, donde las columnas de ordenación y combinación
coinciden.
La agregación de los datos del conjunto de filas por las columnas de ordenación.
El uso del conjunto de filas como una tabla de origen en la cláusula FROM de una consulta, donde las
columnas de ordenación y combinación coinciden.
UNIQUE especifica que el archivo de datos no tiene entradas duplicadas.
Si las filas del archivo de datos no están ordenadas según el orden especificado, o si se ha especificado la
sugerencia UNIQUE y hay claves duplicadas, se devuelve un error.
Se requieren alias de columna cuando se utiliza ORDER. La lista de alias de columna debe hacer referencia
a la tabla derivada a la que la cláusula BULK está obteniendo acceso. Los nombres de columna que se
especifican en la cláusula ORDER hacen referencia a esta lista de alias de columna. No se pueden
especificar columnas con tipos de valor grande (varchar(max), nvarchar(max), varbinary(max) y xml)
ni con tipos de objeto grande (text, ntext e image).
SINGLE_BLOB
Devuelve el contenido de data_file como un conjunto de filas de una sola columna y una sola fila de tipo
varbinary(max).

IMPORTANT
Recomendamos que importe los datos XML solo mediante la opción SINGLE_BLOB, en vez de SINGLE_CLOB y
SINGLE_NCLOB, ya que solo SINGLE_BLOB admite todas las conversiones de codificación de Windows.
SINGLE_CLOB
Al leer data_file como ASCII, el contenido se devuelve como un conjunto de filas de tipo varchar(max) de una
sola fila y una sola columna, por medio de la intercalación de la base de datos actual.
SINGLE_NCLOB
Al leer data_file como UNICODE, el contenido se devuelve como un conjunto de filas de tipo nvarchar(max) de
una sola fila y una sola columna, por medio de la intercalación de la base de datos actual.
Opciones de formato de los archivos de entrada
FORMAT = 'CSV'
Se aplica a: SQL Server 2017 (14.x) CTP 1.1.
Especifica un archivo de valores separados por comas conforme a la norma RFC 4180.
FORMATFILE ='format_file_path'
Especifica la ruta de acceso completa de un archivo de formato. SQL Server admite dos tipos de archivos de
formato: XML y no XML.
Es necesario usar un archivo de formato para definir los tipos de columna del conjunto de resultados. La única
excepción es cuando se especifica SINGLE_CLOB, SINGLE_BLOB o SINGLE_NCLOB; en este caso, no es
necesario usar el archivo de formato.
Para más información sobre los formatos de archivo, vea Usar un archivo de formato para importar datos de
forma masiva (SQL Server).
Se aplica a: SQL Server 2017 (14.x) CTP 1.1.
A partir de SQL Server 2017 (14.x) CTP 1.1, format_file_path puede estar en Azure Blob Storage. Para ver
ejemplos, vea Ejemplos de acceso masivo a datos en Azure Blob Storage.
FIELDQUOTE = 'field_quote'
Se aplica a: SQL Server 2017 (14.x) CTP 1.1.
Especifica un carácter que se usará como carácter de comillas en el archivo CSV. Si no se especifica, se usará el
carácter de comillas (") como carácter de comillas, según define la norma RFC 4180.

Notas
OPENROWSET se puede usar para tener acceso a datos remotos desde orígenes de datos de OLE DB solo cuando la
opción de Registro DisallowAdhocAccess está establecida explícitamente en 0 para el proveedor especificado y
la opción de configuración avanzada Ad Hoc Distributed Queries está habilitada. Cuando no se establecen estas
opciones, el comportamiento predeterminado no permite el acceso ad hoc.
Al tener acceso remoto a orígenes de datos OLE DB, la identidad de inicio de sesión de las conexiones de
confianza no se delegan automáticamente del servidor en el que el cliente se conecta al servidor que se consulta.
Debe configurarse la delegación de autenticación.
Los nombres de catálogo y esquema son necesarios si el proveedor OLE DB admite varios catálogos y esquemas
en el origen de datos especificado. Los valores de catalog y schema se pueden omitir si el proveedor OLE DB no
los admite. Si el proveedor solamente admite nombres de esquema, se debe especificar un nombre de dos partes
con el formato esquema ***.** objeto. Si el proveedor solamente admite nombres de catálogo, se debe especificar
un nombre de tres partes con el formato catálogo ***.** esquema . objeto. Es necesario especificar nombres de
tres partes para las consultas de paso a través que usen el proveedor OLE DB de SQL Server Native Client. Para
más información, vea Convenciones de sintaxis de Transact-SQL (Transact-SQL ).
OPENROWSET no acepta variables para sus argumentos.
Las llamadas a OPENDATASOURCE , OPENQUERY o OPENROWSET en la cláusula FROM se evalúan por separado y de
forma independiente de otras llamadas a estas funciones usadas como destino de la actualización, incluso si se
han suministrado argumentos idénticos a las dos llamadas. En particular, las condiciones de filtro o combinación
aplicadas en el resultado de una de esas llamadas no tienen ningún efecto en los resultados de la otra llamada.

Utilizar OPENROWSET con la opción BULK


Las siguientes mejoras de Transact-SQL admiten la función OPENROWSET(BULK…):
Las cláusulas FROM que se usan con SELECT pueden llamar a OPENROWSET(BULK...) en lugar de indicar un
nombre de tabla, con toda la funcionalidad de SELECT .
OPENROWSET con la opción BULK requiere un nombre de correlación en la cláusula FROM , que también
recibe el nombre de alias o variable de intervalo. Pueden especificarse alias de columna. Si no se especifica
una lista de alias de columna, el archivo de formato debe incluir nombres de columna. Al especificar alias
de columnas se anulan los nombres de columnas en el archivo de formato:
FROM OPENROWSET(BULK...) AS table_alias

FROM OPENROWSET(BULK...) AS table_alias(column_alias,...n)

IMPORTANT
Si AS <table_alias> no se puede agregar, se producirá el error:
Mensaje 491, Nivel 16, Estado 1, Línea 20
Debe especificarse un nombre de correlación para el conjunto de filas masivo en la cláusula FROM.

Una instrucción SELECT...FROM OPENROWSET(BULK...) consulta los datos directamente en el archivo, sin
importar los datos a una tabla. Las instrucciones SELECT…FROM OPENROWSET(BULK...) también pueden
mostrar los alias de las columnas masivas usando un archivo de formato para especificar los nombres de
las columnas y también los tipos de datos.
Usar OPENROWSET(BULK...) como tabla de origen en una instrucción INSERT o MERGE permite realizar una
importación masiva desde un archivo de datos a una tabla de SQL Server. Para más información, vea
Importación en bloque de datos mediante las instrucciones BULK INSERT u OPENROWSET(BULK...)
(SQL Server).
Cuando se usa la opción OPENROWSET BULK BULK con una instrucción INSERT , la cláusula BULK admite
sugerencias de tabla. Además de las sugerencias de tabla normales, como TABLOCK , la cláusula BULK
puede aceptar las sugerencias de tablas especializadas siguientes: IGNORE_CONSTRAINTS (solo pasa por alto
las restricciones CHECK y FOREIGN KEY ), IGNORE_TRIGGERS , KEEPDEFAULTS y KEEPIDENTITY . Para obtener más
información, vea Sugerencias de tabla (Transact-SQL ).
Para más información sobre cómo usar las instrucciones INSERT...SELECT * FROM OPENROWSET(BULK...) , vea
Importar y exportar datos de forma masiva (SQL Server). Para obtener más información sobre cuándo se
incluyen en el registro de transacciones las operaciones de inserción de filas que se efectúan durante una
importación en bloque, vea Requisitos previos para el registro mínimo durante la importación en bloque.

NOTE
Cuando use OPENROWSET , es importante que entienda el modo en el que SQL Server controla la suplantación. Para más
información sobre las consideraciones de seguridad, vea Importación en bloque de datos mediante las instrucciones BULK
INSERT u OPENROWSET(BULK...) (SQL Server).

Importar de forma masiva datos SQLCHAR, SQLNCHAR o SQLBINARY


OPENROWSET(BULK...) presupone que, si no se especifica, la longitud máxima de los datos SQLCHAR,
SQLNCHAR o SQLBINARY no supera los 8000 bytes. Si los datos importados están en un campo de datos LOB
que incluye cualquier objeto varchar(max), nvarchar(max) o varbinary(max) que supera los 8000 bytes, debe
usar un archivo de formato XML que defina la longitud máxima para el campo de datos. Para especificar la
longitud máxima, edite el archivo de formato y declare el atributo MAX_LENGTH.

NOTE
Un archivo de formato generado automáticamente no especifica la longitud o la longitud máxima de un campo LOB. Sin
embargo, es posible editar un archivo de formato y especificar la longitud o la longitud máxima manualmente.

Exportación o importación masiva de documentos SQLXML


Para importar o exportar de forma masiva datos SQLXML, utilice uno de los tipos de datos siguientes en el
archivo de formato.

TIPO DE DATOS EFECTO

SQLCHAR o SQLVARYCHAR Los datos se envían a la página de códigos del cliente o a la


página de códigos implícita por la intercalación.

SQLNCHAR o SQLNVARCHAR Los datos se envían como datos Unicode.

SQLBINARY o SQLVARYBIN Los datos se envían sin realizar ninguna conversión.

Permisos
Los permisos de OPENROWSET vienen determinados por los permisos del nombre de usuario que se pasa al
proveedor OLE DB. Para poder usar la opción BULK , se necesita el permiso ADMINISTER BULK OPERATIONS .

Ejemplos
A. Usar OPENROWSET con SELECT y el proveedor OLE DB de SQL Server Native Client
En el siguiente ejemplo se usa el proveedor OLE DB de SQL Server Native Client para tener acceso a la tabla
HumanResources.Department de la base de datos AdventureWorks2012 en el servidor remoto Seattle1 . ( El uso
de SQLNCLI y SQL Server redirigirá a la última versión del proveedor OLE DB de SQL Server Native Client). Se
utiliza una instrucción SELECT para definir el conjunto de filas devuelto. La cadena de proveedor contiene las
palabras clave Server y Trusted_Connection . El proveedor OLE DB de SQL Server Native Client reconoce estas
palabras clave.

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
'SELECT GroupName, Name, DepartmentID
FROM AdventureWorks2012.HumanResources.Department
ORDER BY GroupName, Name') AS a;

B. Usar el proveedor Microsoft OLE DB para Jet


En el siguiente ejemplo se obtiene acceso a la tabla Customers de la base de datos Northwind de Microsoft
Access a través del proveedor Microsoft OLE DB para Jet.

NOTE
En este ejemplo se supone que está instalado Access. Para ejecutar este ejemplo, debe instalar la base de datos Northwind.
SELECT CustomerID, CompanyName
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
'admin';'',Customers);
GO

C. Usar OPENROWSET y otra tabla en INNER JOIN


En el siguiente ejemplo se seleccionan todos los datos de la tabla Customers de la instancia local de la base de
datos Northwind de SQL Server y de la tabla Orders de la base de datos Northwind de Access que se encuentra
en el mismo equipo.

NOTE
En este ejemplo se supone que está instalado Access. Para ejecutar este ejemplo, debe instalar la base de datos Northwind.

USE Northwind ;
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'', Orders)
AS o
ON c.CustomerID = o.CustomerID ;
GO

D. Usar OPENROWSET para insertar de forma masiva datos de archivo en una columna varbinary(max)
En el ejemplo siguiente se crea una tabla pequeña como ejemplo y se insertan datos de archivo desde un archivo
llamado Text1.txt ubicado en el directorio raíz C: en una columna varbinary(max) .

USE AdventureWorks2012;
GO
CREATE TABLE myTable(FileName nvarchar(60),
FileType nvarchar(60), Document varbinary(max));
GO

INSERT INTO myTable(FileName, FileType, Document)


SELECT 'Text1.txt' AS FileName,
'.txt' AS FileType,
* FROM OPENROWSET(BULK N'C:\Text1.txt', SINGLE_BLOB) AS Document;
GO

E. Usar el proveedor OPENROWSET BULK con un archivo de formato para recuperar filas de un archivo de
texto
En el ejemplo siguiente se utiliza un archivo de formato para recuperar filas de un archivo de texto delimitado por
tabuladores, values.txt , que contiene los datos siguientes:

1 Data Item 1
2 Data Item 2
3 Data Item 3

El archivo de formato, values.fmt , describe las columnas en values.txt :


9.0
2
1 SQLCHAR 0 10 "\t" 1 ID SQL_Latin1_General_Cp437_BIN
2 SQLCHAR 0 40 "\r\n" 2 Description SQL_Latin1_General_Cp437_BIN

Ésta es la consulta que recupera los datos:

SELECT a.* FROM OPENROWSET( BULK 'c:\test\values.txt',


FORMATFILE = 'c:\test\values.fmt') AS a;

F. Especificar un archivo de formato y una página de códigos


En el siguiente ejemplo se muestra cómo usar las opciones de archivo de formato y página de códigos al mismo
tiempo.

INSERT INTO MyTable SELECT a.* FROM


OPENROWSET (BULK N'D:\data.csv', FORMATFILE =
'D:\format_no_collation.txt', CODEPAGE = '65001') AS a;

G. Tener acceso a los datos de un archivo CSV con un archivo de formato


Se aplica a: SQL Server 2017 (14.x) CTP 1.1.

SELECT *
FROM OPENROWSET(BULK N'D:\XChange\test-csv.csv',
FORMATFILE = N'D:\XChange\test-csv.fmt',
FIRSTROW=2,
FORMAT='CSV') AS cars;

H. Tener acceso a los datos de un archivo CSV sin un archivo de formato

SELECT * FROM OPENROWSET(


BULK 'C:\Program Files\Microsoft SQL Server\MSSQL14.CTP1_1\MSSQL\DATA\inv-2017-01-19.csv',
SINGLE_CLOB) AS DATA;

I. Tener acceso a los datos de un archivo almacenado en Azure Blob Storage


Se aplica a: SQL Server 2017 (14.x) CTP 1.1.
En el siguiente ejemplo se usa un origen de datos externo que apunta a un contenedor en una cuenta de Azure
Storage y una credencial con ámbito de base de datos creada para una firma de acceso compartido.

SELECT * FROM OPENROWSET(


BULK 'inv-2017-01-19.csv',
DATA_SOURCE = 'MyAzureInvoices',
SINGLE_CLOB) AS DataFile;

Para ver ejemplos completos de OPENROWSET , incluido cómo configurar la credencial y el origen de datos externo,
vea Ejemplos de acceso masivo a datos en Azure Blob Storage.
Otros ejemplos
Para obtener más ejemplos del uso de INSERT...SELECT * FROM OPENROWSET(BULK...) , vea los siguientes temas:
Ejemplos de importación y exportación en bloque de documentos XML (SQL Server)
Mantener valores de identidad al importar datos en bloque (SQL Server)
Mantener valores NULL o usar valores predeterminados durante la importación en bloque (SQL Server)
Usar un archivo de formato para importar datos en bloque (SQL Server)
Usar el formato de caracteres para importar o exportar datos (SQL Server)
Usar un archivo de formato para omitir una columna de tabla (SQL Server)
Usar un archivo de formato para omitir un campo de datos (SQL Server)
Usar un archivo de formato para asignar columnas de tabla a campos de un archivo de datos (SQL Server)

Ver también
DELETE (Transact-SQL )
FROM (Transact-SQL )
Importar y exportar datos en bloque (SQL Server)
INSERT (Transact-SQL )
OPENDATASOURCE (Transact-SQL )
OPENQUERY (Transact-SQL )
Rowset Functions (Transact-SQL )
SELECT (Transact-SQL )
sp_addlinkedserver (Transact-SQL )
sp_serveroption (Transact-SQL )
UPDATE (Transact-SQL )
WHERE (Transact-SQL )
OPENXML (Transact-SQL)
17/07/2018 • 14 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
OPENXML proporciona una vista de un conjunto de filas en un documento XML. Puesto que OPENXML es un
proveedor de conjuntos de filas, puede utilizarse en instrucciones Transact-SQL en las que pueden aparecer
proveedores de conjuntos de filas como una tabla, vista o la función OPENROWSET.
Convenciones de sintaxis de Transact-SQL

Sintaxis
OPENXML( idoc int [ in] , rowpattern nvarchar [ in ] , [ flags byte [ in ] ] )
[ WITH ( SchemaDeclaration | TableName ) ]

Argumentos
idoc
Es el identificador del documento de la representación interna de un documento XML. La representación interna
de un documento XML se crea mediante una llamada a sp_xml_preparedocument.
rowpattern
Es el patrón XPath usado para identificar los nodos (en el documento XML cuyo identificador se pasa en el
parámetro idoc) que se van a procesar como filas.
flags
Indica la asignación que debe utilizarse entre los datos XML y el conjunto de filas relacional, y cómo debe llenarse
la columna de desbordamiento; flags es un parámetro de entrada opcional y puede tomar uno de los valores
siguientes.

VALOR DEL BYTE DESCRIPCIÓN

0 Establece como valor predeterminado la asignación centrada


en atributos.

1 Usa la asignación centrada en atributos. Se puede combinar


con XML_ELEMENTS. En ese caso, primero se aplica la
asignación centrada en atributos y, después, la asignación
centrada en elementos en todas las columnas que todavía
no se han visto afectadas.

2 Usa la asignación centrada en elementos. Se puede


combinar con XML_ATTRIBUTES. En ese caso, primero se aplica
la asignación centrada en atributos y, después, la asignación
centrada en elementos en todas las columnas que todavía
no se han visto afectadas.
VALOR DEL BYTE DESCRIPCIÓN

8 Puede combinarse (OR lógico) con XML_ATTRIBUTES o


XML_ELEMENTS. Si se trata de una recuperación, esta marca
informa de que los datos consumidos no se deberían copiar a
la propiedad de desbordamiento @mp:xmltext.

SchemaDeclaration
Es la definición de esquema de la forma: ColNameColType [ColPattern | MetaProperty] [,ColNameColType [*
ColPattern* | MetaProperty]...]
ColName
Es el nombre de columna en el conjunto de filas.
ColType
Es el tipo de datos SQL Server de la columna en el conjunto de filas. Si los tipos de columna son distintos del tipo
de datos xml subyacente del atributo, se producirá una conversión de tipos.
ColPattern
Es un parámetro opcional, un patrón XPath general que describe la forma de asignar los nodos XML a las
columnas. Si no se especifica ColPattern, se realiza la asignación predeterminada (asignación centrada en
atributos o centrada en elementos especificada en los valores flags).
El patrón XPath especificado como ColPattern se usa para especificar la naturaleza especial de la asignación (en
caso de una asignación centrada en atributos y centrada en elementos) que sobrescribe o mejora la
asignación predeterminada especificada por flags.
El patrón XPath general especificado como ColPattern también admite las metapropiedades.
MetaProperty
Es una de las metapropiedades que proporciona OPENXML. Si se especifica MetaProperty, la columna contiene
información proporcionada por la metapropiedad. Las metapropiedades permiten extraer información (como
información sobre el espacio de nombres y la posición relativa) acerca de nodos XML. Esto proporciona más
información que la que se puede ver en la representación de texto.
TableName
Es el nombre de tabla que puede proporcionarse (en lugar de SchemaDeclaration) si ya existe una tabla con el
esquema deseado y no se requieren patrones de columna.

Notas
La cláusula WITH proporciona un formato de conjunto de filas (e información de asignación adicional si es
necesario) mediante SchemaDeclaration o la especificación de un TableName existente. Si no se especifica la
cláusula opcional WITH, los resultados se devuelven en un formato de tabla irregular. Las tablas irregulares
representan la estructura refinada del documento XML (por ejemplo, los nombres de elementos o atributos, la
jerarquía del documento, los espacios de nombre, las instrucciones de proceso, etc.) en una única tabla.
En la tabla siguiente se describe la estructura de la tabla irregular.

NOMBRE DE COLUMNA TIPO DE DATOS DESCRIPCIÓN

id bigint Es el id. único del nodo del documento.

El elemento raíz tiene un valor de


identificador 0. Los valores de
identificador negativos están
reservados.
NOMBRE DE COLUMNA TIPO DE DATOS DESCRIPCIÓN

parentid bigint Identifica el elemento primario del nodo.


El elemento primario especificado por
este identificador no es necesariamente
el elemento primario, pero depende del
NodeType del nodo cuyo elemento
primario indica este identificador. Por
ejemplo, si se trata de un nodo de texto,
su elemento primario puede ser un
nodo de atributo.

Si el nodo está en el nivel superior del


documento XML, su ParentID es NULL.

nodetype int Identifica el tipo de nodo. Es un entero


que se corresponde con la numeración
del tipo de nodo XML DOM.

Los tipos de nodo son:

1 = Nodo de elemento

2 = Nodo de atributo

3 = Nodo de texto

localname nvarchar Proporciona el nombre local del


elemento o atributo. Es NULL si el
objeto DOM no tiene nombre.

prefijo nvarchar Es el prefijo del espacio del nombre del


nodo.

namespaceuri nvarchar Es el URI del espacio de nombres del


nodo. Si el valor es NULL, no hay
ningún espacio de nombres.

datatype nvarchar Es el tipo de datos reales de la fila del


elemento o atributo y, en caso
contrario, es NULL. El tipo de datos se
infiere a partir de las DTD insertadas o
del esquema insertado.

prev bigint Es el id. XML del anterior elemento del


mismo nivel. Es NULL si no existe
ningún elemento previo directo del
mismo nivel.

texto ntext Contiene el valor de atributo o el


contenido de elemento en forma de
texto (o es NULL si la entrada de la
tabla irregular no requiere un valor).

Ejemplos
A. Usar una instrucción SELECT simple con OPENXML
En el siguiente ejemplo se crea una representación interna de la imagen XML utilizando sp_xml_preparedocument .A
continuación se ejecuta una instrucción SELECT que usa un proveedor del conjunto de filas OPENXML contra la
representación interna del documento XML.
El valor de flag se establece en 1 . Esto indica una asignación centrada en atributos. Por tanto, los atributos XML
se asignan a las columnas del conjunto de filas. El valor rowpattern especificado como /ROOT/Customer identifica
los nodos <Customers> que se van a procesar.
El parámetro opcional ColPattern (patrón de columna) no se especifica porque el nombre de columna coincide con
los nombres de atributos XML.
El proveedor del conjunto de filas OPENXML crea un conjunto de filas de 2 columnas ( CustomerID y ContactName )
desde el que la instrucción SELECT recupera las columnas necesarias (en este caso, todas las columnas).

DECLARE @idoc int, @doc varchar(1000);


SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
<OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
<OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
<OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer',1)
WITH (CustomerID varchar(10),
ContactName varchar(20));

El conjunto de resultados es el siguiente.

CustomerID ContactName
---------- --------------------
VINET Paul Henriot
LILAS Carlos Gonzlez

Si se ejecuta la misma instrucción SELECT con el parámetro flags establecido en 2 , lo que indica una asignación
centrada en elementos, los valores de CustomerID y ContactName para los dos clientes en el documento XML se
devuelven como NULL, ya que no hay ningún elemento con el nombre CustomerID o ContactName en el
documento XML.
El conjunto de resultados es el siguiente.

CustomerID ContactName
---------- -----------
NULL NULL
NULL NULL

B. Especificar ColPattern para la asignación entre columnas y los atributos XML


En la siguiente consulta se devuelven los atributos de CustomerID, OrderDate, ProductID y Quantity del
documento XML. rowpattern identifica los elementos <OrderDetails> . ProductID y Quantity son los atributos del
elemento <OrderDetails> . No obstante, OrderID , CustomerID y OrderDate son los atributos del elemento
primario ( <Orders> ).
Se especifica el parámetro opcional colpattern. Indica lo siguiente:
Los valores OrderID , CustomerID y OrderDate del conjunto de filas se asignan a los atributos del elemento
primario de los nodos identificados por rowpattern en el documento XML.
La columna ProdID del conjunto de filas se asigna al atributo ProductID , y la columna Qty del conjunto de
filas se asigna al atributo Quantity de los nodos identificados en rowpattern.
Aunque el parámetro flags especifica la asignación centrada en elementos, la asignación especificada en
ColPattern sobrescribe la anterior.

DECLARE @idoc int, @doc varchar(1000);


SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">v
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>';

--Create an internal representation of the XML document.


EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- SELECT stmt using OPENXML rowset provider


SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity');

El conjunto de resultados es el siguiente.

OrderID CustomerID OrderDate ProdID Qty


------------------------------------------------------------------------
10248 VINET 1996-07-04 00:00:00.000 11 12
10248 VINET 1996-07-04 00:00:00.000 42 10
10283 LILAS 1996-08-16 00:00:00.000 72 3

C. Obtener el resultado en formato de tabla irregular


El documento XML del ejemplo siguiente está formado por los elementos <Customers> , <Orders> y
<Order_0020_Details> . Primero se llama a sp_xml_preparedocument para obtener un identificador de
documentos. Este identificador de documentos se pasa a OPENXML .
En la instrucción OPENXML , el valor rowpattern ( /ROOT/Customers ) identifica los nodos <Customers> que se van a
procesar. Puesto que no se proporciona la cláusula WITH, OPENXML devuelve el conjunto de filas en un formato de
tabla irregular.
Por último, la instrucción SELECT recupera todas las columnas de la tabla irregular.

DECLARE @idoc int, @doc varchar(1000);


SET @doc ='
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
<Orders CustomerID="VINET" EmployeeID="5" OrderDate=
"1996-07-04T00:00:00">
<Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
<Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
</Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
"1996-08-16T00:00:00">
<Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
</Orders>
</Customers>
</ROOT>';

--Create an internal representation of the XML document.


EXEC sp_xml_preparedocument @idoc OUTPUT, @doc;

-- SELECT statement that uses the OPENXML rowset provider.


SELECT *
FROM OPENXML (@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc;

Ver también
Ejemplos: Usar OPENXML
Funciones de seguridad (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones devuelven información útil para la administración de la seguridad. En Funciones de
cifrado (Transact-SQL ) se enumeran más funciones.

CERTENCODED (Transact-SQL) PWDCOMPARE (Transact-SQL)

CERTPRIVATEKEY (Transact-SQL) PWDENCRYPT (Transact-SQL)

CURRENT_USER (Transact-SQL) SCHEMA_ID (Transact-SQL)

DATABASE_PRINCIPAL_ID (Transact-SQL) SCHEMA_NAME (Transact-SQL)

sys.fn_builtin_permissions (Transact-SQL) SESSION_USER (Transact-SQL)

sys.fn_get_audit_file (Transact-SQL) SUSER_ID (Transact-SQL)

sys.fn_my_permissions (Transact-SQL) SUSER_SID (Transact-SQL)

HAS_PERMS_BY_NAME (Transact-SQL) SUSER_SNAME (Transact-SQL)

IS_MEMBER (Transact-SQL) SYSTEM_USER (Transact-SQL)

IS_ROLEMEMBER (Transact-SQL) SUSER_NAME (Transact-SQL)

IS_SRVROLEMEMBER (Transact-SQL) USER_ID (Transact-SQL)

ORIGINAL_LOGIN (Transact-SQL) USER_NAME (Transact-SQL)

PERMISSIONS (Transact-SQL)

Para más información sobre la pertenencia a grupos de Windows, vea xp_logininfo (Transact-SQL ) y
xp_enumgroups (Transact-SQL ).

Ver también
Procedimientos almacenados de seguridad (Transact-SQL )
Funciones de cifrado (Transact-SQL )
Funciones integradas (Transact-SQL )
Instrucciones de seguridad
CERTENCODED (Transact-SQL)
18/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve la parte pública de un certificado en formato binario. Esta función toma un identificador de
certificado como argumento y devuelve el certificado codificado. Para crear un certificado nuevo, pase el resultado
binario a CREATE CERTIFICATE … WITH BINARY.

Sintaxis
CERTENCODED ( cert_id )

Argumentos
cert_id
certificate_id del certificado. Busque este valor en sys.certificates; la función CERT_ID (Transact-SQL ) también lo
devolverá. cert_id tiene el tipo de datos int.

Tipos de valores devueltos


varbinary

Notas
Use CERTENCODED y CERTPRIVATEKEY juntos para devolver diferentes partes de un certificado en formato
binario.

Permisos
CERTENCODED está disponible públicamente.

Ejemplos
Ejemplo sencillo
En este ejemplo se crea un certificado denominado Shipping04 y se usa la función CERTENCODED para
devolver la codificación binaria del certificado. Este ejemplo establece la fecha de expiración del certificado en 31
de octubre de 2040.

CREATE DATABASE TEST1;


GO
USE TEST1
CREATE CERTIFICATE Shipping04
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Sammamish Shipping Records',
EXPIRY_DATE = '20401031';
GO
SELECT CERTENCODED(CERT_ID('Shipping04'));
B. Copiar un certificado a otra base de datos
En el ejemplo más complejo se crean dos bases de datos, SOURCE_DB y TARGET_DB . Luego se crea un certificado en
SOURCE_DB y se copia en TARGET_DB . Por último, se muestra que los datos cifrados en SOURCE_DB se pueden
descifrar en TARGET_DB con la copia del certificado.
Para crear el entorno de ejemplo, cree las bases de datos SOURCE_DB y TARGET_DB y una clave maestra en cada
base de datos. Luego, cree un certificado en SOURCE_DB .

USE master;
GO
CREATE DATABASE SOURCE_DB;
GO
USE SOURCE_DB;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'S0URCE_DB KEY Pa$$W0rd';
GO
CREATE DATABASE TARGET_DB;
GO
USE TARGET_DB
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Pa$$W0rd in TARGET_DB';
GO

-- Create a certificate in SOURCE_DB


USE SOURCE_DB;
GO
CREATE CERTIFICATE SOURCE_CERT WITH SUBJECT = 'SOURCE_CERTIFICATE';
GO

Después, extraiga la descripción binaria del certificado.

DECLARE @CERTENC VARBINARY(MAX);


DECLARE @CERTPVK VARBINARY(MAX);
SELECT @CERTENC = CERTENCODED(CERT_ID('SOURCE_CERT'));
SELECT @CERTPVK = CERTPRIVATEKEY(CERT_ID('SOURCE_CERT'),
'CertEncryptionPa$$word');
SELECT @CERTENC AS BinaryCertificate;
SELECT @CERTPVK AS EncryptedBinaryCertificate;
GO

Luego, cree el certificado duplicado en la base de datos TARGET_DB . Modifique el código siguiente para que
funcione. Para ello, inserte los dos valores binarios (@CERTENC y @CERTPVK) devueltos en el paso anterior. No
especifique estos valores entre comillas.

-- Create the duplicate certificate in the TARGET_DB database


USE TARGET_DB
GO
CREATE CERTIFICATE TARGET_CERT
FROM BINARY = <insert the binary value of the @CERTENC variable>
WITH PRIVATE KEY (
BINARY = <insert the binary value of the @CERTPVK variable>
, DECRYPTION BY PASSWORD = 'CertEncryptionPa$$word');
-- Compare the certificates in the two databases
-- The two certificates should be the same
-- except for name and (possibly) the certificate_id
SELECT * FROM SOURCE_DB.sys.certificates
UNION
SELECT * FROM TARGET_DB.sys.certificates;

En este código, que se ejecuta como un solo lote, se muestra que TARGET_DB puede descifrar datos que se cifraron
en SOURCE_DB .

USE SOURCE_DB;

DECLARE @CLEARTEXT nvarchar(100);


DECLARE @CIPHERTEXT varbinary(8000);
DECLARE @UNCIPHEREDTEXT_Source nvarchar(100);
SET @CLEARTEXT = N'Hello World';
SET @CIPHERTEXT = ENCRYPTBYCERT(CERT_ID('SOURCE_CERT'), @CLEARTEXT);
SET @UNCIPHEREDTEXT_Source =
DECRYPTBYCERT(CERT_ID('SOURCE_CERT'), @CIPHERTEXT)
-- Encryption and decryption result in SOURCE_DB
SELECT @CLEARTEXT AS SourceClearText, @CIPHERTEXT AS SourceCipherText,
@UNCIPHEREDTEXT_Source AS SourceDecryptedText;

-- SWITCH DATABASE
USE TARGET_DB;

DECLARE @UNCIPHEREDTEXT_Target nvarchar(100);


SET @UNCIPHEREDTEXT_Target = DECRYPTBYCERT(CERT_ID('TARGET_CERT'), @CIPHERTEXT);
-- Encryption and decryption result in TARGET_DB
SELECT @CLEARTEXT AS ClearTextInTarget, @CIPHERTEXT AS CipherTextInTarget, @UNCIPHEREDTEXT_Target AS
DecriptedTextInTarget;
GO

Vea también
Funciones de seguridad (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL )
CERTPRIVATEKEY (Transact-SQL )
sys.certificates (Transact-SQL )
CERTPRIVATEKEY (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve la clave privada de un certificado en formato binario. Esta función toma tres argumentos.
Un identificador de certificado.
Una contraseña de cifrado, que se usa para cifrar los bits de las claves privadas que devuelve la función. Este
enfoque no expone las claves como texto no cifrado a los usuarios.
Una contraseña de descifrado opcional. Se usa una contraseña de descifrado especificada para descifrar la
clave privada del certificado. En caso contrario, se usa la clave maestra de base de datos.
Solo los usuarios que tienen acceso a la clave privada del certificado pueden usar esta función. Esta función
devuelve la clave privada en formato PVK.

Sintaxis
CERTPRIVATEKEY
(
cert_ID
, ' encryption_password '
[ , ' decryption_password ' ]
)

Argumentos
certificate_ID
certificate_id del certificado. Obtenga este valor de sys.certificates o de la función CERT_ID (Transact-SQL ).
cert_id tiene el tipo de datos int.
encryption_password
La contraseña utilizada para cifrar el valor binario devuelto.
decryption_password
La contraseña utilizada para descifrar el valor binario devuelto.

Tipos de valores devueltos


varbinary

Notas
Use CERTENCODED y CERTPRIVATEKEY juntos para devolver diferentes partes de un certificado en formato
binario.

Permisos
CERTPRIVATEKEY está disponible públicamente.
Ejemplos
CREATE DATABASE TEST1;
GO
USE TEST1
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Use 5tr0ng P^55Words'
GO
CREATE CERTIFICATE Shipping04
WITH SUBJECT = 'Sammamish Shipping Records',
EXPIRY_DATE = '20401031';
GO
SELECT CERTPRIVATEKEY(CERT_ID('Shipping04'), 'jklalkaa/; uia3dd');

Vea el ejemplo B de CERTENCODED (Transact-SQL ) para ver un ejemplo más complejo en el que se usa
CERTPRIVATEKEY y CERTENCODED para copiar un certificado en otra base de datos.

Vea también
Funciones de seguridad (Transact-SQL )
CREATE CERTIFICATE (Transact-SQL ) Funciones de seguridad (Transact-SQL ) sys.certificates (Transact-SQL )
CURRENT_USER (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre de usuario actual. Esta función es equivalente a USER_NAME() .
Convenciones de sintaxis de Transact-SQL

Sintaxis
CURRENT_USER

Tipos de valores devueltos


sysname

Notas
CURRENT_USER devuelve el nombre del contexto de seguridad actual. Si CURRENT_USER se ejecuta después de una
llamada a EXECUTE AS , cambia el contexto; CURRENT_USER devolverá el nombre del contexto suplantado. Si una
entidad de seguridad de Windows ha tenido acceso a la base de datos en forma de miembro de un grupo,
CURRENT_USER devolverá el nombre de la entidad de seguridad de Windows en vez del nombre del grupo.

Vea SUSER_NAME (Transact-SQL ) y SYSTEM_USER (Transact-SQL ) para obtener información sobre cómo
devolver el inicio de sesión del usuario actual.

Ejemplos
A. Usar CURRENT_USER para devolver el nombre del usuario actual
En este siguiente se devuelve el nombre del usuario actual.

SELECT CURRENT_USER;
GO

B. Usar CURRENT_USER como restricción DEFAULT


En este ejemplo se crea una tabla que usa CURRENT_USER como restricción DEFAULT para la columna
order_person en una fila de ventas.
USE AdventureWorks2012;
GO
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'orders22')
DROP TABLE orders22;
GO
SET NOCOUNT ON;
CREATE TABLE orders22
(
order_id int IDENTITY(1000, 1) NOT NULL,
cust_id int NOT NULL,
order_date smalldatetime NOT NULL DEFAULT GETDATE(),
order_amt money NOT NULL,
order_person char(30) NOT NULL DEFAULT CURRENT_USER
);
GO

Este ejemplo inserta un registro en la tabla. El usuario denominado Wanida ejecuta estas instrucciones.

INSERT orders22 (cust_id, order_amt)


VALUES (5105, 577.95);
GO
SET NOCOUNT OFF;
GO

Esta consulta selecciona toda la información de la tabla orders22 .

SELECT * FROM orders22;


GO

El conjunto de resultados es el siguiente.

order_id cust_id order_date order_amt order_person


----------- ----------- -------------------- ------------ ------------
1000 5105 2005-04-03 23:34:00 577.95 Wanida

(1 row(s) affected)

C. Usar CURRENT_USER desde un contexto suplantado


En este ejemplo, el usuario Wanida ejecuta el siguiente código Transact-SQL.

SELECT CURRENT_USER;
GO
EXECUTE AS USER = 'Wanida';
GO
SELECT CURRENT_USER;
GO
REVERT;
GO
SELECT CURRENT_USER;
GO

El conjunto de resultados es el siguiente.


Wanida
Arnalfo
Wanida

Vea también
USER_NAME (Transact-SQL )
SYSTEM_USER (Transact-SQL )
sys.database_principals (Transact-SQL )
ALTER TABLE (Transact-SQL )
CREATE TABLE (Transact-SQL )
Funciones del sistema (Transact-SQL )
HAS_DBACCESS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información acerca de si el usuario tiene acceso a la base de datos especificada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
HAS_DBACCESS ( 'database_name' )

Argumentos
'database_name'
El nombre de la base de datos de la que el usuario desea información de acceso. database_name es sysname.

Tipos devueltos
int

Notas
HAS_DBACCESS devuelve 1 si el usuario tiene acceso a la base de datos, 0 si no lo tiene y NULL si el nombre de
la base de datos no es válido.
HAS_DBACCESS devuelve 0 si la base de datos está sin conexión o es sospechosa.
HAS_DBACCESS devuelve 0 si la base de datos están en modo de usuario único y la está usando otro usuario.

Permisos
Debe pertenecer al rol public.

Ejemplos
En el siguiente ejemplo se comprueba si el usuario actual tiene acceso a la base de datos AdventureWorks2012 .

SELECT HAS_DBACCESS('AdventureWorks2012');
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se comprueba si el usuario actual tiene acceso a la base de datos AdventureWorksPDW2012 .
SELECT HAS_DBACCESS('AdventureWorksPDW2012');
GO

Ver también
IS_MEMBER (Transact-SQL )
IS_SRVROLEMEMBER (Transact-SQL )
HAS_PERMS_BY_NAME (Transact-SQL)
18/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Evalúa el permiso efectivo del usuario actual sobre un elemento protegible. Una función relacionada es
fn_my_permissions.
Convenciones de sintaxis de Transact-SQL

Sintaxis
HAS_PERMS_BY_NAME ( securable , securable_class , permission
[ , sub-securable ] [ , sub-securable_class ] )

Argumentos
securable
Es el nombre del elemento protegible. Si el elemento protegible es el servidor mismo, este valor debe establecerse
en NULL. securable es una expresión escalar de tipo sysname. No tiene ningún valor predeterminado.
securable_class
Es el nombre de la clase de elemento protegible en la cual se prueba el permiso. securable_class es una expresión
escalar de tipo nvarchar(60).
En Base de datos SQL de Azure, el argumento securable_class debe establecerse en uno de los valores siguientes:
DATABASE, OBJECT, ROLE, SCHEMA o USER.
permission
Expresión escalar no NULL de tipo sysname que representa el nombre del permiso que se va a comprobar. No
tiene ningún valor predeterminado. El nombre de permiso ANY es un comodín.
sub -securable
Expresión escalar opcional de tipo sysname que representa el nombre de la subentidad protegible en la que se va
a probar el permiso. El valor predeterminado es NULL.

NOTE
En las versiones de SQL Server a SQL Server 2017, las subentidades protegibles no pueden usar corchetes con el formato
'[sub name]'. Es mejor usar 'sub name'.

sub -securable_class
Expresión escalar opcional de tipo nvarchar(60) que representa la clase de subentidad protegible en la que se va a
probar el permiso. El valor predeterminado es NULL.
En Base de datos SQL de Azure, el argumento sub-securable_class solo es válido si el argumento securable_class
está establecido en OBJECT. Si el argumento securable_class se establece en OBJECT, el argumento sub-
securable_class debe establecerse en COLUMN.
Tipos devueltos
int
Devuelve NULL cuando la consulta da error.

Notas
Esta función integrada determina si la entidad de seguridad actual tiene un permiso efectivo específico sobre un
elemento protegible determinado. HAS_PERMS_BY_NAME devuelve 1 cuando el usuario tiene un permiso
efectivo sobre el elemento protegible, 0 cuando el usuario no tiene ningún permiso efectivo sobre el elemento
protegible y NULL cuando la clase protegible o el permiso no son válidos. Un permiso efectivo puede ser
cualquiera de los siguientes:
Un permiso concedido directamente a la entidad de seguridad, no denegado.
Un permiso implícito en un permiso de nivel superior de la entidad de seguridad, no denegado.
Un permiso concedido a un rol o grupo al que pertenece la entidad de seguridad, no denegado.
Un permiso de un rol o grupo al que pertenece la entidad de seguridad, no denegado.
La evaluación de permisos siempre se realiza en el contexto de seguridad del autor de la llamada. Para
determinar si algún otro usuario tiene un permiso efectivo, el autor de la llamada debe tener el permiso
IMPERSONATE sobre ese usuario.
En el caso de entidades de esquema, se aceptan nombres no NULL de una, dos o tres partes. En el caso de
entidades de base de datos, se aceptan nombres de una parte, con un valor NULL que significa "base de
datos actual". En el caso del servidor, es necesario un valor NULL (que significa "servidor actual"). Esta
función no puede comprobar permisos en un servidor vinculado ni en un usuario de Windows para los que
no se ha creado ninguna entidad de seguridad a nivel de servidor.
La consulta siguiente devuelve una lista de clases de elementos protegibles integrados:

SELECT class_desc FROM sys.fn_builtin_permissions(default);

Se utilizan las intercalaciones siguientes:


Intercalación de la base de datos activa: elementos protegibles de base de datos, entre los que se incluyen
elementos no incluidos en un esquema; elementos con ámbito de esquema de una o dos partes; base de
datos de destino cuando se utiliza un nombre de tres partes.
Intercalación de la base de datos maestra: elementos protegibles de servidor.
En las comprobaciones de columna no se admite 'ANY'. Debe especificar el permiso apropiado.

Ejemplos
A. ¿Tengo el permiso VIEW SERVER STATE en el servidor?
Se aplica a: de SQL Server 2008 a SQL Server 2017

SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');

B. ¿Puedo suplantar (IMPERSONATE) la entidad de seguridad del servidor Ps?


Se aplica a: de SQL Server 2008 a SQL Server 2017
SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');

C. ¿Tengo algún permiso en la base de datos activa?

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');

D. ¿Tiene la entidad de seguridad de base de datos Pd algún permiso en la base de datos activa?
Suponga que el autor de la llamada tiene el permiso IMPERSONATE sobre la entidad de seguridad Pd .

EXECUTE AS user = 'Pd'


GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
GO
REVERT;
GO

E. ¿Puedo crear procedimientos y tablas en el esquema S?


Para el ejemplo siguiente es necesario tener el permiso ALTER para S y el permiso CREATE PROCEDURE de la base
de datos, y lo mismo para las tablas.

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE')


& HAS_PERMS_BY_NAME('S', 'SCHEMA', 'ALTER') AS _can_create_procs,
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') &
HAS_PERMS_BY_NAME('S', 'SCHEMA', 'ALTER') AS _can_create_tables;

F. ¿Sobre qué tablas tengo el permiso SELECT?

SELECT HAS_PERMS_BY_NAME
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables

G. ¿Tengo el permiso INSERT sobre la tabla SalesPerson en AdventureWorks2012?


En el ejemplo siguiente se supone que AdventureWorks2012 es el contexto de la base de datos actual y se utiliza un
nombre de dos partes.

SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');

En el ejemplo siguiente no se asume ningún contexto de base de datos activa y se utiliza un nombre de tres partes.

SELECT HAS_PERMS_BY_NAME('AdventureWorks2012.Sales.SalesPerson',
'OBJECT', 'INSERT');

H. ¿Sobre qué columnas de la tabla T tengo el permiso SELECT?

SELECT name AS column_name,


HAS_PERMS_BY_NAME('T', 'OBJECT', 'SELECT', name, 'COLUMN')
AS can_select
FROM sys.columns AS c
WHERE c.object_id=object_id('T');
Ver también
Permisos (motor de base de datos)
Securables
Jerarquía de permisos (motor de base de datos)
sys.fn_builtin_permissions (Transact-SQL )
Vistas de catálogo de seguridad (Transact-SQL )
IS_MEMBER (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Indica si el usuario actual es miembro del grupo de Microsoft Windows o del rol de base de datos de SQL Server
especificados.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IS_MEMBER ( { 'group' | 'role' } )

Argumentos
' group '
Se aplica a: SQL Server 2008 hasta SQL Server 2017
Nombre del grupo de Windows que se está comprobando; su formato debe ser Dominio\Grupo. group es
sysname.
' role '
Es el nombre del rol SQL Server que se va comprobar. role es sysname y puede contener los roles fijos de base
de datos o los roles definidos por el usuario, pero no los roles de servidor.

Tipos devueltos
int

Notas
IS_MEMBER devuelve los siguientes valores.

VALOR DEVUELTO DESCRIPCIÓN

0 El usuario actual no es miembro de group ni role.

1 El usuario actual es miembro de group o role.

NULL group o role no son válidos. Cuando se consulta en un inicio


de sesión de SQL Server o en un inicio de sesión que usa un
rol de aplicación, devuelve NULL para un grupo de Windows.

IS_MEMBER determina la pertenencia al grupo de Windows examinando un token de acceso creado por
Windows. El token de acceso no refleja los cambios en la pertenencia a grupos que se realizan después de que un
usuario se conecte a una instancia de SQL Server. La pertenencia a un grupo de Windows no se puede consultar
en un inicio de sesión de SQL Server ni en un rol de aplicación de SQL Server.
Para agregar y quitar miembros de un rol de base de datos, use ALTER ROLE (Transact-SQL ). Para agregar y
quitar miembros de un rol de servidor, use ALTER SERVER ROLE (Transact-SQL ).
Esta función evalúa la pertenencia al rol, no el permiso subyacente. Por ejemplo, el rol fijo de base de datos
db_owner tiene el permiso CONTROL DATABASE. Si el usuario tiene el permiso CONTROL DATABASE pero
no es miembro del rol, esta función informará correctamente de que el usuario no es miembro del rol db_owner,
aunque tenga los mismos permisos.
Los miembros del rol fijo de servidor sysadmin acceden a cada base de datos con el usuario dbo. Al comprobar
los permisos para el rol fijo de servidor sysadmin, se comprueban los permisos para dbo, en lugar del inicio de
sesión original. Como dbo no se puede agregar a un rol de base de datos y no existe en los grupos de Windows,
dbo siempre devolverá 0 (o NULL si no existe el rol).

Funciones relacionadas
Para determinar si otro inicio de sesión de SQL Server es miembro de un rol de base de datos, use
IS_ROLEMEMBER (Transact-SQL ). Para determinar si un inicio de sesión de SQL Server es miembro de un rol
de servidor, use IS_SRVROLEMEMBER (Transact-SQL ).

Ejemplos
En el siguiente ejemplo se comprueba si el usuario actual es miembro de un rol de base de datos o de un grupo
de dominio de Windows.

-- Test membership in db_owner and print appropriate message.


IF IS_MEMBER ('db_owner') = 1
PRINT 'Current user is a member of the db_owner role'
ELSE IF IS_MEMBER ('db_owner') = 0
PRINT 'Current user is NOT a member of the db_owner role'
ELSE IF IS_MEMBER ('db_owner') IS NULL
PRINT 'ERROR: Invalid group / role specified';
GO

-- Execute SELECT if user is a member of ADVWORKS\Shipping.


IF IS_MEMBER ('ADVWORKS\Shipping') = 1
SELECT 'User ' + USER + ' is a member of ADVWORKS\Shipping.';
GO

Ver también
IS_SRVROLEMEMBER (Transact-SQL )
Entidades de seguridad (motor de base de datos)
Vistas de catálogo de seguridad (Transact-SQL )
Funciones de seguridad (Transact-SQL )
IS_ROLEMEMBER (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Indica si una entidad de seguridad de base de datos especificada es miembro del rol de base de datos
especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IS_ROLEMEMBER ( 'role' [ , 'database_principal' ] )

Argumentos
' role '
Nombre del rol de base de datos que se va comprobar. role es sysname.
' database_principal '
Nombre del usuario de la base de datos, rol de base de datos o rol de aplicación que se va a comprobar.
database_principal es sysname, con un valor predeterminado NULL. Si no se especifica ningún valor, el resultado
se basa en el contexto de ejecución actual. Si el parámetro contiene la palabra NULL, se devolverá NULL.

Tipos devueltos
int

VALOR DEVUELTO DESCRIPCIÓN

0 database_principal no es miembro de role.

1 database_principal es miembro de role.

NULL database_principal o role no es válido o no tiene permiso


para ver la pertenencia a roles.

Notas
Utilice IS_ROLEMEMBER para determinar si el usuario actual puede realizar una acción que necesite los
permisos del rol de base de datos.
Si database_principal está basado en un inicio de sesión de Windows, como Contoso\Mary5, IS_ROLEMEMBER
devuelve NULL, a menos que se haya concedido o denegado a database_principal el acceso directo a SQL Server.
Si el parámetro database_principal opcional no se proporciona y si database_principal se basa en un inicio de
sesión de dominio de Windows, puede ser miembro de un rol de base de datos mediante la pertenencia a un
grupo de Windows. Para resolver estas pertenencias indirectas, IS_ROLEMEMBER solicita al controlador de
dominio información sobre la pertenencia a grupos de Windows. Si no se puede tener acceso al controlador de
dominio o no responde, IS_ROLEMEMBER devuelve información sobre la pertenencia a roles teniendo en cuenta
únicamente al usuario y sus grupos locales. Si el usuario especificado no es el usuario actual, el valor devuelto por
IS_ROLEMEMBER podría diferir de la última actualización de datos del autenticador (por ejemplo, Active
Directory) en SQL Server.
Si se proporciona el parámetro database_principal opcional, la entidad de seguridad de base de datos que se está
consultando debe estar presente en ys.database_principals o IS_ROLEMEMBER devolverá NULL. Esto indica que
database_principal no es válido en esta base de datos.
Cuando el parámetro database_principal se basa en un inicio de sesión del dominio o en un grupo de Windows y
no se puede acceder al controlador de dominio, se produce un error en las llamadas a IS_ROLEMEMBER y
podrían devolverse datos incorrectos o incompletos.
Si el controlador de dominio no está disponible, la llamada a IS_ROLEMEMBER devolverá información precisa
cuando se pueda autenticar localmente la entidad de seguridad de Windows, como una cuenta de Windows local
o un inicio de sesión de SQL Server.
IS_ROLEMEMBER siempre devuelve 0 cuando se usa un grupo de Windows como el argumento de entidad de
seguridad de Windows y este grupo de Windows es un miembro de otro grupo de Windows que, a su vez, es
miembro del rol de base de datos especificado.
El Control de cuentas de usuario (UAC ) de Windows Vista y Windows Server 2008 también podrían devolver
resultados diferentes. Esto dependería de si el usuario tuvo acceso al servidor como un miembro del grupo de
Windows o como un usuario específico de SQL Server.
Esta función evalúa la pertenencia al rol, no el permiso subyacente. Por ejemplo, el rol fijo de base de datos
db_owner tiene el permiso CONTROL DATABASE. Si el usuario tiene el permiso CONTROL DATABASE pero
no es miembro del rol, esta función informará correctamente de que el usuario no es miembro del rol db_owner,
aunque tenga los mismos permisos.

Funciones relacionadas
Para determinar si el usuario actual es miembro del grupo de Windows o del rol de base de datos de SQL Server
especificados, use IS_MEMBER (Transact-SQL ). Para determinar si un inicio de sesión de SQL Server es miembro
de un rol de servidor, use IS_SRVROLEMEMBER (Transact-SQL ).

Permisos
Se necesita el permiso VIEW DEFINITION en el rol de base de datos.

Ejemplos
En el siguiente ejemplo se indica si el usuario actual es miembro del rol fijo de base de datos db_datareader .

IF IS_ROLEMEMBER ('db_datareader') = 1
print 'Current user is a member of the db_datareader role'
ELSE IF IS_ROLEMEMBER ('db_datareader') = 0
print 'Current user is NOT a member of the db_datareader role'
ELSE IF IS_ROLEMEMBER ('db_datareader') IS NULL
print 'ERROR: The database role specified is not valid.';

Ver también
CREATE ROLE (Transact-SQL )
ALTER ROLE (Transact-SQL )
DROP ROLE (Transact-SQL )
CREATE SERVER ROLE (Transact-SQL )
ALTER SERVER ROLE (Transact-SQL )
DROP SERVER ROLE (Transact-SQL )
IS_MEMBER (Transact-SQL )
IS_SRVROLEMEMBER (Transact-SQL )
Funciones de seguridad (Transact-SQL )
IS_SRVROLEMEMBER (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Indica si en el inicio de sesión de SQL Server es miembro del rol de servidor especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
IS_SRVROLEMEMBER ( 'role' [ , 'login' ] )

Argumentos
' role '
Es el nombre del rol de servidor que se va comprobar. role es sysname.
Los valores válidos para role son los roles de servidor definidos por el usuario y los siguientes roles fijos de
servidor:

sysadmin serveradmin

dbcreator setupadmin

bulkadmin securityadmin

diskadmin Se aplica a: desde SQL Server 2012 (11.x) hasta SQL Server
2017.

public

processadmin

' login '


Es el nombre del inicio de sesión de SQL Server que se va a comprobar. login es de tipo sysname y su valor
predeterminado es NULL. Si no se especifica ningún valor, el resultado se basa en el contexto de ejecución
actual. Si el parámetro contiene la palabra NULL, se devolverá NULL.

Tipos devueltos
int

VALOR DEVUELTO DESCRIPCIÓN


VALOR DEVUELTO DESCRIPCIÓN

0 login no es miembro del grupo role.

En Base de datos SQL de Azure, esta instrucción siempre


devuelve 0.

1 login es miembro del grupo role.

NULL role o login no son válidos o no tienen permiso para ver la


pertenencia a roles.

Notas
Use IS_SRVROLEMEMBER para determinar si el usuario actual puede realizar una acción que necesite los
permisos del rol de servidor.
Si se especifica un inicio de sesión de Windows, como Contoso\María5, para login, IS_SRVROLEMEMBER
devuelve NULL, a menos que se haya concedido o denegado el acceso directo a SQL Server al inicio de sesión.
Si no se proporciona el parámetro login opcional y login es un inicio de sesión de dominio de Windows, puede
ser un miembro del rol fijo de servidor mediante la pertenencia a un grupo de Windows. Para resolver estas
pertenencias indirectas, IS_SRVROLEMEMBER solicita al controlador de dominio información sobre la
pertenencia a grupos de Windows. Si no se puede tener acceso al controlador de dominio o este no responde,
IS_ROLEMEMBER devuelve información sobre la pertenencia a roles teniendo en cuenta únicamente al
usuario y sus grupos locales. Si el usuario especificado no es el usuario actual, el valor devuelto por
IS_SRVROLEMEMBER podría diferir de la última actualización de datos del autenticador (por ejemplo, Active
Directory) en SQL Server.
Si se proporciona el parámetro de inicio de sesión opcional, el inicio de sesión de Windows que se consulta se
debe encontrar en sys.server_principals o IS_SRVROLEMEMBER devolverá NULL. Esto indica que el inicio de
sesión no es válido.
Cuando el parámetro de inicio de sesión es un inicio de sesión del dominio o está basado en un grupo de
Windows y el controlador de dominio no es accesible, se producirá un error en las llamadas a
IS_SRVROLEMEMBER y podrían devolverse datos incorrectos o incompletos.
Si el controlador de dominio no está disponible, la llamada a IS_SRVROLEMEMBER devolverá la información
precisa cuando se puede autenticar el principio de Windows localmente, como una cuenta de Windows local o
un inicio de sesión SQL Server.
IS_SRVROLEMEMBER devuelve siempre 0 cuando se usa un grupo de Windows como el argumento de inicio
de sesión y este grupo de Windows es un miembro de otro grupo de Windows que, a su vez, es miembro del rol
de servidor especificado.
El valor de Control de cuentas de usuario (UAC ) también puede provocar que se devuelvan resultados
diferentes. Esto dependería de si el usuario tuvo acceso al servidor como un miembro del grupo de Windows o
como un usuario específico de SQL Server.
Esta función evalúa la pertenencia al rol, no el permiso subyacente. Por ejemplo, el rol fijo de servidor sysadmin
tiene el permiso CONTROL SERVER. Si el usuario tiene el permiso CONTROL SERVER pero pertenece al rol,
esta función informará correctamente de que el usuario no es miembro del rol sysadmin, aunque tenga los
mismos permisos.

Funciones relacionadas
Para determinar si el usuario actual es miembro del grupo de Windows o del rol de base de datos de SQL
Server especificados, use IS_MEMBER (Transact-SQL ). Para determinar si un inicio de sesión de SQL Server es
miembro de un rol de base de datos, use IS_ROLEMEMBER (Transact-SQL ).

Permisos
Requiere el permiso VIEW DEFINITION en el rol de servidor.

Ejemplos
En el siguiente ejemplo se indica si el inicio de sesión de SQL Server para el usuario actual es miembro del rol
fijo de servidor sysadmin .

IF IS_SRVROLEMEMBER ('sysadmin') = 1
print 'Current user''s login is a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') = 0
print 'Current user''s login is NOT a member of the sysadmin role'
ELSE IF IS_SRVROLEMEMBER ('sysadmin') IS NULL
print 'ERROR: The server role specified is not valid.';

En este ejemplo se indica si el inicio de sesión de dominio Pat es miembro del rol fijo de servidor diskadmin.

SELECT IS_SRVROLEMEMBER('diskadmin', 'Contoso\Pat');

Ver también
IS_MEMBER (Transact-SQL )
Funciones de seguridad (Transact-SQL )
LOGINPROPERTY (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve información sobre la configuración de la directiva de inicio de sesión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
LOGINPROPERTY ( 'login_name' , 'property_name' )

Argumentos
login_name
Es el nombre de un inicio de sesión de SQL Server para el que se devolverá el estado de la propiedad login.
propertyname
Es una expresión que contiene la información de propiedad que se va a devolver para el inicio de sesión.
propertyname puede ser uno de los valores siguientes.

VALOR DESCRIPCIÓN

BadPasswordCount Devuelve el número de intentos consecutivos de inicio de


sesión con una contraseña incorrecta.

BadPasswordTime Devuelve la hora del último intento de inicio de sesión con una
contraseña incorrecta.

DaysUntilExpiration Devuelve el número de días que faltan para que expire la


contraseña.

DefaultDatabase Devuelve la base de datos predeterminada de inicio de sesión


de SQL Server tal y como se almacena en los metadatos, o
master si no se ha especificado ninguna base de datos.
Devuelve NULL para los usuarios que no se han autenticado a
través de SQL Server (como los usuarios autenticados a través
de Windows).

DefaultLanguage Devuelve el idioma predeterminado de inicio de sesión tal y


como se almacena en los metadatos. Devuelve NULL para los
usuarios que no se han autenticado a través de SQL Server
(como los usuarios autenticados a través de Windows).

HistoryLength Devuelve el número de contraseñas comprobadas para el


inicio de sesión con el mecanismo de imposición de la directiva
de contraseñas. 0 si la directiva de contraseñas no se exige. La
exigencia de aplicar la directiva de contraseñas se vuelve a
iniciar con 1.
VALOR DESCRIPCIÓN

IsExpired Indica si el inicio de sesión ha expirado.

IsLocked Indica si el inicio de sesión está bloqueado.

IsMustChange Indica si el inicio de sesión debe cambiar la contraseña la


próxima vez que se conecte.

LockoutTime Devuelve la fecha en la que se bloqueó el inicio de sesión de


SQL Server por haber superado el número permitido de
intentos de inicio de sesión erróneos.

PasswordHash Devuelve el hash de la contraseña.

PasswordLastSetTime Devuelve la fecha en la que se estableció la contraseña actual.

PasswordHashAlgorithm Devuelve el algoritmo de hash utilizado para la contraseña.

Devuelve
El tipo de datos depende del valor solicitado.
IsLocked, IsExpired e IsMustChange son de tipo int.
1 si el inicio de sesión está en el estado especificado.
0 si el inicio de sesión está en el estado especificado.
BadPasswordCount e HistoryLength son de tipo int.
BadPasswordTime, LockoutTime, PasswordLastSetTime son de tipo datetime.
PasswordHash es de tipo varbinary.
NULL si el inicio de sesión no es un inicio de sesión de SQL Server válido.
DaysUntilExpiration es de tipo int.
0 si el inicio de sesión está expirado o si expirará en el día en que se hace la consulta.
-1 si la directiva de seguridad local de Windows determina que la contraseña nunca expira.
NULL si se ha desactivado CHECK_POLICY o CHECK_EXPIRATION para un inicio de sesión, o si el sistema
operativo no admite la directiva de contraseñas.
PasswordHashAlgorithm es de tipo int.
0 si es un hash SQL7.0
1 si es un hash SHA-1
2 si es un hash SHA-2
NULL si el inicio de sesión no es un inicio de sesión de SQL Server válido.

Notas
Esta función integrada devuelve información sobre la configuración de la directiva de contraseñas de un inicio de
sesión de SQL Server. Los nombres de las propiedades no distinguen mayúsculas de minúsculas, por lo que
nombres de propiedades como BadPasswordCount y badpasswordcount son equivalentes. Los valores de las
propiedades PasswordHash, PasswordHashAlgorithm y PasswordLastSetTime están disponibles en todas las
configuraciones compatibles de SQL Server, pero las demás propiedades solo están disponibles cuando se ejecuta
SQL Server en Windows Server 2003 y tanto CHECK_POLICY como CHECK_EXPIRATION están habilitadas.
Para obtener más información, vea Password Policy.

Permisos
Requiere permiso VIEW en el inicio de sesión. También se necesita permiso CONTROL SERVER para solicitar el
hash de contraseña.

Ejemplos
A. Comprobar si se debe cambiar la contraseña de un inicio de sesión
En el ejemplo siguiente se comprueba si el inicio de sesión John3 de SQL Server debe cambiar la contraseña la
próxima vez que se conecte a una instancia de SQL Server.

SELECT LOGINPROPERTY('John3', 'IsMustChange');


GO

B. Comprobar si un inicio de sesión está bloqueado


En el ejemplo siguiente se comprueba si el inicio de sesión John3 de SQL Server está bloqueado.

SELECT LOGINPROPERTY('John3', 'IsLocked');


GO

Ver también
CREATE LOGIN (Transact-SQL )
sys.server_principals (Transact-SQL )
ORIGINAL_LOGIN (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre del inicio de sesión que se conectó a la instancia de SQL Server. Puede utilizar esta función
para devolver la identidad del inicio de sesión original en sesiones en las que hay varios cambios de contexto
explícitos o implícitos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ORIGINAL_LOGIN( )

Tipos devueltos
sysname

Notas
Esta función puede resultar útil para la auditoría de la identidad del contexto de conexión original. Mientras que
funciones como SESSION_USER y CURRENT_USER devuelven el contexto de ejecución actual,
ORIGINAL_LOGIN devuelve la identidad del inicio de sesión que se conectó en primer lugar a la instancia de SQL
Server en esa sesión.
Devuelve NULL en Base de datos SQL de Azure.

Ejemplos
El ejemplo siguiente cambia el contexto de ejecución de la sesión actual desde el solicitante de las instrucciones
para login1 . Las funciones SUSER_SNAME y ORIGINAL_LOGIN se utilizan para devolver el usuario de la sesión actual
(el usuario al que se cambió el contexto), y la cuenta de inicio de sesión original.
USE AdventureWorks2012;
GO
--Create a temporary login and user.
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';
CREATE USER user1 FOR LOGIN login1;
GO
--Execute a context switch to the temporary login account.
DECLARE @original_login sysname;
DECLARE @current_context sysname;
EXECUTE AS LOGIN = 'login1';
SET @original_login = ORIGINAL_LOGIN();
SET @current_context = SUSER_SNAME();
SELECT 'The current executing context is: '+ @current_context;
SELECT 'The original login in this session was: '+ @original_login
GO
-- Return to the original execution context
-- and remove the temporary principal.
REVERT;
GO
DROP LOGIN login1;
DROP USER user1;
GO

Ver también
EXECUTE AS (Transact-SQL )
REVERT (Transact-SQL )
PERMISSIONS (Transact-SQL)
18/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor que contiene un mapa de bits que indica los permisos del usuario actual sobre una instrucción,
objeto o columna.
Importante Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión
futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto
modificar las aplicaciones que actualmente la utilizan. Use en su lugar fn_my_permissions y Has_Perms_By_Name.
El uso continuado de la función PERMISSIONS puede producir un rendimiento más lento.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PERMISSIONS ( [ objectid [ , 'column' ] ] )

Argumentos
objectid
Es el Id. de un elemento protegible. Si no se especifica objectid, el valor de mapa de bits contiene permisos de
instrucción para el usuario actual; en caso contrario, contiene permisos sobre el elemento protegible para el
usuario actual. El elemento protegible especificado se debe encontrar en la base de datos actual. Use la función
OBJECT_ID para averiguar el valor de objectid.
' column '
Es el nombre opcional de la columna cuya información de permisos se devuelve. Debe ser un nombre de columna
válido de la tabla especificada con objectid.

Tipos devueltos
int

Notas
Se puede utilizar PERMISSIONS para determinar si el usuario actual cuenta con los permisos necesarios para
ejecutar una instrucción o para otorgar, con GRANT, un permiso a otro usuario.
La información de permisos devuelta es un mapa de bits de 32 bits.
Los 16 bits inferiores reflejan permisos concedidos al usuario y también permisos que se aplican a grupos de
Windows o a roles fijos de servidor de los que es miembro el usuario actual. Por ejemplo, si se devuelve el valor 66
(valor hexadecimal 0x42) cuando no se especifica objectid, indica que el usuario tiene permiso para ejecutar las
instrucciones CREATE TABLE (valor decimal 2) y BACKUP DATABASE (valor decimal 64).
Los 16 bits superiores reflejan los permisos que el usuario puede otorgar a otros usuarios con la instrucción
GRANT. Los 16 bits superiores se interpretan exactamente de la misma forma que los 16 bits inferiores descritos
en las tablas siguientes, excepto en que están desplazados 16 bits hacia la izquierda (multiplicados por 65.536). Por
ejemplo, 0x8 (valor decimal 8) es el bit que indica el permiso INSERT cuando se especifica objectid. Por su parte,
0x80000 (valor decimal 524288) indica que se puede usar el permiso GRANT INSERT, porque 524288 = 8 x
65536.
Debido a la pertenencia a roles, un usuario que no tiene permiso para ejecutar una instrucción puede conceder ese
permiso a otro usuario.
En la siguiente tabla se muestran los bits usados para los permisos sobre instrucciones (no se especifica objectid).

BIT (DEC) BIT (HEX) PERMISO DE LA INSTRUCCIÓN

1 0x1 CREATE DATABASE (solo base de datos


maestra)

2 0x2 CREATE TABLE

4 0x4 CREATE PROCEDURE

8 0x8 CREATE VIEW

16 0x10 CREATE RULE

32 0x20 CREATE DEFAULT

64 0x40 BACKUP DATABASE

128 0x80 BACKUP LOG

256 0x100 Reservado

En la siguiente tabla se indican los bits usados para los permisos de objetos que se devuelven cuando solo se
especifica objectid.

BIT (DEC) BIT (HEX) PERMISO DE LA INSTRUCCIÓN

1 0x1 SELECT ALL

2 0x2 UPDATE ALL

4 0x4 REFERENCES ALL

8 0x8 INSERT

16 0x10 Delete

32 0x20 EXECUTE (solo procedimientos)

4096 0x1000 SELECT ANY (al menos una columna)

8192 0x2000 UPDATE ANY

16384 0x4000 REFERENCES ANY


En la siguiente tabla se muestran los bits usados para los permisos de objeto de nivel de columnas, devueltos
cuando se especifican objectid y columna.

BIT (DEC) BIT (HEX) PERMISO DE LA INSTRUCCIÓN

1 0x1 SELECT

2 0x2 UPDATE

4 0x4 REFERENCES

Se devuelve NULL cuando alguno de los parámetros especificados es NULL o no es válido (por ejemplo, un
objectid o columna que no existen). Los valores de bits para permisos que no son aplicables (por ejemplo, el
permiso EXECUTE, bit 0x20,) para una tabla, no están definidos.
Puede usar el operador de bits AND (&) para determinar cada bit establecido en el mapa de bits que se devuelve
mediante la función PERMISSIONS.
También puede usar el procedimiento almacenado de sistema sp_helprotect para obtener una lista de permisos
para un usuario de la base de datos actual.

Ejemplos
A. Usar la función PERMISSIONS con permisos de instrucciones
En el siguiente ejemplo se determina si el usuario actual puede ejecutar la instrucción CREATE TABLE .

IF PERMISSIONS()&2=2
CREATE TABLE test_table (col1 INT)
ELSE
PRINT 'ERROR: The current user cannot create a table.';

B. Usar la función PERMISSIONS con permisos de objeto


En el siguiente ejemplo se determina si el usuario actual puede insertar una fila de datos en la tabla Address de la
base de datos AdventureWorks2012 .

IF PERMISSIONS(OBJECT_ID('AdventureWorks2012.Person.Address','U'))&8=8
PRINT 'The current user can insert data into Person.Address.'
ELSE
PRINT 'ERROR: The current user cannot insert data into Person.Address.';

C. Usar la función PERMISSIONS con permisos que se pueden otorgar


En el siguiente ejemplo se determina si el usuario actual puede otorgar a otro usuario el permiso INSERT en la
tabla Address de la base de datos AdventureWorks2012 .

IF PERMISSIONS(OBJECT_ID('AdventureWorks2012.Person.Address','U'))&0x80000=0x80000
PRINT 'INSERT on Person.Address is grantable.'
ELSE
PRINT 'You may not GRANT INSERT permissions on Person.Address.';

Ver también
DENY (Transact-SQL )
GRANT (Transact-SQL )
OBJECT_ID (Transact-SQL )
REVOKE (Transact-SQL )
sp_helprotect (Transact-SQL )
Funciones del sistema (Transact-SQL )
PWDENCRYPT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor hash de la contraseña de SQL Server correspondiente al valor de entrada que usa la versión
actual del algoritmo de hash de contraseñas.
PWDENCRYPT es una función antigua y puede que no se admita en una versión futura de SQL Server. En
cambio, puede usar HASHBYTES. HASHBYTES proporciona más algoritmos de hash.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PWDENCRYPT ( 'password' )

Argumentos
password
Es la contraseña que se va a cifrar. password es sysname.

Tipos devueltos
varbinary(128)

Permisos
PWDENCRYPT está disponible al público.

Ver también
Funciones de seguridad (Transact-SQL )
PWDCOMPARE (Transact-SQL )
PWDCOMPARE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Obtiene el valor hash de una contraseña y lo compara con el de otra existente. PWDCOMPARE se puede usar
para buscar contraseñas de inicio de sesión de SQL Server en blanco o contraseñas poco seguras comunes.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PWDCOMPARE ( 'clear_text_password'
, password_hash
[ , version ] )

Argumentos
' clear_text_password '
Es la contraseña sin cifrar. clear_text_password es sysname (nvarchar(128)).
password_hash
Es el valor hash de cifrado de una contraseña. password_hash es varbinary(128).
version
Parámetro desusado que se puede establecer en 1 si password_hash representa un valor de un inicio de sesión
anterior a SQL Server 2000 (8.x) que se migró a Resultado de o posterior, pero que nunca se convirtió al sistema
de SQL Server 2000 (8.x). version es int.
Cau t i on

Este parámetro se proporciona por compatibilidad con las versiones anteriores, pero se omite porque los blobs de
hash de contraseña contienen ahora su propia descripción de versión. Esta característica se quitará en la versión
siguiente de Microsoft SQL Server. No utilice esta característica en nuevos trabajos de desarrollo y modifique lo
antes posible las aplicaciones que actualmente la utilizan.

Tipos devueltos
int
Devuelve 1 si el valor hash de clear_text_password coincide con el parámetro password_hash y 0 si no coincide.

Notas
La función PWDCOMPARE no es una amenaza contra la seguridad de los valores hash de las contraseñas porque
podría realizarse la misma prueba intentando iniciar sesión con la contraseña proporcionada como primer
parámetro.
PWDCOMPARE no se puede usar con las contraseñas de usuarios de base de datos independiente. No hay una
base de datos independiente equivalente.
Permisos
PWDENCRYPT está disponible al público.
Se requiere el permiso CONTROL SERVER para examinar la columna password_hash de sys.sql_logins.

Ejemplos
A. Identificar los inicios de sesión que no tienen contraseñas
El ejemplo siguiente identifica los inicios de sesión de SQL Server que no tienen contraseñas.

SELECT name FROM sys.sql_logins


WHERE PWDCOMPARE('', password_hash) = 1 ;

B. Buscar contraseñas comunes


Para buscar contraseñas comunes que desee identificar y cambiar, especifique la contraseña como primer
parámetro. Por ejemplo, ejecute la instrucción siguiente para buscar una contraseña especificada como password .

SELECT name FROM sys.sql_logins


WHERE PWDCOMPARE('password', password_hash) = 1 ;

Ver también
PWDENCRYPT (Transact-SQL )
Funciones de seguridad (Transact-SQL )
SESSION_USER (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
SESSION_USER devuelve el nombre de usuario del contexto actual en la base de datos actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SESSION_USER

Tipos devueltos
nvarchar(128)

Notas
Utilice SESSION_USER con restricciones DEFAULT en las instrucciones CREATE TABLE o ALTER TABLE, o
utilícela como cualquier función estándar. SESSION_USER se puede insertar en una tabla cuando no se
especifica un valor predeterminado. Esta función no toma ningún argumento. SESSION_USER se puede utilizar
en consultas.
Si se llama a SESSION_USER después de un cambio de contexto, SESSION_USER devolverá el nombre de
usuario del contexto representado.

Ejemplos
A. Utilizar SESSION_USER para devolver el nombre de usuario de la sesión actual
En el siguiente ejemplo se declara una variable como nchar , se le asigna el valor actual de SESSION_USER y, a
continuación, se imprime la variable con una descripción de texto.

DECLARE @session_usr nchar(30);


SET @session_usr = SESSION_USER;
SELECT 'This session''s current user is: '+ @session_usr;
GO

Éste es el conjunto de resultados cuando el usuario de la sesión es Surya :

--------------------------------------------------------------
This session's current user is: Surya

(1 row(s) affected)

B. Utilizar SESSION_USER con restricciones DEFAULT


En el siguiente ejemplo se crea una tabla que utiliza SESSION_USER como una restricción DEFAULT para el nombre
de la persona que registra la recepción de un envío.
USE AdventureWorks2012;
GO
CREATE TABLE deliveries3
(
order_id int IDENTITY(5000, 1) NOT NULL,
cust_id int NOT NULL,
order_date smalldatetime NOT NULL DEFAULT GETDATE(),
delivery_date smalldatetime NOT NULL DEFAULT
DATEADD(dd, 10, GETDATE()),
received_shipment nchar(30) NOT NULL DEFAULT SESSION_USER
);
GO

Los registros agregados a la tabla se mostrarán con el nombre de usuario del usuario actual. En este ejemplo,
Wanida , Sylvester y Alejandro comprueban la recepción de los envíos. Se puede simular si se cambia el
contexto del usuario con EXECUTE AS .

EXECUTE AS USER = 'Wanida'


INSERT deliveries3 (cust_id)
VALUES (7510);
INSERT deliveries3 (cust_id)
VALUES (7231);
REVERT;
EXECUTE AS USER = 'Sylvester'
INSERT deliveries3 (cust_id)
VALUES (7028);
REVERT;
EXECUTE AS USER = 'Alejandro'
INSERT deliveries3 (cust_id)
VALUES (7392);
INSERT deliveries3 (cust_id)
VALUES (7452);
REVERT;
GO

La siguiente consulta selecciona toda la información de la tabla deliveries3 .

SELECT order_id AS 'Order #', cust_id AS 'Customer #',


delivery_date AS 'When Delivered', received_shipment
AS 'Received By'
FROM deliveries3
ORDER BY order_id;
GO

El conjunto de resultados es el siguiente.

Order # Customer # When Delivered Received By


-------- ---------- ------------------- -----------
5000 7510 2005-03-16 12:02:14 Wanida
5001 7231 2005-03-16 12:02:14 Wanida
5002 7028 2005-03-16 12:02:14 Sylvester
5003 7392 2005-03-16 12:02:14 Alejandro
5004 7452 2005-03-16 12:02:14 Alejandro

(5 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Usar SESSION_USER para devolver el nombre de usuario de la sesión actual
En el siguiente ejemplo se devuelve la sesión de usuario de la sesión actual.

SELECT SESSION_USER;

Ver también
ALTER TABLE (Transact-SQL )
CREATE TABLE (Transact-SQL )
CURRENT_TIMESTAMP (Transact-SQL )
CURRENT_USER (Transact-SQL )
SYSTEM_USER (Transact-SQL )
Funciones del sistema (Transact-SQL )
USER (Transact-SQL )
USER_NAME (Transact-SQL )
SESSIONPROPERTY (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la configuración de las opciones SET de una sesión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SESSIONPROPERTY (option)

Argumentos
Opción
Es la configuración de opción actual para esta sesión. option puede ser cualquiera de los siguientes valores.

OPCIÓN DESCRIPCIÓN

ANSI_NULLS Especifica si se aplica el comportamiento conforme a ISO de


iguales(=) y No iguales a (<>) cuando se utilizan con valores
null.

1 = ON

0 = OFF

ANSI_PADDING Controla el modo en que la columna almacena valores más


cortos que el tamaño que tiene definido y cómo almacena
valores con espacios en blanco finales en los datos binarios y
de caracteres.

1 = ON

0 = OFF

ANSI_WARNINGS Especifica si se aplica el comportamiento del estándar ISO de


provocar mensajes de error o advertencias para ciertas
condiciones, incluyendo los errores de división por 0 y de
desbordamiento.

1 = ON

0 = OFF
OPCIÓN DESCRIPCIÓN

ARITHABORT Determina si se cancela una consulta cuando se produce un


error de desbordamiento o división por cero durante su
ejecución.

1 = ON

0 = OFF

CONCAT_NULL_YIELDS_ NULL Determina si los resultados de la concatenación se tratan


como valores NULL o como valores de cadena vacía.

1 = ON

0 = OFF

NUMERIC_ROUNDABORT Especifica si se generan mensajes de error y advertencias


cuando el redondeo en una expresión provoca una pérdida de
precisión.

1 = ON

0 = OFF

QUOTED_IDENTIFIER Especifica si las reglas de ISO en cuanto a si hay que seguir las
comillas delimitadoras de identificadores y cadenas literales.

1 = ON

0 = OFF

<Cualquier otra cadena> NULL = La entrada no es válida.

Tipos devueltos
sql_variant

Notas
Las opciones SET se indican mediante la combinación de las opciones de nivel de servidor, de nivel de base de
datos y especificadas por el usuario.

Ejemplos
En el siguiente ejemplo se devuelve la configuración de la opción CONCAT_NULL_YIELDS_NULL .

SELECT SESSIONPROPERTY ('CONCAT_NULL_YIELDS_NULL')

Ver también
sql_variant (Transact-SQL )
SET ANSI_NULLS (Transact-SQL )
SET ANSI_PADDING (Transact-SQL )
SET ANSI_WARNINGS (Transact-SQL )
SET ARITHABORT (Transact-SQL )
SET CONCAT_NULL_YIELDS_NULL (Transact-SQL )
SET NUMERIC_ROUNDABORT (Transact-SQL )
SET QUOTED_IDENTIFIER (Transact-SQL )
SUSER_ID (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de la versión 2008) Azure SQL Database (solo Instancia
Administrada) Azure SQL Data Warehouse Almacenamiento de datos paralelos
Devuelve el número de identificación de inicio de sesión del usuario.

IMPORTANT
En Instancia administrada de Azure SQL Database, esta característica de T-SQL tiene ciertos cambios de comportamiento.
Vea Diferencias de T-SQL en Instancia administrada de Azure SQL Database para obtener más información sobre los cambios
de comportamiento de T-SQL.

NOTE
A partir de Resultado de, SUSER_ID devuelve el valor incluido como principal_id en la vista de catálogo
sys.server_principals.

Convenciones de sintaxis de Transact-SQL

Sintaxis
SUSER_ID ( [ 'login' ] )

Argumentos
' login '
Nombre de inicio de sesión del usuario. login es nchar. Si se especifica login como char, login se convierte
implícitamente en nchar. login puede ser cualquier inicio de sesión de SQL Server o cualquier grupo o usuario de
Windows con permiso para conectarse con una instancia de SQL Server. Si no se especifica login, se devuelve el
número de identificación de inicio de sesión para el usuario actual. Si el parámetro contiene la palabra NULL, se
devolverá NULL.

Tipos devueltos
int

Notas
SUSER_ID devuelve un número de identificación solo para los inicios de sesión aprovisionados de forma explícita
en SQL Server. Este Id. se utiliza en SQL Server para realizar un seguimiento de la propiedad y los permisos. Este
Id. no equivale al SID del inicio de sesión devuelto por SUSER_SID. Si login es un inicio de sesión de SQL Server,
el SID se asigna a un GUID. Si login es un inicio de sesión o un grupo de Windows, el SID se asigna a un
identificador de seguridad de Windows.
SUSER_SID solo devuelve el SUID de los inicios de sesión que tengan una entrada en la tabla de sistema
syslogins.
Es posible utilizar funciones de sistema en la lista de selección, en la cláusula WHERE y en cualquier lugar donde
se admita una expresión, pero deberán ir seguidas siempre de paréntesis incluso si no se especifica ningún
parámetro.

Ejemplos
En el ejemplo siguiente se obtiene el número de identificación del nombre de inicio de sesión sa .

SELECT SUSER_ID('sa');

Ver también
sys.server_principals (Transact-SQL )
SUSER_SID (Transact-SQL )
Funciones del sistema (Transact-SQL )
SUSER_NAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de identificación de inicio de sesión del usuario.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SUSER_NAME ( [ server_user_id ] )

Argumentos
server_user_id
Es el número de identificación de inicio de sesión del usuario. server_user_id, que es opcional, es de tipo int.
server_user_id puede ser el número de identificación de inicio de sesión de cualquier inicio de sesión de SQL
Server o de cualquier usuario o grupo de Microsoft Windows que tenga permiso para conectarse a una instancia
de SQL Server. Si no se especifica server_user_id, se devuelve el nombre de identificación de inicio de sesión para
el usuario actual. Si el parámetro contiene la palabra NULL, se devolverá NULL.

Tipos devueltos
nvarchar(128)

Notas
En SQL Server versión 7.0, el número de identificación de seguridad (SID ) reemplaza al número de identificación
de usuario del servidor (SUID ).
SUSER_NAME solo devuelve un nombre de un inicio de sesión que tenga una entrada en la tabla del sistema
syslogins.
SUSER_NAME se puede utilizar en una lista de selección, en una cláusula WHERE y en cualquier lugar donde se
admita una expresión, pero deberá ir seguido siempre de paréntesis, incluso si no se especifica ningún parámetro.

Ejemplos
En el ejemplo siguiente se devuelve el nombre de identificación de inicio de sesión del usuario con el número de
identificación de inicio de sesión 1 .

SELECT SUSER_NAME(1);

Ver también
SUSER_ID (Transact-SQL )
Entidades de seguridad (motor de base de datos)
SUSER_SID (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de identificación de seguridad (SID ) que corresponde al nombre de inicio de sesión
especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SUSER_SID ( [ 'login' ] [ , Param2 ] )

Argumentos
' login '
Se aplica a: de SQL Server 2008 a SQL Server 2017
Nombre de inicio de sesión del usuario. login es sysname. login, que es opcional, puede ser un inicio de sesión de
SQL Server o un usuario o un grupo de Microsoft Windows. Si no se especifica login, se devuelve información
sobre el contexto de seguridad actual. Si el parámetro contiene la palabra NULL, se devolverá NULL.
Param2
Se aplica a: de SQL Server 2012 (11.x) a SQL Server 2017
Especifica si se valida el nombre de inicio de sesión. Param2 es de tipo int y es opcional. Cuando Param2 es 0, no
se valida el nombre de inicio de sesión. Cuando Param2 no se especifica como 0, se comprueba el nombre de
inicio de sesión de Windows para ver si coincide exactamente con el nombre de inicio de sesión almacenado en
SQL Server.

Tipos devueltos
varbinary(85)

Notas
SUSER_SID puede utilizarse como una restricción DEFAULT en ALTER TABLE o CREATE TABLE. Se puede
utilizar SUSER_SID en una lista de selección, en una cláusula WHERE y en cualquier lugar en el que se permita
una expresión. SUSER_SID siempre debe ir seguido de paréntesis, aunque no se especifique ningún parámetro.
Cuando se llama sin ningún argumento, SUSER_SID devuelve el SID del contexto de seguridad actual. Cuando se
llama sin ningún argumento en un lote que ha cambiado de contexto mediante EXECUTE AS, SUSER_SID
devuelve el SID del contexto suplantado. Si se llama desde un contexto suplantado,
SUSER_SID (ORIGINAL_LOGIN ()) devuelve el SID del contexto original.
Cuando la intercalación de SQL Server y la intercalación de Windows son diferentes, SUSER_SID puede producir
un error cuando SQL Server y Windows almacenan el inicio de sesión en un formato diferente. Por ejemplo, si el
equipo con Windows TestComputer tiene el inicio de sesión User y SQL Server almacena el inicio de sesión como
TESTCOMPUTER\User, la búsqueda del inicio de sesión TestComputer\User puede que no resuelva el nombre de
inicio de sesión correctamente. Para omitir esta validación del nombre de inicio de sesión, use Param2. Las
distintas intercalaciones a menudo son una causa del error 15401 de SQL Server:
Windows NT user or group '%s' not found. Check the name again.

Ejemplos
A. Usar SUSER_SID
En el ejemplo siguiente se devuelve el número de identificación de seguridad (SID ) del contexto de seguridad
actual.

SELECT SUSER_SID();

B. Utilizar SUSER_SID con un inicio de sesión específico


En el ejemplo siguiente se devuelve el número de identificación de seguridad del inicio de sesión sa de SQL
Server.
Se aplica a: de SQL Server 2012 (11.x) a SQL Server 2017

SELECT SUSER_SID('sa');
GO

C. Usar SUSER_SID con un nombre de usuario de Windows


En el ejemplo siguiente se devuelve el número de identificación de seguridad del usuario de Windows
London\Workstation1 .

Se aplica a: de SQL Server 2012 (11.x) a SQL Server 2017

SELECT SUSER_SID('London\Workstation1');
GO

D. Usar SUSER_SID como una restricción DEFAULT


En el ejemplo siguiente se utiliza SUSER_SID como restricción DEFAULT en una instrucción CREATE TABLE .

USE AdventureWorks2012;
GO
CREATE TABLE sid_example
(
login_sid varbinary(85) DEFAULT SUSER_SID(),
login_name varchar(30) DEFAULT SYSTEM_USER,
login_dept varchar(10) DEFAULT 'SALES',
login_date datetime DEFAULT GETDATE()
);
GO
INSERT sid_example DEFAULT VALUES;
GO

E. Comparar el nombre de inicio de sesión de Windows con el nombre de inicio de sesión almacenado en SQL
Server
En el ejemplo siguiente se muestra cómo se usa Param2 para obtener el SID de Windows y se utiliza ese SID
como entrada para la función SUSER_SNAME . En el ejemplo se proporciona el inicio de sesión en el formato en que
se almacena en Windows ( TestComputer\User ) y se devuelve en el formato en que se almacena en SQL Server (
TESTCOMPUTER\User .
Se aplica a: de SQL Server 2012 (11.x) a SQL Server 2017

SELECT SUSER_SNAME(SUSER_SID('TestComputer\User', 0));

Ver también
ORIGINAL_LOGIN (Transact-SQL )
CREATE TABLE (Transact-SQL )
binary y varbinary (Transact-SQL )
Funciones del sistema (Transact-SQL )
SUSER_SNAME (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de inicio de sesión asociado a un número de identificación de seguridad (SID ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
SUSER_SNAME ( [ server_user_sid ] )

Argumentos
server_user_sid
Se aplica a: de SQL Server 2008 a SQL Server 2017
Se trata del número de identificación opcional de seguridad del inicio de sesión. server_user_sid es varbinary(85).
server_user_sid puede ser el número de identificación de seguridad de cualquier inicio de sesión de SQL Server, o
de un usuario o grupo de Microsoft Windows. Si no se especifica server_user_sid, se devuelve información acerca
del usuario actual. Si el parámetro contiene la palabra NULL, se devolverá NULL.

Tipos devueltos
nvarchar(128)

Notas
SUSER_SNAME puede usarse como una restricción DEFAULT en ALTER TABLE o CREATE TABLE. Se puede
utilizar SUSER_SNAME en una lista de selección, en la cláusula WHERE y en cualquier lugar en el que se permita
una expresión. SUSER_SNAME siempre debe ir seguida de paréntesis, aunque no se especifique ningún
parámetro.
Si se llama sin un argumento, SUSER_SNAME devuelve el nombre del contexto de seguridad actual. Si se llama
sin un argumento en un lote que ha cambiado de contexto mediante EXECUTE AS, SUSER_SNAME devuelve el
nombre del contexto suplantado. Si se llama desde un contexto suplantado, ORIGINAL_LOGIN devuelve el
nombre del contexto original.

Comentarios para Base de datos SQL de Azure


SUSER_NAME siempre devuelve el nombre de inicio de sesión para el contexto de seguridad actual.
La instrucción SUSER_SNAME no admite la ejecución con un contexto de seguridad suplantado a través de
EXECUTE AS.

Ejemplos
A. Usar SUSER_SNAME
En el ejemplo siguiente se devuelve el nombre de inicio de sesión para el contexto de seguridad actual.

SELECT SUSER_SNAME();
GO

B. Usar SUSER_SNAME con un identificador de seguridad de usuario de Windows


En el siguiente ejemplo se devuelve el nombre de inicio de sesión asociado a un número de identificación de
seguridad de Windows.
Se aplica a: de SQL Server 2008 a SQL Server 2017

SELECT SUSER_SNAME(0x010500000000000515000000a065cf7e784b9b5fe77c87705a2e0000);
GO

C. Usar SUSER_SNAME como una restricción DEFAULT


En el ejemplo siguiente se utiliza SUSER_SNAME como restricción DEFAULT en una instrucción CREATE TABLE .

USE AdventureWorks2012;
GO
CREATE TABLE sname_example
(
login_sname sysname DEFAULT SUSER_SNAME(),
employee_id uniqueidentifier DEFAULT NEWID(),
login_date datetime DEFAULT GETDATE()
);
GO
INSERT sname_example DEFAULT VALUES;
GO

D. Llamar a SUSER_SNAME junto con EXECUTE AS


En este ejemplo se muestra el comportamiento de SUSER_SNAME si se llama desde un contexto suplantado.
Se aplica a: de SQL Server 2008 a SQL Server 2017

SELECT SUSER_SNAME();
GO
EXECUTE AS LOGIN = 'WanidaBenShoof';
SELECT SUSER_SNAME();
REVERT;
GO
SELECT SUSER_SNAME();
GO

Este es el resultado.

sa
WanidaBenShoof
sa

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
E. Usar SUSER_SNAME
En el ejemplo siguiente se obtiene el nombre de inicio de sesión que corresponde al número de identificación de
seguridad con un valor de 0x01 .

SELECT SUSER_SNAME(0x01);
GO

F. Devolución de inicio de sesión actual


En el ejemplo siguiente se devuelve el nombre de inicio de sesión del inicio de sesión actual.

SELECT SUSER_SNAME() AS CurrentLogin;


GO

Ver también
SUSER_SID (Transact-SQL )
Entidades de seguridad (motor de base de datos)
sys.server_principals (Transact-SQL )
EXECUTE AS (Transact-SQL )
SYSTEM_USER (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Permite insertar en una tabla un valor proporcionado por el sistema para el inicio de sesión actual cuando no se
especifica ningún valor predeterminado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SYSTEM_USER

Tipos devueltos
nchar

Notas
En las instrucciones CREATE TABLE y ALTER TABLE puede utilizar la función SYSTEM_USER con restricciones
DEFAULT. También puede utilizarla como cualquier función estándar.
Si el nombre de usuario y el nombre de inicio de sesión con diferentes, SYSTEM_USER devuelve el nombre de
inicio de sesión.
Si el usuario actual ha iniciado la sesión en SQL Server con la autenticación de Windows, SYSTEM_USER
devuelve el nombre de identificación del inicio de sesión de Windows con el formato:
DOMAIN\user_login_name. Sin embargo, si el usuario actual ha iniciado la sesión en SQL Server con la
autenticación de SQL Server, SYSTEM_USER devuelve el nombre de identificación de inicio de sesión en SQL
Server, por ejemplo WillisJo para un usuario que ha iniciado la sesión como WillisJo .
SYSTEM_USER devuelve el nombre del contexto de ejecución actual. Si se ha usado la instrucción EXECUTE AS
para cambiar el contexto, SYSTEM_USER devuelve el nombre del contexto suplantado.

Ejemplos
A. Usar SYSTEM_USER para devolver el nombre de usuario actual del sistema
En el siguiente ejemplo se declara una variable char , se almacena en ella el valor actual de SYSTEM_USER y, a
continuación, se imprime el valor almacenado en la variable.

DECLARE @sys_usr char(30);


SET @sys_usr = SYSTEM_USER;
SELECT 'The current system user is: '+ @sys_usr;
GO

El conjunto de resultados es el siguiente.


----------------------------------------------------------
The current system user is: WillisJo

(1 row(s) affected)

B. Usar SYSTEM_USER con restricciones DEFAULT


En el siguiente ejemplo se crea una tabla con SYSTEM_USER como una restricción DEFAULT para la columna
SRep_tracking_user .

USE AdventureWorks2012;
GO
CREATE TABLE Sales.Sales_Tracking
(
Territory_id int IDENTITY(2000, 1) NOT NULL,
Rep_id int NOT NULL,
Last_sale datetime NOT NULL DEFAULT GETDATE(),
SRep_tracking_user varchar(30) NOT NULL DEFAULT SYSTEM_USER
);
GO
INSERT Sales.Sales_Tracking (Rep_id)
VALUES (151);
INSERT Sales.Sales_Tracking (Rep_id, Last_sale)
VALUES (293, '19980515');
INSERT Sales.Sales_Tracking (Rep_id, Last_sale)
VALUES (27882, '19980620');
INSERT Sales.Sales_Tracking (Rep_id)
VALUES (21392);
INSERT Sales.Sales_Tracking (Rep_id, Last_sale)
VALUES (24283, '19981130');
GO

En la siguiente consulta se selecciona toda la información de la tabla Sales_Tracking :

SELECT * FROM Sales_Tracking ORDER BY Rep_id;


GO

El conjunto de resultados es el siguiente.

Territory_id Rep_id Last_sale SRep_tracking_user


----------- ------ -------------------- ------------------
2000 151 Mar 4 1998 10:36AM ArvinDak
2001 293 May 15 1998 12:00AM ArvinDak
2003 21392 Mar 4 1998 10:36AM ArvinDak
2004 24283 Nov 3 1998 12:00AM ArvinDak
2002 27882 Jun 20 1998 12:00AM ArvinDak

(5 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Usar SYSTEM_USER para devolver el nombre de usuario actual del sistema
El siguiente ejemplo devuelve el valor actual de SYSTEM_USER .

SELECT SYSTEM_USER;
Ver también
ALTER TABLE (Transact-SQL )
CREATE TABLE (Transact-SQL )
CURRENT_TIMESTAMP (Transact-SQL )
CURRENT_USER (Transact-SQL )
SESSION_USER (Transact-SQL )
Funciones del sistema (Transact-SQL )
USER (Transact-SQL )
USER (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Permite insertar en una tabla un valor proporcionado por el sistema para el nombre de usuario actual de la base
de datos cuando no se especifica ningún valor predeterminado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
USER

Tipos devueltos
char

Notas
USER ofrece la misma funcionalidad que la función del sistema USER_NAME.
Puede utilizar USER con restricciones DEFAULT en las instrucciones CREATE TABLE o ALTER TABLE, o bien
utilizarla como cualquier función estándar.
USER siempre devuelve el nombre del contexto de actual. Cuando se llama después de una instrucción EXECUTE
AS, USER devuelve el nombre del contexto representado.
Si una entidad de seguridad de Windows ha tenido acceso a la base de datos en forma de miembro de un grupo,
USER devuelve el nombre de la entidad de seguridad de Windows en vez del nombre del grupo.

Ejemplos
A. Utilizar USER para devolver el nombre de usuario de la base de datos
En el siguiente ejemplo se declara una variable como char , se le asigna el valor actual de USER y, a continuación,
se imprime la variable con una descripción de texto.

DECLARE @usr char(30)


SET @usr = user
SELECT 'The current user''s database username is: '+ @usr
GO

El conjunto de resultados es el siguiente.

-----------------------------------------------------------------------
The current user's database username is: dbo

(1 row(s) affected)
B. Utilizar USER con restricciones DEFAULT
En el siguiente ejemplo se crea una tabla que usa USER como una restricción DEFAULT para el vendedor de una
fila de ventas.

USE AdventureWorks2012;
GO
CREATE TABLE inventory22
(
part_id int IDENTITY(100, 1) NOT NULL,
description varchar(30) NOT NULL,
entry_person varchar(30) NOT NULL DEFAULT USER
)
GO
INSERT inventory22 (description)
VALUES ('Red pencil')
INSERT inventory22 (description)
VALUES ('Blue pencil')
INSERT inventory22 (description)
VALUES ('Green pencil')
INSERT inventory22 (description)
VALUES ('Black pencil')
INSERT inventory22 (description)
VALUES ('Yellow pencil')
GO

Ésta es la consulta para seleccionar toda la información de la tabla inventory22 :

SELECT * FROM inventory22 ORDER BY part_id;


GO

Este es el conjunto de resultados (observe el valor de entry-person ):

part_id description entry_person


----------- ------------------------------ -------------------------
100 Red pencil dbo
101 Blue pencil dbo
102 Green pencil dbo
103 Black pencil dbo
104 Yellow pencil dbo

(5 row(s) affected)

C. Utilizar USER en combinación con EXECUTE AS


En el siguiente ejemplo se muestra el comportamiento de USER cuando se llama en una sesión representada.

SELECT USER;
GO
EXECUTE AS USER = 'Mario';
GO
SELECT USER;
GO
REVERT;
GO
SELECT USER;
GO

El conjunto de resultados es el siguiente.


DBO
Mario
DBO

Ver también
ALTER TABLE (Transact-SQL )
CREATE TABLE (Transact-SQL )
CURRENT_TIMESTAMP (Transact-SQL )
CURRENT_USER (Transact-SQL )
Funciones de seguridad (Transact-SQL )
SESSION_USER (Transact-SQL )
SYSTEM_USER (Transact-SQL )
USER_NAME (Transact-SQL )
USER_ID (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de identificación para un usuario de la base de datos.

IMPORTANT
Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL
Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que
actualmente la utilizan. Use DATABASE_PRINCIPAL_ID en su lugar.

Convenciones de sintaxis de Transact-SQL

Sintaxis
USER_ID ( [ 'user' ] )

Argumentos
user
Es el nombre de usuario que se va a emplear. user es nchar. Si se especifica un valor char, se convierte
implícitamente en nchar. Es obligatorio utilizar paréntesis.

Tipos devueltos
int

Notas
Cuando user se omite, se da por supuesto que es el usuario actual. Si el parámetro contiene la palabra NULL,
devolverá NULL. Cuando se llama a USER_ID después de EXECUTE AS, USER_ID devuelve el identificador del
contexto suplantado.
Cuando una entidad de seguridad de Windows que no se ha asignado a un usuario específico de base de datos
tiene acceso a una base de datos en forma de pertenencia a un grupo, USER_ID devuelve 0 (el identificador de
público). Si este tipo de entidad de seguridad crea un objeto sin especificar un esquema, SQL Server creará un
usuario implícito y un esquema asignados a dicha entidad. El usuario creado en casos como éste no se puede
utilizar para conectarse a la base de datos. Las llamadas a USER_ID efectuadas por la entidad de seguridad de
Windows asignada a un usuario implícito devolverán el identificador de éste.
Se puede utilizar USER_ID en una lista de selección, en una cláusula WHERE y en cualquier lugar en el que se
permita una expresión. Para obtener más información, vea Expresiones (Transact-SQL ).

Ejemplos
En el ejemplo siguiente se devuelve el número de identificación para el usuario AdventureWorks2012 de Harold .

USE AdventureWorks2012;
SELECT USER_ID('Harold');
GO

Ver también
USER_NAME (Transact-SQL )
sys.database_principals (Transact-SQL )
DATABASE_PRINCIPAL_ID (Transact-SQL )
Funciones de seguridad (Transact-SQL )
USER_NAME (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un nombre de usuario de base de datos a partir de un número de identificación especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
USER_NAME ( [ id ] )

Argumentos
id
Es el número de identificación asociado a un usuario de la base de datos. id es int. Es obligatorio utilizar
paréntesis.

Tipos devueltos
nvarchar(256)

Notas
Cuando se omite id, se supone que se trata del usuario actual en el contexto actual. Si el parámetro contiene la
palabra NULL, se devolverá NULL. Cuando se llama a USER_NAME sin especificar un id después de una
instrucción EXECUTE AS, USER_NAME devuelve el nombre del usuario representado. Si una entidad de
seguridad de Windows ha tenido acceso a la base de datos en forma de miembro de un grupo, USER_NAME
devuelve el nombre de la entidad de seguridad de Windows en vez del nombre del grupo.

Ejemplos
A. Usar USER_NAME
En el siguiente ejemplo se devuelve el nombre de usuario del Id. de usuario 13 .

SELECT USER_NAME(13);
GO

B. Usar USER_NAME sin un identificador


En el siguiente ejemplo se busca el nombre del usuario actual sin especificar un identificador.

SELECT USER_NAME();
GO

Este es el conjunto de resultados para un usuario que pertenezca al rol fijo de servidor sysadmin.
------------------------------
dbo

(1 row(s) affected)

C. Usar USER_NAME en la cláusula WHERE


En el siguiente ejemplo se busca la fila en sysusers en la que el nombre sea igual al resultado de aplicar la
función del sistema USER_NAME al número de identificador de usuario 1 .

SELECT name FROM sysusers WHERE name = USER_NAME(1);


GO

El conjunto de resultados es el siguiente.

name
------------------------------
dbo

(1 row(s) affected)

D. Llamar a USER_NAME durante la suplantación con EXECUTE AS


En el siguiente ejemplo se muestra cómo se comporta USER_NAME durante la suplantación.

SELECT USER_NAME();
GO
EXECUTE AS USER = 'Zelig';
GO
SELECT USER_NAME();
GO
REVERT;
GO
SELECT USER_NAME();
GO

El conjunto de resultados es el siguiente.

DBO
Zelig
DBO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
E. Usar USER_NAME sin un identificador
En el siguiente ejemplo se busca el nombre del usuario actual sin especificar un identificador.

SELECT USER_NAME();

Este es el conjunto de resultados para un usuario que tiene la sesión iniciada.


------------------------------
User7

F. Usar USER_NAME en la cláusula WHERE


En el siguiente ejemplo se busca la fila en sysusers en la que el nombre sea igual al resultado de aplicar la
función del sistema USER_NAME al número de identificador de usuario 1 .

SELECT name FROM sysusers WHERE name = USER_NAME(1);

El conjunto de resultados es el siguiente.

name
------------------------------
User7

Ver también
ALTER TABLE (Transact-SQL )
CREATE TABLE (Transact-SQL )
CURRENT_TIMESTAMP (Transact-SQL )
CURRENT_USER (Transact-SQL )
SESSION_USER (Transact-SQL )
Funciones del sistema (Transact-SQL )
SYSTEM_USER (Transact-SQL )
Funciones de cadena (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones escalares realizan una operación sobre un valor de cadena de entrada y devuelven
un valor de cadena o un valor numérico:

ASCII CHAR CHARINDEX

CONCAT CONCAT_WS DIFFERENCE

FORMAT LEFT LEN

LOWER LTRIM NCHAR

PATINDEX QUOTENAME REPLACE

REPLICATE REVERSE RIGHT

RTRIM SOUNDEX SPACE

STR STRING_AGG STRING_ESCAPE

STRING_SPLIT STUFF SUBSTRING

TRANSLATE TRIM UNICODE

UPPER

Todas las funciones de cadena integradas son deterministas, salvo FORMAT . Esto significa que devuelven el
mismo valor siempre que se llamen con un conjunto determinado de valores de entrada. Para más
información sobre el determinismo de las funciones, vea Funciones deterministas y no deterministas.
Cuando se pasan a las funciones de cadena argumentos que no son valores de cadena, el tipo de entrada se
convierte explícitamente en un tipo de datos de texto. Para más información, vea Data Type Conversion
(Database Engine) (Conversión de tipos de datos [motor de base de datos]).

Ver también
Funciones integradas (Transact-SQL )
ASCII (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor del código ASCII del carácter más a la izquierda de una expresión de caracteres.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ASCII ( character_expression )

Argumentos
character_expression
Una expresión de tipo char o varchar.

Tipos de valores devueltos


int

Notas
ASCII significa American Standard Code for Information Interchange. Actúa como un estándar de codificación de
caracteres para los equipos modernos. Para obtener una lista de caracteres ASCII, vea la sección Caracteres
imprimibles de ASCII.

Ejemplos
En este ejemplo se da por supuesto que es un juego de caracteres ASCII y se devuelve el valor ASCII para seis
caracteres.

SELECT ASCII('A') AS A, ASCII('B') AS B,


ASCII('a') AS a, ASCII('b') AS b,
ASCII(1) AS [1], ASCII(2) AS [2];

El conjunto de resultados es el siguiente.

A B a b 1 2
----------- ----------- ----------- ----------- ----------- -----------
65 66 97 98 49 50

Vea también
CHAR (Transact-SQL )
NCHAR (Transact-SQL )
UNICODE (Transact-SQL )
Funciones de cadena (Transact-SQL )
CHAR (Transact-SQL)
18/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función convierte un código ASCII int en un valor de carácter.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CHAR ( integer_expression )

Argumentos
integer_expression
Un entero entre 0 y 255. CHAR devuelve un valor NULL para las expresiones de enteros que están fuera de este
intervalo.

Tipos de valores devueltos


char(1)

Notas
Use CHAR para insertar caracteres de control en las cadenas de caracteres. En esta tabla se muestran algunos
caracteres de control usado con frecuencia.

CARÁCTER DE CONTROL VALOR

Pestaña char(9)

Avance de línea char(10)

Retorno de carro char(13)

Ejemplos
A. Usar ASCII y CHAR para imprimir los valores ASCII de una cadena
En este ejemplo se imprimen el valor y el carácter ASCII de cada carácter de la cadena New Moon .
SET TEXTSIZE 0;
-- Create variables for the character string and for the current
-- position in the string.
DECLARE @position int, @string char(8);
-- Initialize the current position and the string variables.
SET @position = 1;
SET @string = 'New Moon';
WHILE @position <= DATALENGTH(@string)
BEGIN
SELECT ASCII(SUBSTRING(@string, @position, 1)),
CHAR(ASCII(SUBSTRING(@string, @position, 1)))
SET @position = @position + 1
END;
GO

El conjunto de resultados es el siguiente.

----------- -
78 N
----------- -
101 e
----------- -
119 w
----------- -
32
----------- -
77 M
----------- -
111 o
----------- -
111 o
----------- -
110 n

B. Usar CHAR para insertar un carácter de control


En este ejemplo se usa CHAR(13) para imprimir el nombre y la dirección de correo electrónico de un empleado en
líneas independientes cuando la consulta devuelve los resultados en formato de texto. En este ejemplo se usa la
base de datos AdventureWorks2012.

SELECT p.FirstName + ' ' + p.LastName, + CHAR(13) + pe.EmailAddress


FROM Person.Person p JOIN Person.EmailAddress pe
ON p.BusinessEntityID = pe.BusinessEntityID
AND p.BusinessEntityID = 1;
GO

El conjunto de resultados es el siguiente.

Ken Sanchez
ken0@adventure-works.com

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Usar ASCII y CHAR para imprimir los valores ASCII de una cadena
En este ejemplo se da por hecho que hay un juego de caracteres ASCII. Devuelve el valor de carácter de seis
valores numéricos de caracteres ASCII diferentes.

SELECT CHAR(65) AS [65], CHAR(66) AS [66],


CHAR(97) AS [97], CHAR(98) AS [98],
CHAR(49) AS [49], CHAR(50) AS [50];

El conjunto de resultados es el siguiente.

65 66 97 98 49 50
---- ---- ---- ---- ---- ----
A B a b 1 2

D. Usar CHAR para insertar un carácter de control


En este ejemplo se usa CHAR(13) para devolver información de sys.databases en líneas independientes cuando la
consulta devuelve sus resultados como texto.

SELECT name, 'was created on ', create_date, CHAR(13), name, 'is currently ', state_desc
FROM sys.databases;
GO

El conjunto de resultados es el siguiente.

name create_date name state_desc


------------------------------------------------------------
master was created on 2003-04-08 09:13:36.390
master is currently ONLINE
tempdb was created on 2014-01-10 17:24:24.023
tempdb is currently ONLINE
AdventureWorksPDW2012 was created on 2014-05-07 09:05:07.083
AdventureWorksPDW2012 is currently ONLINE

Vea también
ASCII (Transact-SQL )
NCHAR (Transact-SQL )
UNICODE (Transact-SQL )
+ (Concatenación de cadenas) (Transact-SQL )
Funciones de cadena (Transact-SQL )
CHARINDEX (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función busca una expresión de caracteres dentro de una segunda expresión de caracteres, y devuelve la
posición inicial de la primera expresión si se encuentra.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

Argumentos
expressionToFind
Una expresión de caracteres que contiene la secuencia que se va a buscar. expressionToFind tiene un límite de
8000 caracteres.
expressionToSearch
Una expresión de caracteres que se va a buscar.
start_location
Una expresión integer o bigint donde empieza la búsqueda. Si no se especifica start_location, tiene un valor
negativo o un valor cero (0), la búsqueda empieza al principio de expressionToSearch.

Tipos de valores devueltos


bigint si expressionToSearch tiene el tipo de datos nvarchar(max), varbinary(max) o varchar(max); int en
caso contrario.

Notas
Si expressionToFind o expressionToSearch tiene un tipo de datos Unicode (nchar o nvarchar) y la otra expresión
no, la función CHARINDEX convierte esa otra expresión a un tipo de datos Unicode. CHARINDEX no se puede
usar con los tipos de datos image, ntext o text.
Si expressionToFind o expressionToSearch tiene un valor NULL, CHARINDEX devuelve NULL.
Si CHARINDEX no encuentra expressionToFind dentro de expressionToSearch, devuelve 0.
CHARINDEX realiza comparaciones en función de intercalación de entrada. Para realizar una comparación de una
intercalación especificada, use COLL ATE para aplicar una intercalación explícita a la entrada.
La posición inicial devuelta es de base 1, no de base 0.
0x0000 (char(0)) es un carácter no definido en las intercalaciones de Windows y no se puede incluir en
CHARINDEX.
Caracteres adicionales (pares suplentes)
Al usar intercalaciones de SC, start_location y el valor devuelto cuentan los pares suplentes como un carácter, no
como dos. Para más información, consulte Compatibilidad con la intercalación y Unicode.

Ejemplos
A. Devolver la posición inicial de una expresión
Este ejemplo se busca bicycle en la variable de valor de cadena de búsqueda @document .

DECLARE @document varchar(64);


SELECT @document = 'Reflectors are vital safety' +
' components of your bicycle.';
SELECT CHARINDEX('bicycle', @document);
GO

El conjunto de resultados es el siguiente.

-----------
48

B. Buscar desde una posición concreta


En este ejemplo se usa el parámetro opcional ubicación_inicial para empezar la búsqueda de vital en el quinto
carácter de la variable de valor de cadena de búsqueda @document .

DECLARE @document varchar(64);

SELECT @document = 'Reflectors are vital safety' +


' components of your bicycle.';
SELECT CHARINDEX('vital', @document, 5);
GO

El conjunto de resultados es el siguiente.

-----------
16

(1 row(s) affected)

C. Buscar una expresión inexistente


En este ejemplo se muestra el conjunto de resultados cuando CHARINDEX no encuentra expressionToFind dentro
de expressionToSearch.

DECLARE @document varchar(64);

SELECT @document = 'Reflectors are vital safety' +


' components of your bicycle.';
SELECT CHARINDEX('bike', @document);
GO

El conjunto de resultados es el siguiente.


-----------
0

(1 row(s) affected)

D. Realizar una búsqueda con distinción de mayúsculas y minúsculas


En este ejemplo se muestra una búsqueda con distinción de mayúsculas y minúsculas de la cadena 'TEST' en la
cadena de búsqueda 'This is a Test``' .

USE tempdb;
GO
--perform a case sensitive search
SELECT CHARINDEX ( 'TEST',
'This is a Test'
COLLATE Latin1_General_CS_AS);

El conjunto de resultados es el siguiente.

-----------
0

En este ejemplo se muestra una búsqueda con distinción de mayúsculas y minúsculas de la cadena 'Test' en
'This is a Test' .

USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
'This is a Test'
COLLATE Latin1_General_CS_AS);

El conjunto de resultados es el siguiente.

-----------
11

E. Realizar una búsqueda sin distinción de mayúsculas y minúsculas


En este ejemplo se muestra una búsqueda sin distinción de mayúsculas y minúsculas de la cadena 'TEST' en
'This is a Test' .

USE tempdb;
GO
SELECT CHARINDEX ( 'TEST',
'This is a Test'
COLLATE Latin1_General_CI_AS);
GO

El conjunto de resultados es el siguiente.

-----------
13
Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento
de datos paralelos
F. Buscar desde el principio de una expresión de cadena
En este ejemplo se devuelve la primera ubicación de la cadena is en la cadena This is a string , empezando
por la posición 1 (el primer carácter) de This is a string .

SELECT CHARINDEX('is', 'This is a string');

El conjunto de resultados es el siguiente.

---------
3

G. Buscar desde una posición distinta de la primera posición


En este ejemplo se devuelve la primera ubicación de la cadena is en la cadena This is a string , empezando
por la posición 4 (el cuarto carácter).

SELECT CHARINDEX('is', 'This is a string', 4);

El conjunto de resultados es el siguiente.

---------
6

H. Resultados cuando no se encuentra la cadena


En este ejemplo se muestra el valor devuelto cuando CHARINDEX no encuentra la cadena patrón_de_cadena en
la cadena buscada.

SELECT TOP(1) CHARINDEX('at', 'This is a string') FROM dbo.DimCustomer;

El conjunto de resultados es el siguiente.

---------
0

Vea también
LEN (Transact-SQL )
PATINDEX (Transact-SQL )
Funciones de cadena (Transact-SQL )
+ (Concatenación de cadenas) (Transact-SQL )
Compatibilidad con la intercalación y Unicode
CONCAT (Transact-SQL)
18/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve una cadena resultante de la concatenación, o la combinación, de dos o más valores de
cadena de una manera integral. (Para agregar un valor de separación durante la concatenación, vea
CONCAT_WS ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
CONCAT ( string_value1, string_value2 [, string_valueN ] )

Argumentos
string_value
Valor de cadena que se va a concatenar con los demás valores. La función CONCAT requiere al menos dos
argumentos valor_cadena y no más de 254 argumentos valor_cadena.

Tipos de valores devueltos


string_value
Un valor de cadena cuya longitud y tipo dependen de la entrada.

Notas
CONCAT toma un número variable de argumentos de cadena y los concatena (o combina) en una sola cadena.
Necesita un mínimo de dos valores de entrada; de lo contrario, se produce un error en CONCAT . CONCAT convierte
implícitamente todos los argumentos en tipos de cadena antes de la concatenación. CONCAT convierte
implícitamente los valores NULL en cadenas vacías. Si CONCAT recibe argumentos en los que todos los valores
son NULL, devolverá una cadena vacía de tipo varchar(1). La conversión implícita de cadenas sigue las reglas
existentes para las conversiones de tipos de datos. Vea CAST y CONVERT (Transact-SQL ) para obtener más
información sobre las conversiones de tipo de datos.
El tipo devuelto depende del tipo de los argumentos. En esta tabla se muestra la asignación:

TIPO DE ENTRADA TIPO DE SALIDA Y LONGITUD DE DATOS

1. Cualquier argumento de nvarchar(max)

un tipo de sistema de CLR de SQL

un UDT de CLR de SQL

o Administrador de configuración de

nvarchar(max)
TIPO DE ENTRADA TIPO DE SALIDA Y LONGITUD DE DATOS

2. De lo contrario, cualquier argumento de tipo varchar(max), a menos que uno de los parámetros sea un
tipo nvarchar de cualquier longitud. En este caso, CONCAT
varbinary(max) devuelve un resultado de tipo nvarchar (max).
o Administrador de configuración de

ntext

3. De lo contrario, cualquier argumento de tipo nvarchar de nvarchar(<= 4000)


4000 caracteres como máximo

( nvarchar(<= 4000) )

4. En todos los demás casos varchar(<= 8000) (un tipo varchar de 8 000 caracteres
como máximo) a menos que uno de los parámetros sea un
tipo nvarchar de cualquier longitud. En ese caso, CONCAT
devuelve un resultado de tipo nvarchar (max).

Cuando CONCAT recibe argumentos de entrada nvarchar de longitud <= 4 000 caracteres, o bien argumentos de
entrada varchar de longitud <= 8 000 caracteres, las conversiones implícitas pueden afectar a la longitud del
resultado. Otros tipos de datos tienen otras longitudes cuando se convierten implícitamente a cadenas. Por
ejemplo, un tipo int (14) tiene una longitud de cadena de 12, mientras que un tipo float tiene una longitud de 32.
Por tanto, una concatenación de dos enteros devuelve un resultado con una longitud de no menos de 24.
Si ninguno de los argumentos de entrada tiene un tipo de objeto grande (LOB ) admitido, el tipo devuelto se
trunca a una longitud de 8 000 caracteres, independientemente del tipo de valor devuelto. Este truncamiento
ahorra espacio y admite la eficacia de la generación de planes.
La función CONCAT se puede ejecutar de forma remota en un servidor vinculado de la versión SQL Server 2012
(11.x) o versiones posteriores. Para servidores vinculados anteriores, la operación de CONCAT se realizará
localmente, después de que el servidor vinculado devuelva los valores no concatenados.

Ejemplos
A. Usar CONCAT

SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;

El conjunto de resultados es el siguiente.

Result
-------------------------
Happy Birthday 11/25

(1 row(s) affected)

B. Usar CONCAT con valores NULL


CREATE TABLE #temp (
emp_name nvarchar(200) NOT NULL,
emp_middlename nvarchar(200) NULL,
emp_lastname nvarchar(200) NOT NULL
);
INSERT INTO #temp VALUES( 'Name', NULL, 'Lastname' );
SELECT CONCAT( emp_name, emp_middlename, emp_lastname ) AS Result
FROM #temp;

El conjunto de resultados es el siguiente.

Result
------------------
NameLastname

(1 row(s) affected)

Vea también
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Funciones de cadena (Transact-SQL )
CONCAT_WS (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2017) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve una cadena resultante de la concatenación, o la combinación, de dos o más valores de
cadena de una manera integral. Separa esos valores de cadena concatenados con el delimitador especificado en
el primer argumento de función. ( CONCAT_WS indica concatenar con separador).

Sintaxis
CONCAT_WS ( separator, argument1, argument2 [, argumentN]… )

Argumentos
separador
Una expresión de cualquier tipo de carácter ( char ', nchar ', nvarchar o varchar ).
argument1, argument2, argumentN
Una expresión de cualquier tipo.

Tipos de valores devueltos


Un valor de cadena cuya longitud y tipo dependen de la entrada.

Notas
CONCAT_WS toma un número variable de argumentos de cadena y los concatena (o combina) en una sola cadena.
Separa esos valores de cadena concatenados con el delimitador especificado en el primer argumento de función.
CONCAT_WS requiere un argumento separador y un mínimo de otros dos argumentos de valor de cadena; de lo
contrario, CONCAT_WS producirá un error. CONCAT_WS convierte implícitamente todos los argumentos en tipos de
cadena antes de la concatenación.
La conversión implícita de cadenas sigue las reglas existentes para las conversiones de tipos de datos. Para
obtener más información sobre las conversiones de tipo de datos y comportamiento, consulte CONCAT
(Transact-SQL ).
Tratamiento de valores NULL
CONCAT_WS omite el valor SET CONCAT_NULL_YIELDS_NULL {ON|OFF} .
Si CONCAT_WS recibe argumentos en los que todos los valores son NULL, devolverá una cadena vacía de tipo
varchar(1).
CONCAT_WS omite los valores NULL durante la concatenación y no se agrega el separador entre ellos. Por lo
tanto, CONCAT_WS puede tratar limpiamente la concatenación de cadenas que podrían tener valores "en blanco";
por ejemplo, un segundo campo de dirección. Para obtener más información, vea el ejemplo B.
Si un escenario implica valores nulos separados por un delimitador, considere la función ISNULL . Para obtener
más información, vea el ejemplo C.
Ejemplos
A. Concatenación de valores con separador
En este ejemplo se concatenan tres columnas de la tabla sys.databases separando los valores con - .

SELECT CONCAT_WS( ' - ', database_id, recovery_model_desc, containment_desc) AS DatabaseInfo


FROM sys.databases;

El conjunto de resultados es el siguiente.

DATABASEINFO

1 - SIMPLE - NONE

2 - SIMPLE - NONE

3 - FULL - NONE

4 - SIMPLE - NONE

B. Omitir valores NULL


En este ejemplo se ignoran valores NULL de la lista de argumentos.

SELECT CONCAT_WS(',','1 Microsoft Way', NULL, NULL, 'Redmond', 'WA', 98052) AS Address;

El conjunto de resultados es el siguiente.

Address
------------
1 Microsoft Way,Redmond,WA,98052

C. Generar el archivo CSV a partir de la tabla


En este ejemplo se utiliza una coma , como separador y se agrega el carácter de retorno de carro char(13) en
el formato de valores separados de la columna del conjunto de resultados.

SELECT
STRING_AGG(CONCAT_WS( ',', database_id, recovery_model_desc, containment_desc), char(13)) AS DatabaseInfo
FROM sys.databases

El conjunto de resultados es el siguiente.

DatabaseInfo
------------
1,SIMPLE,NONE
2,SIMPLE,NONE
3,FULL,NONE
4,SIMPLE,NONE

CONCAT_WS pasará por alto los valores NULL en las columnas. Encapsule una columna con valores NULL con
la función ISNULL y proporcione un valor predeterminado. Para más información, vea este ejemplo:
SELECT
STRING_AGG(CONCAT_WS( ',', database_id, ISNULL(recovery_model_desc,''), ISNULL(containment_desc,'N/A')),
char(13)) AS DatabaseInfo
FROM sys.databases;

Vea también
CONCAT (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Funciones de cadena (Transact-SQL )
DIFFERENCE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un valor entero que mide la diferencia entre los valores de SOUNDEX() de dos expresiones
de caracteres diferentes.
Convenciones de sintaxis de Transact-SQL

Sintaxis
DIFFERENCE ( character_expression , character_expression )

Argumentos
character_expression
Una expresión alfanumérica de datos de caracteres. character_expression puede ser una constante, una variable o
una columna.

Tipos devueltos
int

Notas
DIFFERENCE compara dos valores SOUNDEX diferentes y devuelve un valor entero. Este valor mide el grado de
coincidencia de los valores SOUNDEX , en una escala de 0 a 4. Un valor de 0 indica una similitud escasa o nula entre
los valores de SOUNDEX; 4 indica que los valores son muy similares o incluso idénticos.
DIFFERENCE y SOUNDEX tienen distinción de intercalación.

Ejemplos
En la primera parte de este ejemplo se comparan los valores SOUNDEX de dos cadenas muy similares. En una
intercalación de Latin1_General, DIFFERENCE devuelve un valor de 4 . En la segunda parte del ejemplo se
comparan los valores de SOUNDEX de dos cadenas muy diferentes y, en el caso de una intercalación de
Latin1_General, DIFFERENCE devuelve un valor de 0 .

-- Returns a DIFFERENCE value of 4, the least possible difference.


SELECT SOUNDEX('Green'), SOUNDEX('Greene'), DIFFERENCE('Green','Greene');
GO
-- Returns a DIFFERENCE value of 0, the highest possible difference.
SELECT SOUNDEX('Blotchet-Halls'), SOUNDEX('Greene'), DIFFERENCE('Blotchet-Halls', 'Greene');
GO

El conjunto de resultados es el siguiente.


----- ----- -----------
G650 G650 4

(1 row(s) affected)

----- ----- -----------


B432 G650 0

(1 row(s) affected)

Ver también
SOUNDEX (Transact-SQL )
Funciones de cadena (Transact-SQL )
FORMAT (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor con formato con el formato y la referencia cultural opcional especificados en SQL Server 2017.
Use la función FORMAT para aplicar formato específico de la configuración regional de los valores de fecha/hora
y de número como cadenas. Para las conversiones de tipos de datos generales, use CAST o CONVERT.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FORMAT ( value, format [, culture ] )

Argumentos
value
Expresión de un tipo de datos compatible a la que se va a dar formato. Para obtener una lista de tipos válidos, vea
la tabla de la sección Comentarios.
format
Patrón de formato nvarchar.
El argumento format debe contener una cadena de formato de .NET Framework válida, ya sea como una cadena
de formato estándar (por ejemplo, "C" o "D") o como un modelo de caracteres personalizados para los valores de
fecha y numéricos (por ejemplo, "DD de MMMM, aaaa (dddd)"). No se admite el formato compuesto. Para
obtener una explicación completa de estos modelos de formato, vea la documentación de .NET Framework sobre
el formato de cadena en general, los formatos de fecha y hora personalizados, y los formatos de número
personalizados. Un buen punto de partida es el tema "Formatting Types" (Tipos de formato).
culture
Argumento opcional de tipo nvarchar que especifica una referencia cultural.
Si no se proporciona el argumento culture, se usará el idioma de la sesión actual. Este idioma se establece
implícitamente, o explícitamente mediante la instrucción SET L ANGUAGE. culture acepta como argumento
cualquier referencia cultural compatible con .NET Framework; no se limita a los idiomas admitidos explícitamente
por SQL Server. Si el argumento culture no es válido, FORMAT desencadena un error.

Tipos devueltos
nvarchar o null
La longitud del valor devuelto viene determinada por format.

Notas
FORMAT devuelve NULL para los errores distintos de culture que no son válidos. Por ejemplo, se devuelve NULL
si el valor especificado en format no es válido.
La función FORMAT es no determinista.
FORMAT se basa en la presencia de Common Language Runtime (CLR ) de .NET Framework.
Esta función no se puede enviar de forma remota puesto que depende de la presencia del CLR. El envío remoto de
una función que necesita CLR produciría un error en el servidor remoto.
FORMAT se basa en las reglas de formato de CLR, que dictan que los signos de punto y de dos puntos deben
incluir caracteres de escape. Por tanto, cuando la cadena de formato (segundo parámetro) contiene un signo de
punto o de dos puntos, estos deben incluir caracteres de escape, como una barra diagonal inversa, cuando un
valor de entrada (primer parámetro) es del tipo de datos time. Vea D. FORMAT con tipos de datos de tiempo.
En esta tabla se muestran los tipos de datos aceptables para el argumento value, junto con sus tipos equivalentes
de asignación de .NET Framework.

CATEGORÍA TIPO TIPO DE .NET

Numérico bigint Int64

Numérico INT Int32

Numérico SMALLINT Int16

Numérico TINYINT Byte

Numérico decimal SqlDecimal

Numérico NUMERIC SqlDecimal

Numérico FLOAT Doble

Numérico REAL Único

Numérico SMALLMONEY Decimal

Numérico money Decimal

Fecha y hora Date DateTime

Fecha y hora time Timespan

Fecha y hora DATETIME DateTime

Fecha y hora smalldatetime DateTime

Fecha y hora datetime2 DateTime

Fecha y hora datetimeoffset DateTimeOffset

Ejemplos
A. Ejemplo de FORMAT sencillo
En el ejemplo siguiente se devuelve una fecha simple con formato para distintas referencias culturales.
DECLARE @d DATETIME = '10/01/2011';
SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result'
,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result';

SELECT FORMAT ( @d, 'D', 'en-US' ) AS 'US English Result'


,FORMAT ( @d, 'D', 'en-gb' ) AS 'Great Britain English Result'
,FORMAT ( @d, 'D', 'de-de' ) AS 'German Result'
,FORMAT ( @d, 'D', 'zh-cn' ) AS 'Chinese (Simplified PRC) Result';

El conjunto de resultados es el siguiente.

US English Result Great Britain English Result German Result Simplified Chinese (PRC) Result
---------------- ----------------------------- ------------- -------------------------------------
10/1/2011 01/10/2011 01.10.2011 2011/10/1

(1 row(s) affected)

US English Result Great Britain English Result German Result Chinese


(Simplified PRC) Result
---------------------------- ----------------------------- ----------------------------- --------------------
-------------------
Saturday, October 01, 2011 01 October 2011 Samstag, 1. Oktober 2011 2011年10月1日

(1 row(s) affected)

B. FORMAT con cadenas de formato personalizado


En el ejemplo siguiente se muestran valores numéricos de formato especificando un formato personalizado. En el
ejemplo se da por supuesto que la fecha actual es el 27 de septiembre de 2012. Para más información sobre estos
y otros formatos personalizados, vea Cadenas con formato numérico personalizado.

DECLARE @d DATETIME = GETDATE();


SELECT FORMAT( @d, 'dd/MM/yyyy', 'en-US' ) AS 'DateTime Result'
,FORMAT(123456789,'###-##-####') AS 'Custom Number Result';

El conjunto de resultados es el siguiente.

DateTime Result Custom Number Result


-------------- --------------------
27/09/2012 123-45-6789

(1 row(s) affected)

C. FORMAT con tipos numéricos


En este ejemplo se devuelven 5 filas de la tabla Sales.CurrencyRate de la base de datos AdventureWorks2012.
La columna EndOfDateRate se almacena como el tipo money en la tabla. En este ejemplo, la columna se
devuelve sin formato y después con formato especificando el formato Number de .NET, el formato General y los
tipos de formato Currency. Para más información sobre estos y otros formatos numéricos, vea Cadenas con
formato numérico estándar.
SELECT TOP(5)CurrencyRateID, EndOfDayRate
,FORMAT(EndOfDayRate, 'N', 'en-us') AS 'Number Format'
,FORMAT(EndOfDayRate, 'G', 'en-us') AS 'General Format'
,FORMAT(EndOfDayRate, 'C', 'en-us') AS 'Currency Format'
FROM Sales.CurrencyRate
ORDER BY CurrencyRateID;

El conjunto de resultados es el siguiente.

CurrencyRateID EndOfDayRate Numeric Format General Format Currency Format


-------------- ------------ -------------- -------------- ---------------
1 1.0002 1.00 1.0002 $1.00
2 1.55 1.55 1.5500 $1.55
3 1.9419 1.94 1.9419 $1.94
4 1.4683 1.47 1.4683 $1.47
5 8.2784 8.28 8.2784 $8.28

(5 row(s) affected)

En este ejemplo se especifica la referencia cultural de alemán (de-de).

SELECT TOP(5)CurrencyRateID, EndOfDayRate


,FORMAT(EndOfDayRate, 'N', 'de-de') AS 'Numeric Format'
,FORMAT(EndOfDayRate, 'G', 'de-de') AS 'General Format'
,FORMAT(EndOfDayRate, 'C', 'de-de') AS 'Currency Format'
FROM Sales.CurrencyRate
ORDER BY CurrencyRateID;

CurrencyRateID EndOfDayRate Numeric Format General Format Currency Format


-------------- ------------ -------------- -------------- ---------------
1 1.0002 1,00 1,0002 1,00 €
2 1.55 1,55 1,5500 1,55 €
3 1.9419 1,94 1,9419 1,94 €
4 1.4683 1,47 1,4683 1,47 €
5 8.2784 8,28 8,2784 8,28 €

(5 row(s) affected)

D. FORMAT con tipos de datos de tiempo


FORMAT devuelve NULL en estos casos porque . y : no incluyen caracteres de escape.

SELECT FORMAT(cast('07:35' as time), N'hh.mm'); --> returns NULL


SELECT FORMAT(cast('07:35' as time), N'hh:mm'); --> returns NULL

FORMAT devuelve una cadena con formato porque . y : incluyen caracteres de escape.

SELECT FORMAT(cast('07:35' as time), N'hh\.mm'); --> returns 07.35


SELECT FORMAT(cast('07:35' as time), N'hh\:mm'); --> returns 07:35

Ver también
CAST y CONVERT (Transact-SQL )
STR (Transact-SQL )
Funciones de cadena (Transact-SQL )
LEFT (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la parte izquierda de una cadena de caracteres con el número de caracteres especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
LEFT ( character_expression , integer_expression )

Argumentos
character_expression
Es una expresión de datos binarios o de caracteres. character_expression puede ser una constante, una variable o
una columna. character_expression puede ser cualquier tipo de datos (excepto text o ntext) que se pueda
convertir implícitamente a varchar o nvarchar. De lo contrario, use la función CAST para convertir
character_expression explícitamente.
integer_expression
Es un entero positivo que especifica cuántos caracteres de character_expression se van a devolver. Si
integer_expression es negativo, se devuelve un error. Si integer_expression es de tipo bigint y contiene un valor
grande, character_expression debe ser de un tipo de datos de gran tamaño, como varchar(max).
El parámetro integer_expression cuenta un carácter suplente UTF 16 como un carácter.

Tipos devueltos
Devuelve varchar cuando character_expression es de un tipo de datos de caracteres no Unicode.
Devuelve nvarchar cuando character_expression es de un tipo de datos de caracteres Unicode.

Notas
Al usar intercalaciones de SC, el parámetro integer_expression cuenta un par suplente UTF 16 como un carácter.
Para más información, consulte Compatibilidad con la intercalación y Unicode.

Ejemplos
A. Utilizar LEFT con una columna
En el ejemplo siguiente se devuelven los cinco caracteres situados más a la izquierda de cada nombre de
producto de la tabla Product de la base de datos AdventureWorks2012.

SELECT LEFT(Name, 5)
FROM Production.Product
ORDER BY ProductID;
GO
B. Utilizar LEFT con una cadena de caracteres
En el ejemplo siguiente se utiliza LEFT para devolver los dos caracteres situados más a la izquierda de la cadena
de caracteres abcdefg .

SELECT LEFT('abcdefg',2);
GO

El conjunto de resultados es el siguiente.

--
ab

(1 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Utilizar LEFT con una columna
En el ejemplo siguiente se devuelven los cinco caracteres situados más a la izquierda de cada nombre de
producto.

-- Uses AdventureWorks

SELECT LEFT(EnglishProductName, 5)
FROM dbo.DimProduct
ORDER BY ProductKey;

D. Utilizar LEFT con una cadena de caracteres


En el ejemplo siguiente se utiliza LEFT para devolver los dos caracteres situados más a la izquierda de la cadena
de caracteres abcdefg .

-- Uses AdventureWorks

SELECT LEFT('abcdefg',2) FROM dbo.DimProduct;

El conjunto de resultados es el siguiente.

--
ab

Ver también
LTRIM (Transact-SQL )
RIGHT (Transact-SQL )
RTRIM (Transact-SQL )
STRING_SPLIT (Transact-SQL )
SUBSTRING (Transact-SQL )
TRIM (Transact-SQL )
CAST y CONVERT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
LEN (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de caracteres de la expresión de cadena especificada, excluidos los espacios en blanco finales.

NOTE
Para devolver el número de bytes usado para representar una expresión, use la función DATALENGTH.

Convenciones de sintaxis de Transact-SQL

Sintaxis
LEN ( string_expression )

Argumentos
string_expression
Es la expression de cadena que se va a evaluar. string_expression puede ser una constante, una variable o una
columna de datos binarios o de caracteres.

Tipos devueltos
bigint si expression es de los tipos de datos varchar(max), nvarchar(max) o varbinary(max); en caso
contrario, es int.
Si utiliza intercalaciones de SC, el valor entero devuelto cuenta los pares suplentes UTF -16 como un solo carácter.
Para más información, consulte Compatibilidad con la intercalación y Unicode.

Notas
LEN no incluye espacios en blanco finales. Si esto supone un problema, considere la opción de usar la función
DATALENGTH (Transact-SQL ), que no recorta la cadena. Si se procesa una cadena unicode, DATALENGTH
devolverá dos veces el número de caracteres. En este ejemplo se muestra LEN y DATALENGTH con un espacio
final.

DECLARE @v1 varchar(40),


@v2 nvarchar(40);
SELECT
@v1 = 'Test of 22 characters ',
@v2 = 'Test of 22 characters ';
SELECT LEN(@v1) AS [varchar LEN] , DATALENGTH(@v1) AS [varchar DATALENGTH];
SELECT LEN(@v2) AS [nvarchar LEN], DATALENGTH(@v2) AS [nvarchar DATALENGTH];

Ejemplos
El ejemplo siguiente selecciona el número de caracteres y los datos en FirstName para las personas que se
encuentran en Australia . En este ejemplo se utiliza la base de datos de AdventureWorks.

SELECT LEN(FirstName) AS Length, FirstName, LastName


FROM Sales.vIndividualCustomer
WHERE CountryRegionName = 'Australia';
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En este ejemplo se devuelve el número de caracteres en la columna FirstName y los nombres y apellidos de los
empleados que se encuentran en Australia .

-- Uses AdventureWorks

SELECT DISTINCT LEN(FirstName) AS FNameLength, FirstName, LastName


FROM dbo.DimEmployee AS e
INNER JOIN dbo.DimGeography AS g
ON e.SalesTerritoryKey = g.SalesTerritoryKey
WHERE EnglishCountryRegionName = 'Australia';

El conjunto de resultados es el siguiente.

FNameLength FirstName LastName


----------- --------- ---------------
4 Lynn Tsoflias

Ver también
DATALENGTH (Transact-SQL )
CHARINDEX (Transact-SQL )
PATINDEX (Transact-SQL )
LEFT (Transact-SQL )
RIGHT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
LOWER (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una expresión de caracteres después de convertir en minúsculas los datos de caracteres en mayúsculas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
LOWER ( character_expression )

Argumentos
character_expression
Es una expresión de datos binarios o de caracteres. character_expression puede ser una constante, una variable o
una columna. character_expression debe ser de un tipo de datos que se pueda convertir implícitamente a varchar.
De lo contrario, use CAST para convertir character_expression explícitamente.

Tipos devueltos
varchar o nvarchar

Ejemplos
En este ejemplo se utiliza la función LOWER y la función UPPER , y se anida la función UPPER en la función LOWER al
seleccionar títulos de libros cuyos precios sean entre 11$ y 20$.

-- Uses AdventureWorks

SELECT LOWER(SUBSTRING(EnglishProductName, 1, 20)) AS Lower,


UPPER(SUBSTRING(EnglishProductName, 1, 20)) AS Upper,
LOWER(UPPER(SUBSTRING(EnglishProductName, 1, 20))) As LowerUpper
FROM dbo.DimProduct
WHERE ListPrice between 11.00 and 20.00;

El conjunto de resultados es el siguiente.

Lower Upper LowerUpper


-------------------- --------------------- --------------------
minipump MINIPUMP minipump
taillights – battery TAILLIGHTS – BATTERY taillights - battery

Ver también
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
UPPER (Transact-SQL )
LTRIM (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una expresión de caracteres tras quitar todos los espacios iniciales en blanco.
Convenciones de sintaxis de Transact-SQL

Sintaxis
LTRIM ( character_expression )

Argumentos
character_expression
Es una expresión de datos binarios o de caracteres. character_expression puede ser una constante, una variable o
una columna. character_expression debe ser de un tipo de datos (excepto text, ntext e image) que se pueda
convertir implícitamente a varchar. De lo contrario, use CAST para convertir character_expression explícitamente.

Tipo devuelto
varchar o nvarchar

Ejemplos
A. Ejemplo sencillo
En el siguiente ejemplo se usa LTRIM para quitar los espacios iniciales de una expresión de caracteres.

SELECT LTRIM(' Five spaces are at the beginning of this string.') FROM sys.databases;

El conjunto de resultados es el siguiente.

---------------------------------------------------------------
Five spaces are at the beginning of this string.

B. Ejemplo con una variable


En el siguiente ejemplo se utiliza LTRIM para quitar espacios iniciales de una variable de caracteres.

DECLARE @string_to_trim varchar(60);


SET @string_to_trim = ' 5 spaces are at the beginning of this string.';
SELECT
@string_to_trim AS 'Original string',
LTRIM(@string_to_trim) AS 'Without spaces';
GO

El conjunto de resultados es el siguiente.


Original string Without spaces
--------------------------------------------------- ---------------------------------------------
5 spaces are at the beginning of this string. 5 spaces are at the beginning of this string.

Ver también
LEFT (Transact-SQL )
RIGHT (Transact-SQL )
RTRIM (Transact-SQL )
STRING_SPLIT (Transact-SQL )
SUBSTRING (Transact-SQL )
TRIM (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
NCHAR (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el carácter Unicode correspondiente al código entero dado, tal como se define en el estándar Unicode.
Convenciones de sintaxis de Transact-SQL

Sintaxis
NCHAR ( integer_expression )

Argumentos
integer_expression
Cuando la intercalación de la base de datos no contiene la marca de carácter complementario (SC ), se trata de un
número entero positivo de 0 a 65535 (de 0 a 0xFFFF ). Si se especifica un valor fuera de este rango, se devuelve
NULL. Para más información sobre el formato de caracteres, vea Compatibilidad con la intercalación y Unicode.
Cuando la intercalación de la base de datos admite la marca de carácter complementario (SC ), se trata de un
número entero positivo de 0 a 1114111 (de 0 a 0x10FFFF ). Si se especifica un valor fuera de este rango, se
devuelve NULL.

Tipos devueltos
nchar(1) cuando la intercalación de la base de datos predeterminada no admite caracteres complementarios.
nvarchar(2) cuando la intercalación de la base de datos predeterminada admite caracteres complementarios.
Si el parámetro integer_expression cae dentro del intervalo comprendido entre 0 y 0xFFFF, solo se devuelve un
carácter. Con valores más altos, NCHAR devuelve el par suplente correspondiente. No cree un par suplente
mediante NCHAR(<High surrogate>) + NCHAR(\<Low Surrogate>) . En su lugar, utilice una intercalación de base de
datos que admita caracteres complementarios y después especifique el punto de código Unicode para el par
suplente. En el ejemplo siguiente se muestra el método antiguo de creación de un par suplente y el método
preferido de especificación del punto de código Unicode.

CREATE DATABASE test COLLATE Finnish_Swedish_100_CS_AS_SC;


DECLARE @d nvarchar(10) = N' ';
-- Old style method.
SELECT NCHAR(0xD84C) + NCHAR(0xDD7F);

-- Preferred method.
SELECT NCHAR(143743);

-- Alternative preferred method.


SELECT NCHAR(UNICODE(@d));

Ejemplos
A. Usar NCHAR y UNICODE
En el siguiente ejemplo se utilizan las funciones UNICODE y NCHAR para imprimir el valor UNICODE y NCHAR
(carácter Unicode) del segundo carácter de la cadena de caracteres København , y para imprimir el segundo
carácter real, ø .

DECLARE @nstring nchar(8);


SET @nstring = N'København';
SELECT UNICODE(SUBSTRING(@nstring, 2, 1)),
NCHAR(UNICODE(SUBSTRING(@nstring, 2, 1)));
GO

El conjunto de resultados es el siguiente.

----------- -
248 ø
(1 row(s) affected)

B. Usar SUBSTRING, UNICODE, CONVERT y NCHAR


En el siguiente ejemplo se utilizan las funciones SUBSTRING , UNICODE , CONVERT y NCHAR para imprimir el número
de carácter, el carácter Unicode y el valor de UNICODE para cada uno de los caracteres de la cadena København .

-- The @position variable holds the position of the character currently


-- being processed. The @nstring variable is the Unicode character
-- string to process.
DECLARE @position int, @nstring nchar(9);
-- Initialize the current position variable to the first character in
-- the string.
SET @position = 1;
-- Initialize the character string variable to the string to process.
-- Notice that there is an N before the start of the string. This
-- indicates that the data following the N is Unicode data.
SET @nstring = N'København';
-- Print the character number of the position of the string you are at,
-- the actual Unicode character you are processing, and the UNICODE
-- value for this particular character.
PRINT 'Character #' + ' ' + 'Unicode Character' + ' ' + 'UNICODE Value';
WHILE @position <= DATALENGTH(@nstring)
BEGIN
SELECT @position,
NCHAR(UNICODE(SUBSTRING(@nstring, @position, 1))),
CONVERT(NCHAR(17), SUBSTRING(@nstring, @position, 1)),
UNICODE(SUBSTRING(@nstring, @position, 1))
SELECT @position = @position + 1
END;
GO

El conjunto de resultados es el siguiente.

Character # Unicode Character UNICODE Value

----------- ---- ----------------- -----------


1 K K 75

(1 row(s) affected)

----------- ---- ----------------- -----------


2 ø ø 248

(1 row(s) affected)
----------- ---- ----------------- -----------
3 b b 98

(1 row(s) affected)

----------- ---- ----------------- -----------


4 e e 101

(1 row(s) affected)

----------- ---- ----------------- -----------


5 n n 110

(1 row(s) affected)

----------- ---- ----------------- -----------


6 h h 104

(1 row(s) affected)

----------- ---- ----------------- -----------


7 a a 97

(1 row(s) affected)

----------- ---- ----------------- -----------


8 v v 118

(1 row(s) affected)

----------- ---- ----------------- -----------


9 n n 110

(1 row(s) affected)

----------- ---- ----------------- -----------


10 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


11 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


12 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


13 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


14 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


15 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


16 NULL NULL

(1 row(s) affected)
(1 row(s) affected)

----------- ---- ----------------- -----------


17 NULL NULL

(1 row(s) affected)

----------- ---- ----------------- -----------


18 NULL NULL

(1 row(s) affected)

Ver también
ASCII (Transact-SQL )
CHAR (Transact-SQL )
UNICODE (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
PATINDEX (Transact-SQL)
18/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la posición inicial de la primera repetición de un patrón en la expresión especificada, o ceros si el patrón
no se encuentra, en todos los tipos de datos de texto y caracteres.
Convenciones de sintaxis de Transact-SQL

Sintaxis
PATINDEX ( '%pattern%' , expression )

Argumentos
pattern
Es una expresión de carácter que contiene la secuencia que se va a buscar. Se pueden usar caracteres comodín,
pero el carácter % debe ir delante y detrás de pattern (a menos que busque el primer o el último carácter). pattern
es una expresión de la categoría del tipo de datos de cadena de caracteres. pattern tiene un límite de 8000
caracteres.
expression
expression es una expresión, normalmente una columna en la que se busca el patrón especificado. expression es
de la categoría del tipo de datos de cadena de caracteres.

Tipos devueltos
bigint si expression es de los tipos de datos varchar(max) o nvarchar(max); en caso contrario, int.

Notas
Si pattern o expression son NULL, PATINDEX devuelve NULL.
PATINDEX realiza comparaciones basadas en la intercalación de la entrada. Para realizar una comparación de una
intercalación especificada, puede utilizar COLL ATE para aplicar una intercalación explícita a la entrada.

Caracteres adicionales (pares suplentes)


Cuando se usan intercalaciones SC, el valor devuelto contará cualquier par suplente UTF -16 en el parámetro
expression como un solo carácter. Para más información, consulte Compatibilidad con la intercalación y Unicode.
0x0000 (char(0)) es un carácter no definido en las intercalaciones de Windows y no se puede incluir en
PATINDEX.

Ejemplos
A. Ejemplo sencillo de PATINDEX
En este ejemplo se comprueba una cadena corta de caracteres ( interesting data ) para la ubicación inicial de los
caracteres ter .

SELECT PATINDEX('%ter%', 'interesting data');

El conjunto de resultados es el siguiente.


3

B. Utilizar un patrón con PATINDEX


En el siguiente ejemplo se busca la posición en que comienza el patrón ensure en una fila específica de la
columna DocumentSummary de la tabla Document de la base de datos AdventureWorks2012.

SELECT PATINDEX('%ensure%',DocumentSummary)
FROM Production.Document
WHERE DocumentNode = 0x7B40;
GO

El conjunto de resultados es el siguiente.

-----------
64
(1 row(s) affected)

Si no restringe las filas que se van a buscar mediante una cláusula WHERE , la consulta devuelve todas las filas de la
tabla e informa de valores distintos de cero para las filas en las que se encontró el modelo, y cero para todas las
filas en las que no se encontró el modelo.
C. Utilizar caracteres comodín con PATINDEX
En el siguiente ejemplo se utilizan los caracteres comodín % y para buscar la posición en la que comienza el
modelo 'en' en la cadena especificada, seguido de cualquier carácter y 'ure' (el índice comienza en 1 ):

SELECT PATINDEX('%en_ure%', 'please ensure the door is locked');

El conjunto de resultados es el siguiente.

-----------
8

PATINDEX funciona igual que LIKE , por lo que se puede usar cualquiera de los caracteres comodín. No es
necesario incluir el patrón entre caracteres de porcentaje. PATINDEX('a%', 'abc') devuelve 1 y
PATINDEX('%a', 'cba') devuelve 3.

A diferencia de LIKE , PATINDEX devuelve una posición, de forma similar a CHARINDEX .


D. Utilizar COLLATE con PATINDEX
En el siguiente ejemplo se utiliza la función COLLATE para especificar de forma explícita la intercalación de la
expresión que se está buscando.

USE tempdb;
GO
SELECT PATINDEX ( '%ein%', 'Das ist ein Test' COLLATE Latin1_General_BIN) ;
GO
E. Usar una variable para especificar el patrón
En este ejemplo se usa una variable para pasar un valor al parámetro pattern. Aquí se usa la base de datos
AdventureWorks2012.

DECLARE @MyValue varchar(10) = 'safety';


SELECT PATINDEX('%' + @MyValue + '%', DocumentSummary)
FROM Production.Document
WHERE DocumentNode = 0x7B40;

El conjunto de resultados es el siguiente.

------------
22

Ver también
CHARINDEX (Transact-SQL )
LEN (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
(Wildcard - Character(s) to Match) (Transact-SQL ) [(Carácter comodín - Caracteres coincidentes (Transact-SQL )]
(Wildcard - Character(s) to Match) (Transact-SQL ) [(Carácter comodín - Caracteres no coincidentes (Transact-
SQL )]
_ (Wildcard - Match One Character) (Transact-SQL ) [ (Carácter comodín - Coincidir con un carácter ) (Transact-
SQL )]
Percent character (Wildcard - Character(s) to Match) (Transact-SQL ) [Carácter de porcentaje (Carácter comodín -
Caracteres coincidentes Transact-SQL )]
QUOTENAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una cadena Unicode con los delimitadores agregados para convertirla en un identificador delimitado
válido de SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
QUOTENAME ( 'character_string' [ , 'quote_character' ] )

Argumentos
'character_string'
Es una cadena de datos de caracteres Unicode. character_string es sysname y está limitado a 128 caracteres. Las
entradas mayores de 128 caracteres devuelven NULL.
'quote_character'
Es una cadena de un solo carácter que se utiliza como delimitador. Puede ser una comilla simple ('), un corchete
de apertura o de cierre ([]) o una comilla doble ("). Si no se especifica quote_character, se usarán corchetes.

Tipos devueltos
nvarchar(258)

Ejemplos
En el siguiente ejemplo se toma la cadena de caracteres abc[]def y se utilizan los caracteres [ y ] para crear
un identificador delimitado de SQL Server válido.

SELECT QUOTENAME('abc[]def');

El conjunto de resultados es el siguiente.

[abc[]]def]

(1 row(s) affected)

Observe que el corchete derecho de la cadena abc[]def aparece dos veces para indicar que se trata de un
carácter de escape.

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el siguiente ejemplo se toma la cadena de caracteres abc def y se utilizan los caracteres [ y ] para crear
un identificador delimitado de SQL Server válido.

SELECT QUOTENAME('abc def');

El conjunto de resultados es el siguiente.

[abc def]

(1 row(s) affected)

Ver también
PARSENAME (Transact-SQL )
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Funciones de cadena (Transact-SQL )
REPLACE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Reemplaza todas las instancias de un valor de cadena especificado por otro valor de cadena.
Convenciones de sintaxis de Transact-SQL

Sintaxis
REPLACE ( string_expression , string_pattern , string_replacement )

Argumentos
string_expression
Es la expresión de cadena que se va a buscar. string_expression puede ser de un tipo de datos binario o de
caracteres.
string_ pattern
Es la subcadena que se va a buscar. string_pattern puede ser de un tipo de datos binario o de caracteres.
string_pattern no puede ser una cadena vacía ('') y no debe superar el número máximo de bytes que cabe en una
página.
string_ replacement
Es la cadena de reemplazo. string_replacement puede tener un tipo de datos de carácter o binario.

Tipos devueltos
Devuelve nvarchar si uno de los argumentos de entrada tiene el tipo de datos nvarchar; de lo contrario,
REPL ACE devuelve varchar.
Devuelve NULL si alguno de los argumentos es NULL.
Si string_expression no es de tipo varchar(max) o nvarchar(max), REPLACE trunca el valor devuelto en 8000
bytes. Para devolver valores mayores de 8000 bytes, string_expression se debe convertir explícitamente en un
tipo de datos de valores grandes.

Notas
REPL ACE realiza comparaciones basándose en la intercalación de la entrada. Para realizar una comparación de
una intercalación especificada, puede usar COLL ATE para aplicar una intercalación explícita a la entrada.
0x0000 (char(0)) es un carácter no definido en las intercalaciones de Windows y no se puede incluir en
REPL ACE.

Ejemplos
El siguiente ejemplo reemplaza la cadena cde de abcdefghi por xxx .
SELECT REPLACE('abcdefghicde','cde','xxx');
GO

El conjunto de resultados es el siguiente.

------------
abxxxfghixxx
(1 row(s) affected)

El siguiente ejemplo utiliza la función COLLATE .

SELECT REPLACE('This is a Test' COLLATE Latin1_General_BIN,


'Test', 'desk' );
GO

El conjunto de resultados es el siguiente.

------------
This is a desk
(1 row(s) affected)

Ver también
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
REPLICATE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Repite un valor de cadena un número especificado de veces.
Convenciones de sintaxis de Transact-SQL

Sintaxis
REPLICATE ( string_expression ,integer_expression )

Argumentos
string_expression
Es una expresión de un tipo de datos binario o de cadena de caracteres. string_expression pueden ser datos
binarios o de caracteres.

NOTE
Si string_expression no es de tipo varchar(max) o nvarchar(max), REPLICATE trunca el valor devuelto en 8000 bytes. Para
devolver valores mayores de 8000 bytes, string_expression debe convertirse explícitamente al tipo de datos de valores
grandes apropiado.

integer_expression
Es una expresión de cualquier tipo entero, incluido bigint. Si integer_expression es negativo, se devuelve NULL.

Tipos devueltos
Devuelve el mismo tipo que string_expression.

Ejemplos
A. Usar REPLICATE
En el ejemplo siguiente se replica un carácter 0 cuatro veces delante de un código de línea de producción en la
base de datos AdventureWorks2012.

SELECT [Name]
, REPLICATE('0', 4) + [ProductLine] AS 'Line Code'
FROM [Production].[Product]
WHERE [ProductLine] = 'T'
ORDER BY [Name];
GO

El conjunto de resultados es el siguiente.


Name Line Code
-------------------------------------------------- ---------
HL Touring Frame - Blue, 46 0000T
HL Touring Frame - Blue, 50 0000T
HL Touring Frame - Blue, 54 0000T
HL Touring Frame - Blue, 60 0000T
HL Touring Frame - Yellow, 46 0000T
HL Touring Frame - Yellow, 50 0000T
...

B. Usar REPLICATE y DATALENGTH


En el ejemplo siguiente se rellena de números a la izquierda hasta una longitud especificada mientras que los
números se convierten de un tipo de datos numérico a caracteres o Unicode.

IF EXISTS(SELECT name FROM sys.tables


WHERE name = 't1')
DROP TABLE t1;
GO
CREATE TABLE t1
(
c1 varchar(3),
c2 char(3)
);
GO
INSERT INTO t1 VALUES ('2', '2'), ('37', '37'),('597', '597');
GO
SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS 'Varchar Column',
REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS 'Char Column'
FROM t1;
GO

El conjunto de resultados es el siguiente.

Varchar Column Char Column


-------------------- ------------
002 2
037 37
597 597

(3 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Usar REPLICATE
En el siguiente ejemplo se replica un carácter 0 cuatro veces delante de un valor ItemCode .

-- Uses AdventureWorks

SELECT EnglishProductName AS Name,


ProductAlternateKey AS ItemCode,
REPLICATE('0', 4) + ProductAlternateKey AS FullItemCode
FROM dbo.DimProduct
ORDER BY Name;

Estas son las primeras filas del conjunto de resultados.


Name ItemCode FullItemCode
------------------------ -------------- ---------------
Adjustable Race AR-5381 0000AR-5381
All-Purpose Bike Stand ST-1401 0000ST-1401
AWC Logo Cap CA-1098 0000CA-1098
AWC Logo Cap CA-1098 0000CA-1098
AWC Logo Cap CA-1098 0000CA-1098
BB Ball Bearing BE-2349 0000BE-2349

Ver también
SPACE (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
REVERSE (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el orden inverso de un valor de cadena.
Convenciones de sintaxis de Transact-SQL

Sintaxis
REVERSE ( string_expression )

Argumentos
string_expression
string_expression es una expression de tipo de datos binario o de cadena. string_expression puede ser una
constante, una variable o una columna de datos binarios o de caracteres.

Tipos devueltos
varchar o nvarchar

Notas
string_expression debe ser de un tipo de datos que se pueda convertir implícitamente a varchar. De lo contrario,
use CAST para convertir string_expression explícitamente.

Caracteres adicionales (pares suplentes)


Al utilizar las intercalaciones de SC, la función REVERSE no invertirá el orden de dos mitades de un par suplente.

Ejemplos
En el ejemplo siguiente se devuelven los nombres de todos los contactos con los caracteres invertidos. En este
ejemplo se usa la base de datos AdventureWorks2012.

SELECT FirstName, REVERSE(FirstName) AS Reverse


FROM Person.Person
WHERE BusinessEntityID < 5
ORDER BY FirstName;
GO

El conjunto de resultados es el siguiente.


FirstName Reverse
-------------- --------------
Ken neK
Rob boR
Roberto otreboR
Terri irreT

(4 row(s) affected)

En el ejemplo siguiente se invierten los caracteres de una variable.

DECLARE @myvar varchar(10);


SET @myvar = 'sdrawkcaB';
SELECT REVERSE(@myvar) AS Reversed ;
GO

En el ejemplo siguiente se realiza una conversión implícita de un tipo de datos int a un tipo de datos varchar y
luego se invierte el resultado.

SELECT REVERSE(1234) AS Reversed ;


GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En este ejemplo se devuelven los nombres de todas las bases de datos y los nombres con los caracteres
invertidos.

SELECT name, REVERSE(name) FROM sys.databases;


GO

Ver también
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
CAST y CONVERT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
RIGHT (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la parte derecha de una cadena de caracteres con el número de caracteres especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
RIGHT ( character_expression , integer_expression )

Argumentos
character_expression
Es una expresión de datos binarios o de caracteres. character_expression puede ser una constante, una variable o
una columna. character_expression puede ser cualquier tipo de datos (excepto text o ntext) que se pueda
convertir implícitamente a varchar o nvarchar. De lo contrario, use la función CAST para convertir
character_expression explícitamente.
integer_expression
Es un entero positivo que especifica cuántos caracteres de character_expression se van a devolver. Si
integer_expression es negativo, se devuelve un error. Si integer_expression es de tipo bigint y contiene un valor
grande, character_expression debe ser de un tipo de datos de gran tamaño, como varchar(max).

Tipos devueltos
Devuelve varchar cuando character_expression es de un tipo de datos de caracteres no Unicode.
Devuelve nvarchar cuando character_expression es de un tipo de datos de caracteres Unicode.

Caracteres adicionales (pares suplentes)


Al utilizar las intercalaciones de SC, la función RIGHT cuenta un par suplente UTF 16 como un carácter
individual. Para más información, consulte Compatibilidad con la intercalación y Unicode.

Ejemplos
A. Usar RIGHT con una columna
En el ejemplo siguiente se devuelven los cinco caracteres situados más a la derecha del nombre de cada persona
de la base de datos AdventureWorks2012.

SELECT RIGHT(FirstName, 5) AS 'First Name'


FROM Person.Person
WHERE BusinessEntityID < 5
ORDER BY FirstName;
GO
El conjunto de resultados es el siguiente.

First Name
----------
Ken
Terri
berto
Rob

(4 row(s) affected)

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
B. Usar RIGHT con una columna
En el siguiente ejemplo se devuelven los cinco caracteres situados más a la derecha de cada apellido de la tabla
DimEmployee .

-- Uses AdventureWorks

SELECT RIGHT(LastName, 5) AS Name


FROM dbo.DimEmployee
ORDER BY EmployeeKey;

A continuación se muestra un conjunto parcial de resultados.

Name
-----
lbert
Brown
rello
lters

C. Usar RIGHT con una cadena de caracteres


En el siguiente ejemplo se usa RIGHT para devolver los dos caracteres situados más a la derecha de la cadena de
caracteres abcdefg .

-- Uses AdventureWorks

SELECT TOP(1) RIGHT('abcdefg',2) FROM dbo.DimProduct;

El conjunto de resultados es el siguiente.

-------
fg

Ver también
LEFT (Transact-SQL )
LTRIM (Transact-SQL )
RTRIM (Transact-SQL )
STRING_SPLIT (Transact-SQL )
SUBSTRING (Transact-SQL )
TRIM (Transact-SQL )
CAST y CONVERT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
RTRIM (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una cadena de caracteres después de truncar todos los espacios finales.
Convenciones de sintaxis de Transact-SQL

Sintaxis
RTRIM ( character_expression )

Argumentos
character_expression
Es una expresión de datos de caracteres. character_expression puede ser una constante, una variable o una
columna de datos binarios o de caracteres.
character_expression debe ser de un tipo de datos que se pueda convertir implícitamente a varchar. De lo
contrario, use CAST para convertir character_expression explícitamente.

Tipos devueltos
varchar o nvarchar

Ejemplos
A. Ejemplo sencillo
El siguiente ejemplo toma una cadena de caracteres que tiene espacios al final de la frase y devuelve el texto sin
esos espacios.

SELECT RTRIM('Removes trailing spaces. ');

El conjunto de resultados es el siguiente.


Removes trailing spaces.

B. Ejemplo sencillo
En el ejemplo siguiente se muestra cómo utilizar RTRIM para quitar los espacios finales. En este caso hay otra
cadena concatenada a la primera cadena para mostrar que los espacios han desaparecido.

SELECT RTRIM('Four spaces are after the period in this sentence. ') + 'Next string.';

El conjunto de resultados es el siguiente.


Four spaces are after the period in this sentence.Next string.

C. Usar RTRIM con una variable


En el ejemplo siguiente se muestra cómo utilizar RTRIM para quitar los espacios finales de una variable de
caracteres.

DECLARE @string_to_trim varchar(60);


SET @string_to_trim = 'Four spaces are after the period in this sentence. ';
SELECT @string_to_trim + ' Next string.';
SELECT RTRIM(@string_to_trim) + ' Next string.';
GO

El conjunto de resultados es el siguiente.

-------------------------------------------------------------------------
Four spaces are after the period in this sentence. Next string.

(1 row(s) affected)`

-------------------------------------------------------------------------
Four spaces are after the period in this sentence. Next string.

(1 row(s) affected)

Ver también
LEFT (Transact-SQL )
LTRIM (Transact-SQL )
RIGHT (Transact-SQL )
STRING_SPLIT (Transact-SQL )
SUBSTRING (Transact-SQL )
TRIM (Transact-SQL )
CAST y CONVERT (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
SOUNDEX (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un código de cuatro caracteres (SOUNDEX) para evaluar la semejanza de dos cadenas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SOUNDEX ( character_expression )

Argumentos
character_expression
Es una expresión alfanumérica de datos de caracteres. character_expression puede ser una constante, una variable
o una columna.

Tipos devueltos
varchar

Notas
SOUNDEX convierte una cadena alfanumérica en un código de cuatro caracteres que se basa en cómo suena la
cadena cuando se pronuncia. El primer carácter del código es el primer carácter de character_expression,
convertido a mayúsculas. Los caracteres segundo a cuarto del código son números que representan las letras de
la expresión. Las letras A, E, I, O, U, H, W e Y se omiten a menos que sean la primera letra de la cadena. Se
agregan ceros al final si se necesita crear un código de cuatro caracteres. Para más información sobre el código
SOUNDEX, vea The Soundex Indexing System (Sistema de indización Soundex).
Se pueden comparar códigos SOUNDEX de distintas cadenas para ver la similitud de las cadenas cuando se
pronuncian. La función DIFFERENCE realiza una operación SOUNDEX en dos cadenas y devuelve un entero que
representa la similitud de los códigos SOUNDEX para esas cadenas.
SOUNDEX distingue la intercalación. Las funciones de cadena se pueden anidar.

Compatibilidad con SOUNDEX


En versiones anteriores de SQL Server, la función SOUNDEX aplicaba un subconjunto de las reglas de
SOUNDEX. En el nivel de compatibilidad de base de datos 110 o posterior, SQL Server aplica un conjunto de
reglas más completo.
Después de actualizar al nivel de compatibilidad 110 o posterior, es posible que tenga que regenerar los índices,
los montones o las restricciones CHECK que usan la función SOUNDEX.
Un montón que contiene una columna computada persistida definida con SOUNDEX no puede ser
consultada hasta que el montón sea reconstruido ejecutando la declaración ALTER TABLE <table> REBUILD .
Las restricciones CHECK definidas con SOUNDEX son deshabilitadas tras una actualización. Para permitir
la restricción, ejecute la declaración ALTER TABLE <table> WITH CHECK CHECK CONSTRAINT ALL .
Los índices (incluyendo las vistas indizadas) que contienen una columna computada persistida definida con
SOUNDEX no pueden ser consultados hasta que el índice sea reconstruido ejecutando la declaración
ALTER INDEX ALL ON <object> REBUILD .

Ejemplos
El ejemplo siguiente muestra la función SOUNDEX y la función relacionada DIFFERENCE. En el primer ejemplo
se obtienen los valores estándar de SOUNDEX para todas las consonantes. Al usar SOUNDEX para las cadenas
Smith y Smythe se obtiene el mismo resultado, ya que todas las vocales, la letra y , las letras duplicadas y la letra
h no se incluyen.

-- Using SOUNDEX
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');

El conjunto de resultados es el siguiente. Válido para una intercalación Latin1_General.

----- -----
S530 S530

(1 row(s) affected)

La función DIFFERENCE compara la diferencia entre los resultados del modelo SOUNDEX . El siguiente ejemplo
muestra dos cadenas que solo difieren en las vocales. La diferencia obtenida es 4 , la mínima posible.

-- Using DIFFERENCE
SELECT DIFFERENCE('Smithers', 'Smythers');
GO

El conjunto de resultados es el siguiente. Válido para una intercalación Latin1_General.

-----------
4

(1 row(s) affected)

En el ejemplo siguiente, las cadenas varían en las consonantes; por tanto, la diferencia obtenida es 2 , la máxima
posible.

SELECT DIFFERENCE('Anothers', 'Brothers');


GO

El conjunto de resultados es el siguiente. Válido para una intercalación Latin1_General.

-----------
2

(1 row(s) affected)
Ver también
DIFFERENCE (Transact-SQL )
Funciones de cadena (Transact-SQL )
Nivel de compatibilidad de ALTER DATABASE (Transact-SQL )
SPACE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una cadena de espacios repetidos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SPACE ( integer_expression )

Argumentos
integer_expression
Es un entero positivo que indica el número de espacios. Si integer_expression es negativo, se devuelve una cadena
de tipo NULL.
Para más información, vea Expresiones (Transact-SQL ).

Tipos devueltos
varchar

Notas
Para incluir espacios en datos Unicode o para devolver más de 8.000 espacios de caracteres, utilice REPLICATE en
lugar de SPACE.

Ejemplos
En el ejemplo siguiente se eliminan los apellidos y se concatena una coma, dos espacios y los nombres de las
personas que aparecen en la tabla Person de AdventureWorks2012 .

USE AdventureWorks2012;
GO
SELECT RTRIM(LastName) + ',' + SPACE(2) + LTRIM(FirstName)
FROM Person.Person
ORDER BY LastName, FirstName;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
En el ejemplo siguiente se eliminan los apellidos y se concatena una coma, dos espacios y los nombres de las
personas que aparecen en la tabla DimCustomer de AdventureWorksPDW2012 .
-- Uses AdventureWorks

SELECT RTRIM(LastName) + ',' + SPACE(2) + LTRIM(FirstName)


FROM dbo.DimCustomer
ORDER BY LastName, FirstName;
GO

Ver también
REPLICATE (Transact-SQL )
Funciones de cadena (Transact-SQL )
Funciones integradas (Transact-SQL )
STR (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve datos de caracteres convertidos de datos numéricos.
Convenciones de sintaxis de Transact-SQL

Sintaxis
STR ( float_expression [ , length [ , decimal ] ] )

Argumentos
float_expression
Es una expresión de tipo de datos numéricos aproximados (float) con separador decimal.
length
Es la longitud total. Ésta incluye el separador decimal, el signo, los dígitos y los espacios. El valor predeterminado
es 10.
decimal
Es el número de posiciones a la derecha del separador decimal. decimal debe ser inferior o igual a 16. Si el
parámetro decimal es mayor que 16, el resultado se trunca en dieciséis posiciones a la derecha del separador
decimal.

Tipos devueltos
varchar

Notas
Si se especifican, los valores de los parámetros length y decimal de STR deben ser positivos. El número se
redondea a un entero de forma predeterminada o si el parámetro decimal es 0. La longitud especificada debe ser
mayor o igual que la parte del número situada delante del separador decimal más el signo del número (si lo hay).
Una float_expression corta se justifica a la derecha según la longitud especificada y una float_expression larga se
trunca según el número de decimales especificados. Por ejemplo, STR (12 , 10) da como resultado 12. Se justifica a
la derecha en el conjunto de resultados. Sin embargo, STR (1223 , 2) trunca el conjunto de resultados a . Las
funciones de cadena se pueden anidar.

NOTE
Para convertir a datos Unicode, utilice STR en una función de conversión CONVERT o CAST.

Ejemplos
En el ejemplo siguiente se convierte una expresión formada por un máximo de cinco dígitos y un separador
decimal en una cadena de caracteres de seis posiciones. La parte fraccionaria del número se redondea a un lugar
decimal.

SELECT STR(123.45, 6, 1);


GO

El conjunto de resultados es el siguiente.

------
123.5

(1 row(s) affected)

Cuando la expresión excede la longitud especificada, la cadena devuelve ** para esa longitud.

SELECT STR(123.45, 2, 2);


GO

El conjunto de resultados es el siguiente.

--
**

(1 row(s) affected)

Incluso cuando se anidan datos numéricos en STR , el resultado son datos de tipo carácter con el formato
especificado.

SELECT STR (FLOOR (123.45), 8, 3);


GO

El conjunto de resultados es el siguiente.

--------
123.000

(1 row(s) affected)

Ver también
CAST y CONVERT (Transact-SQL )
FORMAT (Transact-SQL )
Funciones de cadena (Transact-SQL )
STRING_AGG (Transact-SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2017) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Concatena los valores de expresiones de cadena y coloca valores de separador entre ellos. El separador no se
agrega al final de la cadena.
Convenciones de sintaxis de Transact-SQL

Sintaxis
STRING_AGG ( expression, separator ) [ <order_clause> ]

<order_clause> ::=
WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

Argumentos
expression
Es una expresión de cualquier tipo. Las expresiones se convierten en tipos NVARCHAR o VARCHAR durante la
concatenación. Los tipos que no son de cadena se convierten en NVARCHAR .
separator
Es una expresión de tipo NVARCHAR o VARCHAR que se usa como separador de cadenas concatenadas. Puede ser
un literal o una variable.
<order_clause>
Si quiere, especifique el orden de los resultados concatenados con la cláusula WITHIN GROUP :

WITHIN GROUP ( ORDER BY <order_by_expression_list> [ ASC | DESC ] )

<order_by_expression_list>
Lista de expresiones no constantes que se pueden usar para ordenar los resultados. Solo se permite un
parámetro order_by_expression por consulta. El criterio de ordenación predeterminado es ascendente.

Tipos devueltos
El tipo de valor devuelto depende del primer argumento (expression). Si el argumento de entrada es de tipo
string ( NVARCHAR , VARCHAR ), el tipo del resultado será igual que el tipo de la entrada. En la siguiente tabla se
enumeran las conversiones automáticas:

TIPO DE EXPRESIÓN DE ENTRADA RESULTADO

NVARCHAR(MAX) NVARCHAR(MAX)

VARCHAR(MAX) VARCHAR(MAX)
TIPO DE EXPRESIÓN DE ENTRADA RESULTADO

NVARCHAR(1…4000) NVARCHAR(4000)

VARCHAR(1…8000) VARCHAR(8000)

int, bigint, smallint, tinyint, numeric, float, real, bit, decimal, NVARCHAR(4000)
smallmoney, money, datetime, datetime2

Notas
STRING_AGG es una función de agregado que toma todas las expresiones de las filas y las concatena en una sola
cadena. Los valores de la expresión se convierten implícitamente a tipos string y, después, se concatenan. La
conversión implícita de cadenas sigue las reglas existentes para las conversiones de tipos de datos. Para más
información sobre las conversiones de tipo de datos, vea CAST y CONVERT (Transact-SQL ).
Si la expresión de entrada es de tipo VARCHAR , el separador no puede ser de tipo NVARCHAR .
Los valores NULL se omiten y no se agrega el separador correspondiente. Para devolver un marcador de
posición para valores NULL, use la función ISNULL como se muestra en el ejemplo B.
STRING_AGG está disponible en cualquier nivel de compatibilidad.

Ejemplos
A. Generar una lista de nombres separados en líneas nuevas
En el siguiente ejemplo se genera una lista de nombres en una única celda de resultados separados por retornos
de carro.

SELECT STRING_AGG (FirstName, CHAR(13)) AS csv


FROM Person.Person;

El conjunto de resultados es el siguiente.

CSV

Syed
Catherine
Kim
Kim
Kim
Hazem

Loa valores NULL detectados en las celdas name no se incluyen en el resultado.

NOTE
Si usa el Editor de consultas de Management Studio, la opción Resultados a cuadrícula no puede implementar el retorno
de carro. Cambie a Resultados a texto para ver el resultado configurado correctamente.

B. Generar una lista de nombres separados por coma sin valores NULL
En el siguiente ejemplo los valores NULL se reemplazan por "N/A" y se devuelven los nombres separados por
comas en una única celda de resultados.
SELECT STRING_AGG ( ISNULL(FirstName,'N/A'), ',') AS csv
FROM Person.Person;

El conjunto de resultados es el siguiente.

CSV

John,N/A,Mike,Peter,N/A,N/A,Alice,Bob

C. Generar nombres separados por comas

SELECT
STRING_AGG(CONCAT(FirstName, ' ', LastName, ' (', ModifiedDate, ')'), CHAR(13))
AS names
FROM Person.Person;

El conjunto de resultados es el siguiente.

NOMBRES

Ken Sánchez (8 de febrero de 2003 12:00 A.M.)


Terri Duffy (24 de febrero de 2002 12:00 A.M.)
Roberto Tamburello (5 de diciembre de 2001 12:00 A.M.)
Rob Walters (29 de diciembre de 2001 12:00 A.M.)

NOTE
Si usa el Editor de consultas de Management Studio, la opción Resultados a cuadrícula no puede implementar el retorno
de carro. Cambie a Resultados a texto para ver el resultado configurado correctamente.

D. Devolver artículos de noticias con etiquetas relacionadas


Los artículos y sus etiquetas están divididos en tablas diferentes. El desarrollador quiere que se devuelva una fila
por cada artículo con todas las etiquetas asociadas. Si se usa la siguiente consulta:

SELECT a.articleId, title, STRING_AGG (tag, ',') as tags


FROM dbo.Article AS a
LEFT JOIN dbo.ArticleTag AS t
ON a.ArticleId = t.ArticleId
GROUP BY a.articleId, title;

El conjunto de resultados es el siguiente.

ARTICLEID TITLE ETIQUETAS

172 Los sondeos vaticinan unos resultados política,sondeos,ayuntamiento


electorales ajustados

176 Se espera que la nueva autopista NULL


reduzca la congestión

177 Los perros siguen siendo más sondeos,animales


populares que los gatos
E. Generar una lista de correos electrónicos por ciudades
Con la siguiente consulta se buscan las direcciones de correo electrónico de los empleados y se las agrupa por
ciudades:

SELECT town, STRING_AGG (email, ';') AS emails


FROM dbo.Employee
GROUP BY town;

El conjunto de resultados es el siguiente.

TOWN EMAILS

Seattle syed0@adventure-works.com;catherine0@adventure-
works.com;kim2@adventure-works.com

Los Ángeles sam1@adventure-works.com;hazem0@adventure-


works.com

Los correos electrónicos devueltos en la columna emails se pueden usar para enviar mensajes de correo
electrónico al grupo de personas que trabajan en determinadas ciudades.
F. Generar una lista ordenada de correos electrónicos por ciudades
Al igual que el ejemplo anterior, con la siguiente consulta se buscan las direcciones de correo electrónico de los
empleados, se las agrupa por ciudad y se ordenan alfabéticamente:

SELECT town,
STRING_AGG (email, ';') WITHIN GROUP (ORDER BY email ASC) AS emails
FROM dbo.Employee
GROUP BY town;

El conjunto de resultados es el siguiente.

TOWN EMAILS

Seattle catherine0@adventure-works.com;kim2@adventure-
works.com;syed0@adventure-works.com

Los Ángeles hazem0@adventure-works.com;sam1@adventure-


works.com

Ver también
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Funciones de agregado (Transact-SQL )
Funciones de cadena (Transact-SQL )
STRING_ESCAPE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Aplica caracteres de escape a caracteres especiales en textos y devuelve texto con caracteres de escape.
STRING_ESCAPE es una función determinista.
Convenciones de sintaxis de Transact-SQL

Sintaxis
STRING_ESCAPE( text , type )

Argumentos
varchar (max)
Es una expresión nvarchar que representa el objeto que se debe escapar.
Tipo
Reglas de escape que se aplicarán. Actualmente el valor admitido es 'json' .

Tipos devueltos
Texto nvarchar(max) con caracteres especiales y de control de escape. Actualmente STRING_ESCAPE solo
puede aplicar caracteres de escape a los caracteres especiales de JSON que se muestran en las tablas siguientes.

CARÁCTER ESPECIAL SECUENCIA CODIFICADA

Comillas (") \"

Barra oblicua invertida (\) \\

Barra oblicua (/) \/

Retroceso \b

Avance de página \f

Nueva línea \n

Retorno de carro \r

Tabulación horizontal \t

CARÁCTER DE CONTROL SECUENCIA CODIFICADA

CHAR(0) \u0000
CARÁCTER DE CONTROL SECUENCIA CODIFICADA

CHAR(1) \u0001

… …

CHAR(31) \u001f

Notas
Ejemplos
A. Aplicar carácter de escape a texto según las reglas de formato de JSON
En esta consulta se aplican caracteres de escape a caracteres especiales mediante las reglas de JSON y se
devuelve texto de escape.

SELECT STRING_ESCAPE('\ /
\\ " ', 'json') AS escapedText;

El conjunto de resultados es el siguiente.

escapedText
-------------------------------------------------------------
\\\t\/\n\\\\\t\"\t

B. Aplicar formato a objeto de JSON


En esta consulta se crea texto de JSON a partir de variables de cadena y número, y se aplica un carácter de
escape a cualquier carácter especial de JSON en variables.

SET @json = FORMATMESSAGE('{ "id": %d,"name": "%s", "surname": "%s" }',


17, STRING_ESCAPE(@name,'json'), STRING_ESCAPE(@surname,'json') );

Ver también
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Funciones de cadena (Transact-SQL )
STRING_SPLIT (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Divide la expresión de caracteres usando el separador especificado.

NOTE
La función STRING_SPLIT solo está disponible en el nivel de compatibilidad 130 y superior. Si el nivel de compatibilidad de
la base de datos es inferior a 130, SQL Server no podrá encontrar ni ejecutar la función STRING_SPLIT. Para cambiar el
nivel de compatibilidad de una base de datos, vea Ver o cambiar el nivel de compatibilidad de una base de datos. Tenga en
cuenta que es posible que el nivel de compatibilidad 120 sea el valor predeterminado incluso en una Base de datos SQL de
Azure nueva.

Convenciones de sintaxis de Transact-SQL

Sintaxis
STRING_SPLIT ( string , separator )

Argumentos
string
Es una expresión de cualquier tipo de carácter (por ejemplo nvarchar, varchar, nchar o char).
separator
Es una expresión de carácter único de cualquier tipo de caracteres (por ejemplo, nvarchar(1), varchar(1),
nchar(1) o char(1)) que se usa como separador para cadenas concatenadas.

Tipos devueltos
Devuelve una tabla de una sola columna con fragmentos. El nombre de la columna es value. Devuelve nvarchar
si cualquiera de los argumentos de entrada es nvarchar o nchar. De lo contrario, devuelve varchar. La longitud
del tipo de valor devuelto es igual a la longitud del argumento de cadena.

Notas
STRING_SPLIT toma una cadena que se debe dividir y el separador que se usará para dividirla. Devuelve una
tabla de una sola columna con subcadenas. Por ejemplo, la siguiente instrucción
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' '); , en la que se usa el carácter de espacio
como separador, devuelve la siguiente tabla de resultados:

VALUE

Lorem

ipsum
VALUE

dolor

sit

amet.

Si la cadena de entrada es NULL, la función con valores de tabla STRING_SPLIT devuelve una tabla vacía.
STRING_SPLIT requiere el modo de compatibilidad 130 como mínimo.

Ejemplos
A. Dividir una cadena de valores separados por coma
Se analiza una lista de valores separados por coma y se devuelven todos los tokens que no están vacíos:

DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'

SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';

STRING_SPLIT devolverá una cadena vacía si no hay nada entre el separador. La condición "RTRIM (value) <>"
quitará los tokens vacíos.
B. Dividir una cadena de valores separados por coma en una columna
La tabla Product tiene una columna con una lista de etiquetas separadas por comas que se muestran en el
siguiente ejemplo:

PRODUCTID NOMBRE ETIQUETAS

1 Guantes clothing,road,touring,bike

2 Auriculares LL bike

3 HL Mountain Frame bike,mountain

Con la siguiente consulta se transforma cada lista de etiquetas y las combina con la fila original:

SELECT ProductId, Name, value


FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',');

El conjunto de resultados es el siguiente.

PRODUCTID NOMBRE VALUE

1 Guantes clothing

1 Guantes road
PRODUCTID NOMBRE VALUE

1 Guantes touring

1 Guantes bike

2 Auriculares LL bike

3 HL Mountain Frame bike

3 HL Mountain Frame mountain

C. Agregación por valores


Los usuarios deben crear un informe en el que se muestre el número de productos por etiqueta, ordenadas por
número de productos, y filtrar solo las etiquetas con más de dos productos.

SELECT value as tag, COUNT(*) AS [Number of articles]


FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',')
GROUP BY value
HAVING COUNT(*) > 2
ORDER BY COUNT(*) DESC;

D. Buscar por el valor de tabla


Los desarrolladores deben crear consultas que hallen artículos a partir de palabras clave. Pueden usar las
siguientes consultas:
Para encontrar productos con una sola etiqueta (clothing):

SELECT ProductId, Name, Tags


FROM Product
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));

Para encontrar productos con dos etiquetas especificadas (clothing y road):

SELECT ProductId, Name, Tags


FROM Product
WHERE EXISTS (SELECT *
FROM STRING_SPLIT(Tags, ',')
WHERE value IN ('clothing', 'road');

E. Encontrar filas por la lista de valores


Los desarrolladores deben crear una consulta que busque los artículos a partir de una lista de identificadores.
Pueden usar la siguiente consulta:

SELECT ProductId, Name, Tags


FROM Product
JOIN STRING_SPLIT('1,2,3',',')
ON value = ProductId;

Se trata de una forma de reemplazar el uso habitual de patrones poco recomendables, como la creación de una
cadena SQL dinámica en el nivel de aplicación o Transact-SQL, o usar el operador LIKE:
SELECT ProductId, Name, Tags
FROM Product
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';

Ver también
LEFT (Transact-SQL )
LTRIM (Transact-SQL )
RIGHT (Transact-SQL )
RTRIM (Transact-SQL )
SUBSTRING (Transact-SQL )
TRIM (Transact-SQL )
Funciones de cadena (Transact-SQL )
STUFF (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
La función STUFF inserta una cadena en otra. Elimina una longitud determinada de caracteres de la primera
cadena a partir de la posición de inicio y, a continuación, inserta la segunda cadena en la primera, en la posición
de inicio.
Convenciones de sintaxis de Transact-SQL

Sintaxis
STUFF ( character_expression , start , length , replaceWith_expression )

Argumentos
character_expression
Es una expresión de datos de caracteres. character_expression puede ser una constante, una variable o una
columna de datos binarios o de caracteres.
start
Es un valor entero que especifica la ubicación donde comienzan la eliminación y la inserción. Si start es negativo
o cero, se devuelve una cadena de tipo NULL. Si start es mayor que el primer valor de character_expression, se
devuelve una cadena de tipo NULL. start puede ser de tipo bigint.
length
Es un entero que especifica el número de caracteres que se elimina. Si length es negativo, se devuelve una
cadena de tipo NULL. Si length es mayor que el primer parámetro character_expression, se produce una
eliminación hasta el último carácter del último character_expression. Si length es cero, se produce una inserción
delante del primer carácter en la cadena. length puede ser de tipo bigint.
replaceWith_expression
Es una expresión de datos de caracteres. character_expression puede ser una constante, una variable o una
columna de datos binarios o de caracteres. Esta expresión reemplaza los caracteres legth de
character_expression, empezando por start. Si se proporciona NULL como replaceWith_expression, los
caracteres se quitan sin insertar nada.

Tipos devueltos
Devuelve datos de caracteres si character_expression es de alguno de los tipos de datos de caracteres admitidos.
Devuelve datos binarios si character_expression es de alguno de los tipos de datos binarios admitidos.

Notas
Si la posición de inicio o la longitud es negativa, o si la posición de inicio es mayor que la longitud de la primera
cadena, se devuelve una cadena NULL. Si la posición inicial es 0, se devuelve un valor NULL. Si la longitud que
se va a eliminar es mayor que la primera cadena, se elimina hasta el primer carácter de la primera cadena.
Si el valor resultante es mayor que el máximo admitido por el tipo devuelto, se genera un error.

Caracteres adicionales (pares suplentes)


Cuando se usan intercalaciones de caracteres adicionales, character_expression y replaceWith_expression
pueden incluir pares suplentes. El parámetro de longitud cuenta cada suplente en character_expression como un
único carácter.

Ejemplos
En el ejemplo siguiente se devuelve una cadena de caracteres creada eliminando tres caracteres de la primera
cadena, abcdef , a partir de la posición 2 de b , e insertando la segunda cadena en el punto de eliminación.

SELECT STUFF('abcdef', 2, 3, 'ijklmn');


GO

El conjunto de resultados es el siguiente.

---------
aijklmnef

(1 row(s) affected)

Ver también
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
TRANSL ATE (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
SUBSTRING (Transact-SQL)
18/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve parte de una expresión de caracteres, binaria, de texto o de imagen en SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
SUBSTRING ( expression ,start , length )

Argumentos
expression
Es una expresión de tipo character, binary, text, ntext o image.
start
Es un entero o una expresión bigint que especifica dónde empiezan los caracteres devueltos. (La numeración se
basa en 1, lo que significa que el primer carácter de la expresión es 1). Si start es menor que 1, la expresión
devuelta empezará en el primer carácter especificado en expression. En este caso, el número de caracteres que se
devuelve es el valor de la suma de start + length- 1 o 0. Si start es mayor que el número de caracteres de la
expresión de valor, se devuelve una expresión de longitud cero.
length
Es un entero positivo o una expresión bigint que especifica cuántos caracteres de expression se van a devolver. Si
length es negativo, se genera un error y finaliza la instrucción. Si la suma de start y length es mayor que el
número de caracteres de expression, se devuelve la expresión de valor completa que empieza en start.

Tipos devueltos
Devuelve datos de caracteres si expression es de alguno de los tipos de datos de caracteres admitidos. Devuelve
datos binarios si expression es de alguno de los tipos de datos binary admitidos. La cadena devuelta es del
mismo tipo que la expresión indicada, con las excepciones mostradas en la tabla:

EXPRESIÓN ESPECIFICADA TIPO DE VALOR DEVUELTO

char/varchar/text varchar

nchar/nvarchar/ntext nvarchar

binary/varbinary/image varbinary

Notas
Los valores de start y length deben especificarse en número de caracteres para los tipos de datos ntext, char o
varchar y bytes para los tipos de datos text, image, binary o varbinary.
expresión debe ser de tipo varchar(max) o varbinary(max) cuando start o length contienen un valor mayor
que 2 147 483 647.

Caracteres adicionales (pares suplentes)


Al usar intercalaciones de caracteres suplementarios (SC ), start y length cuentan cada par suplente de expression
como un único carácter. Para más información, consulte Compatibilidad con la intercalación y Unicode.

Ejemplos
A. Usar SUBSTRING con una cadena de caracteres
En el siguiente ejemplo se muestra cómo devolver únicamente una parte de una cadena de caracteres. Desde la
tabla sys.databases , esta consulta devuelve los nombres de base de datos del sistema en la primera columna, la
primera letra de la base de datos en la segunda columna y el tercer y cuarto carácter en la última columna.

SELECT name, SUBSTRING(name, 1, 1) AS Initial ,


SUBSTRING(name, 3, 2) AS ThirdAndFourthCharacters
FROM sys.databases
WHERE database_id < 5;

El conjunto de resultados es el siguiente.

NAME INITIAL THIRDANDFOURTHCHARACTERS

maestra m st

tempdb t mp

model m de

msdb m db

He aquí cómo mostrar el segundo, tercer y cuarto caracteres de la constante de cadena abcdef .

SELECT x = SUBSTRING('abcdef', 2, 3);

El conjunto de resultados es el siguiente.

x
----------
bcd

(1 row(s) affected)

B. Usar SUBSTRING con datos de tipo text, ntext e image

NOTE
Para ejecutar estos ejemplos, es necesario instalar la base de datos pubs.

En este ejemplo se muestra cómo se devuelven los diez primeros caracteres de cada columna de datos de tipo
text e image de la tabla pub_info de la base de datos pubs . Los datos de text se devuelven como varchar,
mientras que los datos de image se devuelven como varbinary.
USE pubs;
SELECT pub_id, SUBSTRING(logo, 1, 10) AS logo,
SUBSTRING(pr_info, 1, 10) AS pr_info
FROM pub_info
WHERE pub_id = '1756';

El conjunto de resultados es el siguiente.

pub_id logo pr_info


------ ---------------------- ----------
1756 0x474946383961E3002500 This is sa

(1 row(s) affected)

En este ejemplo se muestra el efecto de SUBSTRING en los datos de tipo text y ntext. En primer lugar, este
ejemplo crea una nueva tabla en la base de datos pubs denominada npub_info . En segundo lugar, crea la
columna pr_info en la tabla npub_info a partir de los primeros 80 caracteres de la columna pub_info.pr_info y
agrega una ü como primer carácter. Por último, INNER JOIN recupera todos los números de identificación del
publicador y una función SUBSTRING de las columnas de información del publicador, de tipo text y ntext.

IF EXISTS (SELECT table_name FROM INFORMATION_SCHEMA.TABLES


WHERE table_name = 'npub_info')
DROP TABLE npub_info;
GO
-- Create npub_info table in pubs database. Borrowed from instpubs.sql.
USE pubs;
GO
CREATE TABLE npub_info
(
pub_id char(4) NOT NULL
REFERENCES publishers(pub_id)
CONSTRAINT UPKCL_npubinfo PRIMARY KEY CLUSTERED,
pr_info ntext NULL
);

GO

-- Fill the pr_info column in npub_info with international data.


RAISERROR('Now at the inserts to pub_info...',0,1);

GO

INSERT npub_info VALUES('0736', N'üThis is sample text data for New Moon Books, publisher 0736 in the pubs
database')
,('0877', N'üThis is sample text data for Binnet & Hardley, publisher 0877 in the pubs databa')
,('1389', N'üThis is sample text data for Algodata Infosystems, publisher 1389 in the pubs da')
,('9952', N'üThis is sample text data for Scootney Books, publisher 9952 in the pubs database')
,('1622', N'üThis is sample text data for Five Lakes Publishing, publisher 1622 in the pubs d')
,('1756', N'üThis is sample text data for Ramona Publishers, publisher 1756 in the pubs datab')
,('9901', N'üThis is sample text data for GGG&G, publisher 9901 in the pubs database. GGG&G i')
,('9999', N'üThis is sample text data for Lucerne Publishing, publisher 9999 in the pubs data');
GO
-- Join between npub_info and pub_info on pub_id.
SELECT pr.pub_id, SUBSTRING(pr.pr_info, 1, 35) AS pr_info,
SUBSTRING(npr.pr_info, 1, 35) AS npr_info
FROM pub_info pr INNER JOIN npub_info npr
ON pr.pub_id = npr.pub_id
ORDER BY pr.pub_id ASC;

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
C. Usar SUBSTRING con una cadena de caracteres
En el siguiente ejemplo se muestra cómo devolver únicamente una parte de una cadena de caracteres. En la tabla
dbo.DimEmployee , esta consulta devuelve el apellido en una columna y solo la primera inicial en la segunda
columna.

-- Uses AdventureWorks

SELECT LastName, SUBSTRING(FirstName, 1, 1) AS Initial


FROM dbo.DimEmployee
WHERE LastName LIKE 'Bar%'
ORDER BY LastName;

El conjunto de resultados es el siguiente.

LastName Initial
-------------------- -------
Barbariol A
Barber D
Barreto de Mattos P

En este ejemplo se muestra el segundo, tercer y cuarto carácter de la constante de cadena abcdef .

USE ssawPDW;

SELECT TOP 1 SUBSTRING('abcdef', 2, 3) AS x FROM dbo.DimCustomer;

El conjunto de resultados es el siguiente.

x
-----
bcd

Ver también
LEFT (Transact-SQL )
LTRIM (Transact-SQL )
RIGHT (Transact-SQL )
RTRIM (Transact-SQL )
STRING_SPLIT (Transact-SQL )
TRIM (Transact-SQL )
Funciones de cadena (Transact-SQL )
TRANSLATE (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2017) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la cadena proporcionada como primer argumento después de que algunos caracteres especificados en
el segundo argumento se hayan convertido en un conjunto de destino de caracteres.

Sintaxis
TRANSLATE ( inputString, characters, translations)

Argumentos
inputString
Es una expresión de cualquier tipo de carácter (nvarchar, varchar, nchar, char).
caracteres
Es una expresión de cualquier tipo de carácter que contenga caracteres que se deben reemplazar.
traducciones
Es una expresión de caracteres que coincide con el segundo argumento según el tipo y longitud.

Tipos devueltos
Devuelve una expresión de caracteres del mismo tipo que inputString , donde se reemplazan los caracteres del
segundo argumento con los caracteres coincidentes del tercer argumento.

Notas
La función TRANSLATE devolverá un error si los caracteres y las traducciones tienen longitudes diferentes. La
función TRANSLATE debe devolver la entrada sin cambios si los valores null se proporcionan como argumentos
de reemplazo o caracteres. El comportamiento de la función TRANSLATE debe ser idéntico a la función REPL ACE.
El comportamiento de la función TRANSLATE es equivalente a usar varias funciones REPLACE .
TRANSLATE siempre reconoce la intercalación de SC.

Ejemplos
A. Reemplazar corchetes y llaves con llaves normales
En esta consulta se reemplazan corchetes y llaves en la cadena de entrada entre paréntesis:

SELECT TRANSLATE('2*[3+4]/{7-2}', '[]{}', '()()');

El conjunto de resultados es el siguiente.


2*(3+4)/(7-2)

NOTE
La función TRANSLATE de este ejemplo equivale, aunque es mucho más sencilla, a la siguiente instrucción mediante
REPLACE :
SELECT REPLACE(REPLACE(REPLACE(REPLACE('2*[3+4]/{7-2}','[','('), ']', ')'), '{', '('), '}', ')');

B. Convertir puntos GeoJSON en WKT


GeoJSON es un formato para codificar una variedad de estructuras de datos geográficos. Con la función
TRANSLATE , los desarrolladores pueden convertir fácilmente los puntos GeoJSON a formato WKT y viceversa.
En esta consulta se reemplazan corchetes y llaves en la entrada con llaves normales:

SELECT TRANSLATE('[137.4, 72.3]' , '[,]', '( )') AS Point,


TRANSLATE('(137.4 72.3)' , '( )', '[,]') AS Coordinates;

El conjunto de resultados es el siguiente.

PUNTO COORDENADAS

(137.4 72.3) [137.4,72.3]

Ver también
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
FORMATMESSAGE (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
String Functions (Transact-SQL ) [Funciones de cadena (Transact-SQL )]
TRIM (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2017) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Quita el carácter de espacio char(32) (u otros caracteres especificados) del principio o del final de una cadena.

Sintaxis
TRIM ( [ characters FROM ] string )

Argumentos
caracteres
Es un literal, una variable o una llamada de función de cualquier tipo de carácter no de LOB ( nvarchar , varchar ,
nchar o char ) que contiene caracteres que se deben quitar. Los tipos nvarchar(max) y varchar(max) no se
permiten.
string
Es una expresión de cualquier tipo de carácter ( nvarchar , varchar , nchar o char ) donde se deben quitar
caracteres.

Tipos devueltos
Devuelve una expresión de caracteres con un tipo de argumento de cadena donde el carácter de espacio
char(32) u otros caracteres especificados se quitan de ambos lados. Devuelve NULL si la cadena de entrada es
NULL .

Notas
La función TRIM quita el carácter de espacio char(32) de ambos lados de forma predeterminada. Es equivalente
a LTRIM(RTRIM(@string)) . El comportamiento de la función TRIM con los caracteres especificados es idéntico al
comportamiento de la función REPLACE , donde los caracteres de inicio o finalización se reemplazan por cadenas
vacías.

Ejemplos
A. Quitar el carácter de espacio de ambos lados de la cadena
En el siguiente ejemplo se quitan los espacios que van antes y después de la palabra test .

SELECT TRIM( ' test ') AS Result;

El conjunto de resultados es el siguiente.


test

B. Quitar los caracteres especificados de ambos lados de la cadena


En el siguiente ejemplo se quita un punto final y los espacios finales.

SELECT TRIM( '.,! ' FROM '# test .') AS Result;

El conjunto de resultados es el siguiente.


# test

Ver también
LEFT (Transact-SQL )
LTRIM (Transact-SQL )
RIGHT (Transact-SQL )
RTRIM (Transact-SQL )
STRING_SPLIT (Transact-SQL )
SUBSTRING (Transact-SQL )
Funciones de cadena (Transact-SQL )
UNICODE (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor entero, según la definición del estándar Unicode, para el primer carácter de la expresión de
entrada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
UNICODE ( 'ncharacter_expression' )

Argumentos
' ncharacter_expression '
Es una expresión nchar o nvarchar.

Tipos devueltos
int

Notas
En las versiones de SQL Server anteriores a SQL Server 2012 (11.x) y en Base de datos SQL de Azure, la función
UNICODE devuelve un punto de código UCS -2 en el intervalo de 0 a 0xFFFF. En SQL Server 2012 (11.x) y
ediciones posteriores, cuando se utilizan intercalaciones de SC, UNICODE devuelve un punto de código UTF 16
en el intervalo de 0 a 0x10FFFF.

Ejemplos
A. Utilizar las funciones UNICODE y NCHAR
En el ejemplo siguiente se utilizan las funciones UNICODE y NCHAR para imprimir el valor UNICODE del primer
carácter de la cadena Åkergatan de 24 caracteres y para imprimir el verdadero primer carácter ( Å ).

DECLARE @nstring nchar(12);


SET @nstring = N'Åkergatan 24';
SELECT UNICODE(@nstring), NCHAR(UNICODE(@nstring));

El conjunto de resultados es el siguiente.

----------- -
197 Å

B. Utilizar SUBSTRING, UNICODE y CONVERT


En el ejemplo siguiente se utilizan las funciones SUBSTRING , UNICODE y CONVERT para imprimir el número de
carácter, el carácter Unicode y el valor UNICODE de cada uno de los caracteres de la cadena Åkergatan 24 .

-- The @position variable holds the position of the character currently


-- being processed. The @nstring variable is the Unicode character
-- string to process.
DECLARE @position int, @nstring nchar(12);
-- Initialize the current position variable to the first character in
-- the string.
SET @position = 1;
-- Initialize the character string variable to the string to process.
-- Notice that there is an N before the start of the string, which
-- indicates that the data following the N is Unicode data.
SET @nstring = N'Åkergatan 24';
-- Print the character number of the position of the string you are at,
-- the actual Unicode character you are processing, and the UNICODE
-- value for this particular character.
PRINT 'Character #' + ' ' + 'Unicode Character' + ' ' + 'UNICODE Value';
WHILE @position <= DATALENGTH(@nstring)
-- While these are still characters in the character string,
BEGIN;
SELECT @position,
CONVERT(char(17), SUBSTRING(@nstring, @position, 1)),
UNICODE(SUBSTRING(@nstring, @position, 1));
SELECT @position = @position + 1;
END;

El conjunto de resultados es el siguiente.


Character # Unicode Character UNICODE Value

----------- ----------------- -----------


1 Å 197

----------- ----------------- -----------


2 k 107

----------- ----------------- -----------


3 e 101

----------- ----------------- -----------


4 r 114

----------- ----------------- -----------


5 g 103

----------- ----------------- -----------


6 a 97

----------- ----------------- -----------


7 t 116

----------- ----------------- -----------


8 a 97

----------- ----------------- -----------


9 n 110

----------- ----------------- -----------


10 32

----------- ----------------- -----------


11 2 50

----------- ----------------- -----------


12 4 52

Ver también
ASCII (Transact-SQL )
CHAR (Transact-SQL )
NCHAR (Transact-SQL )
Funciones de cadena (Transact-SQL )
Compatibilidad con la intercalación y Unicode
UPPER (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve una expresión de caracteres con datos de caracteres en minúsculas convertidos a mayúsculas.
Convenciones de sintaxis de Transact-SQL

Sintaxis
UPPER ( character_expression )

Argumentos
character_expression
Es una expresión de datos de caracteres. character_expression puede ser una constante, una variable o una
columna de datos binarios o de caracteres.
character_expression debe ser de un tipo de datos que se pueda convertir implícitamente a varchar. De lo
contrario, use CAST para convertir character_expression explícitamente.

Tipos devueltos
varchar o nvarchar

Ejemplos
En el ejemplo siguiente se utilizan las funciones UPPER y RTRIM para devolver el apellido de las personas de la
tabla dbo.DimEmployee de manera que aparezca en mayúsculas, recortado y concatenado al nombre.

-- Uses AdventureWorks

SELECT UPPER(RTRIM(LastName)) + ', ' + FirstName AS Name


FROM dbo.DimEmployee
ORDER BY LastName;

A continuación se muestra un conjunto parcial de resultados.

Name
------------------------------
ABBAS, Syed
ABERCROMBIE, Kim
ABOLROUS, Hazem

Ver también
Tipos de datos (Transact-SQL )
Funciones de cadena (Transact-SQL )
LOWER (Transact-SQL )
Funciones del sistema (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones del sistema realizan operaciones y devuelven información sobre valores, objetos y
configuraciones de SQL Server.

$PARTITION ERROR_PROCEDURE

@@ERROR ERROR_SEVERITY

@@IDENTITY ERROR_STATE

@@PACK_RECEIVED FORMATMESSAGE

@@ROWCOUNT GET_FILESTREAM_TRANSACTION_CONTEXT

@@TRANCOUNT GETANSINULL

BINARY_CHECKSUM HOST_ID

CHECKSUM HOST_NAME

COMPRESS ISNULL

CONNECTIONPROPERTY ISNUMERIC

CONTEXT_INFO MIN_ACTIVE_ROWVERSION

CURRENT_REQUEST_ID NEWID

CURRENT_TRANSACTION_ID NEWSEQUENTIALID

DECOMPRESS ROWCOUNT_BIG

ERROR_LINE SESSION_CONTEXT

ERROR_MESSAGE SESSION_ID

ERROR_NUMBER XACT_STATE

Ver también
Funciones integradas (Transact-SQL )
$PARTITION (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de partición al que se asignaría un conjunto de valores de columnas de partición para
cualquier función de partición especificada en SQL Server 2017.
Convenciones de sintaxis de Transact-SQL

Sintaxis
[ database_name. ] $PARTITION.partition_function_name(expression)

Argumentos
database_name
Es el nombre de la base de datos que contiene la función de partición.
partition_function_name
Es el nombre de cualquier función de partición existente con la que se está aplicando un conjunto de valores de
columnas de partición.
expression
Es una expression cuyo tipo de datos debe coincidir con el tipo de datos de su columna de partición
correspondiente, o debe poder convertirse a dicho tipo de datos de forma implícita. expression también puede ser
el nombre de una columna de partición que participa en ese momento en partition_function_name.

Tipos devueltos
int

Notas
$PARTITION devuelve un valor int entre 1 y el número de particiones de la función de partición.
$PARTITION devuelve el número de partición de cualquier valor válido, independientemente de si el valor existe
en ese momento en una tabla o índice con particiones que utilice la función de partición.

Ejemplos
A. Obtener el número de partición de un conjunto de valores de columnas de partición
En el siguiente ejemplo se crea una función de partición RangePF1 que realizará cuatro particiones en una tabla o
un índice. $PARTITION se utiliza para determinar que el valor 10 , que representa la columna de partición de
RangePF1 , se colocaría en la partición 1 de la tabla.
USE AdventureWorks2012;
GO
CREATE PARTITION FUNCTION RangePF1 ( int )
AS RANGE FOR VALUES (10, 100, 1000) ;
GO
SELECT $PARTITION.RangePF1 (10) ;
GO

B. Obtener el número de filas de cada partición no vacía de una tabla o un índice con particiones
En el siguiente ejemplo se devuelve el número de filas de cada partición de la tabla TransactionHistory que
contiene datos. La tabla TransactionHistory utiliza la función de partición TransactionRangePF1 . Además, se crean
particiones en la columna TransactionDate .
Para ejecutar este ejemplo, primero hay que ejecutar el script PartitionAW.sql en la base de datos de ejemplo
AdventureWorks2012. Para más información, vea PartitioningScript.

USE AdventureWorks2012;
GO
SELECT $PARTITION.TransactionRangePF1(TransactionDate) AS Partition,
COUNT(*) AS [COUNT] FROM Production.TransactionHistory
GROUP BY $PARTITION.TransactionRangePF1(TransactionDate)
ORDER BY Partition ;
GO

C. Devolver todas las filas de una partición de una tabla o un índice con particiones
En el siguiente ejemplo se devuelven todas las filas que se encuentran en la partición 5 de la tabla
TransactionHistory .

NOTE
Para ejecutar este ejemplo, primero hay que ejecutar el script PartitionAW.sql en la base de datos de ejemplo
AdventureWorks2012. Para más información, vea PartitioningScript.

SELECT * FROM Production.TransactionHistory


WHERE $PARTITION.TransactionRangePF1(TransactionDate) = 5 ;

Ver también
CREATE PARTITION FUNCTION (Transact-SQL )
@@ERROR (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de error de la última instrucción Transact-SQL ejecutada.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@ERROR

Tipos devueltos
integer

Notas
Devuelve 0 si la instrucción Transact-SQL anterior no encontró errores.
Devuelve un número de error si la instrucción anterior encontró un error. Si el error era uno de los errores de la
vista de catálogo sys.messages, entonces @@ERROR contendrá el valor de la columna sys.messages.message_id
para dicho error. Puede ver el texto asociado con el número de error @@ERROR en sys.messages.
Como @@ERROR se borra y restablece con cada instrucción ejecutada, debe comprobarlo inmediatamente
después de la instrucción que se está comprobando o guardarlo en una variable local para examinarlo
posteriormente.
Use la construcción TRY...CATCH para controlar errores. La construcción TRY...CATCH también admite funciones
de sistema adicionales (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY y
ERROR_STATE ) que devuelven más información sobre errores que @@ERROR. TRY...CATCH también admite
una función ERROR_NUMBER que no se limita a devolver el número de error en la instrucción inmediatamente
después de la instrucción que generó el error. Para obtener más información, vea TRY...CATCH (Transact-SQL ).

Ejemplos
A. Utilizar @@ERROR para detectar un error específico
En el ejemplo siguiente se utiliza @@ERROR para comprobar si se infringe una restricción CHECK (error nº 547) en
una instrucción UPDATE .

USE AdventureWorks2012;
GO
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 4
WHERE BusinessEntityID = 1;
IF @@ERROR = 547
PRINT N'A check constraint violation occurred.';
GO
B. Utilizar @@ERROR para salir condicionalmente de un procedimiento
En el ejemplo siguiente se utilizan las instrucciones IF...ELSE para probar @@ERROR después de una instrucción
DELETE en un procedimiento almacenado. El valor de la variable @@ERROR determina el código devuelto enviado al
programa que llamó, lo que indica si el procedimiento se realizó correcta o incorrectamente.

USE AdventureWorks2012;
GO
-- Drop the procedure if it already exists.
IF OBJECT_ID(N'HumanResources.usp_DeleteCandidate', N'P') IS NOT NULL
DROP PROCEDURE HumanResources.usp_DeleteCandidate;
GO
-- Create the procedure.
CREATE PROCEDURE HumanResources.usp_DeleteCandidate
(
@CandidateID INT
)
AS
-- Execute the DELETE statement.
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = @CandidateID;
-- Test the error value.
IF @@ERROR <> 0
BEGIN
-- Return 99 to the calling program to indicate failure.
PRINT N'An error occurred deleting the candidate information.';
RETURN 99;
END
ELSE
BEGIN
-- Return 0 to the calling program to indicate success.
PRINT N'The job candidate has been deleted.';
RETURN 0;
END;
GO

C. Usar @@ERROR con @@ROWCOUNT


En el ejemplo siguiente se utiliza @@ERROR con @@ROWCOUNT para validar la operación de una instrucción UPDATE .
Se comprueba el valor de @@ERROR para ver si hay un error y se utiliza @@ROWCOUNT para asegurarse de que la
actualización se aplica correctamente a una fila de la tabla.
USE AdventureWorks2012;
GO
IF OBJECT_ID(N'Purchasing.usp_ChangePurchaseOrderHeader',N'P')IS NOT NULL
DROP PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader;
GO
CREATE PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader
(
@PurchaseOrderID INT
,@BusinessEntityID INT
)
AS
-- Declare variables used in error checking.
DECLARE @ErrorVar INT;
DECLARE @RowCountVar INT;

-- Execute the UPDATE statement.


UPDATE PurchaseOrderHeader
SET BusinessEntityID = @BusinessEntityID
WHERE PurchaseOrderID = @PurchaseOrderID;

-- Save the @@ERROR and @@ROWCOUNT values in local


-- variables before they are cleared.
SELECT @ErrorVar = @@ERROR
,@RowCountVar = @@ROWCOUNT;

-- Check for errors. If an invalid @BusinessEntityID was specified,


-- the UPDATE statement returns a foreign key violation error #547.
IF @ErrorVar <> 0
BEGIN
IF @ErrorVar = 547
BEGIN
PRINT N'ERROR: Invalid ID specified for new employee.';
RETURN 1;
END
ELSE
BEGIN
PRINT N'ERROR: error '
+ RTRIM(CAST(@ErrorVar AS NVARCHAR(10)))
+ N' occurred.';
RETURN 2;
END
END

-- Check the row count. @RowCountVar is set to 0


-- if an invalid @PurchaseOrderID was specified.
IF @RowCountVar = 0
BEGIN
PRINT 'Warning: The BusinessEntityID specified is not valid';
RETURN 1;
END
ELSE
BEGIN
PRINT 'Purchase order updated with the new employee';
RETURN 0;
END;
GO

Ver también
TRY...CATCH (Transact-SQL )
ERROR_LINE (Transact-SQL )
ERROR_MESSAGE (Transact-SQL )
ERROR_NUMBER (Transact-SQL )
ERROR_PROCEDURE (Transact-SQL )
ERROR_SEVERITY (Transact-SQL )
ERROR_STATE (Transact-SQL )
@@ROWCOUNT (Transact-SQL )
sys.messages (Transact-SQL )
@@IDENTITY (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Se trata de una función del sistema que devuelve el último valor de identidad insertado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@IDENTITY

Tipos devueltos
numeric(38,0)

Notas
Cuando se completa una instrucción INSERT, SELECT INTO o de copia masiva, @@IDENTITY contiene el último
valor de identidad generado por la instrucción. Si la instrucción no afectó a ninguna tabla con columnas de
identidad, @@IDENTITY devuelve NULL. Si se insertan varias filas, lo que genera varios valores de identidad,
@@IDENTITY devuelve el último valor de identidad generado. Si la instrucción activa uno o más
desencadenadores que realizan inserciones que, a su vez, generan valores de identidad, al llamar a @@IDENTITY
inmediatamente después de la instrucción se obtiene el último valor de identidad generado por los
desencadenadores. Si un desencadenador se activa tras una acción de inserción en una tabla que tiene una
columna de identidad y se inserta en otra tabla que no tiene una columna de identidad, @@IDENTITY devuelve
el valor de identidad de la primera inserción. Si se produce un error en la instrucción INSERT o SELECT INTO o
en la copia masiva o se revierte la transacción, el valor de @@IDENTITY no revierte a un valor anterior.
Las instrucciones y transacciones con errores pueden cambiar la identidad actual de una tabla y crear huecos en
los valores de columna de identidad. El valor de identidad jamás se revierte, aun cuando no se haya confirmado la
transacción que intentó insertar el valor en la tabla. Por ejemplo, si se produce un error en una instrucción
INSERT debido a una infracción de tipo IGNORE_DUP_KEY, el valor de identidad actual de la tabla se sigue
incrementando.
Las funciones @@IDENTITY, SCOPE_IDENTITY e IDENT_CURRENT se parecen, porque devuelven el último
valor insertado en la columna IDENTITY de una tabla.
@@IDENTITY y SCOPE_IDENTITY devuelven el último valor de identidad generado en una tabla en la sesión
actual. SCOPE_IDENTITY solo devuelve el valor en el ámbito actual y @@IDENTITY no se limita a un ámbito
específico.
IDENT_CURRENT no está limitado por el ámbito y la sesión; se limita a una tabla especificada.
IDENT_CURRENT devuelve el valor de identidad generado para una tabla específica en cualquier sesión y
cualquier ámbito. Para obtener más información, vea IDENT_CURRENT (Transact-SQL ).
El ámbito de la función @@IDENTITY es la sesión actual en el servidor local en el que se ejecuta. Esta función no
se puede aplicar a servidores remotos o vinculados. Para obtener un valor de identidad de un servidor diferente,
ejecute un procedimiento almacenado en ese servidor remoto o vinculado y haga que dicho procedimiento (que
se está ejecutando en el contexto del servidor remoto o vinculado) recopile el valor de identidad y lo devuelva a la
conexión que llama del servidor local.
La replicación puede afectar al valor @@IDENTITY, ya que se usa en los desencadenadores de replicación y en
los procedimientos almacenados. @@IDENTITY no es un indicador confiable de la identidad más reciente creada
por el usuario si la columna forma parte de un artículo de replicación. Puede usar la sintaxis de función
SCOPE_IDENTITY () en lugar de @@IDENTITY. Para más información, vea SCOPE_IDENTITY (Transact-SQL )

NOTE
Es necesario reescribir la instrucción Transact-SQL o el procedimiento almacenado que realiza la llamada para que usen la
función SCOPE_IDENTITY() , lo que devuelve la última identidad usada en el ámbito de esa instrucción de usuario en lugar
de la identidad en el ámbito del desencadenador anidado usado por la replicación.

Ejemplos
En el siguiente ejemplo se inserta una fila en una tabla con una columna de identidad ( LocationID ) y se utiliza
@@IDENTITY para mostrar el valor de identidad empleado en la nueva fila.

USE AdventureWorks2012;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO

Ver también
Funciones del sistema (Transact-SQL )
CREATE TABLE (Transact-SQL )
IDENT_CURRENT (Transact-SQL )
INSERT (Transact-SQL )
SCOPE_IDENTITY (Transact-SQL )
SELECT (Transact-SQL )
@@PACK_RECEIVED (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de paquetes de entrada leídos desde la red por parte de SQL Server desde que se inició por
última vez.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@PACK_RECEIVED

Tipos devueltos
integer

Notas
Para mostrar un informe con varias estadísticas de SQL Server, incluidos los paquetes enviados y recibidos,
ejecute sp_monitor.

Ejemplos
En el siguiente ejemplo se muestra el uso de @@PACK_RECEIVED .

SELECT @@PACK_RECEIVED AS 'Packets Received';

A continuación se muestra un conjunto de resultados de ejemplo.

Packets Received
----------------
128

Ver también
@@PACK_SENT
sp_monitor
Funciones estadísticas del sistema
@@ROWCOUNT (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de filas afectadas por la última instrucción. Si el número de filas superior a dos mil millones,
use ROWCOUNT_BIG.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@ROWCOUNT

Tipos devueltos
int

Notas
Las instrucciones Transact-SQL pueden establecer el valor de @@ROWCOUNT de las siguientes maneras:
Establecer @@ROWCOUNT en el número de filas afectadas o leídas. Las filas pueden o no enviarse al
cliente.
Conservar @@ROWCOUNT de la anterior ejecución de una instrucción.
Restablecer @@ROWCOUNT en 0 y no devolver el valor al cliente.
Las instrucciones que realizan una asignación simple siempre establecen el valor @@ROWCOUNT en 1.
No se envían filas al cliente. Estos son algunos ejemplos de estas instrucciones: SET @local_variable,
RETURN, READTEXT y SELECT sin instrucciones de consulta, como por ejemplo, SELECT GETDATE () o
SELECT 'Texto genérico'.
Las instrucciones que realizan una asignación en una consulta o usan RETURN en una consulta establecen
el valor @@ROWCOUNT en el número de filas afectadas o leídas por la consulta, como por ejemplo:
SELECT @local_variable = c1 FROM t1.
Las instrucciones de lenguaje de manipulación de datos (DML ) establecen el valor de @@ROWCOUNT en
el número de filas afectadas por la consulta y devuelven ese valor al cliente. Las instrucciones DML pueden
no enviar ninguna fila al cliente.
DECL ARE CURSOR y FETCH establecen el valor de @@ROWCOUNT en 1.
Las instrucciones EXECUTE conservan el valor anterior de @@ROWCOUNT.
Las instrucciones como USE, SET <opción>, DEALLOCATE CURSOR, CLOSE CURSOR, BEGIN
TRANSACTION o COMMIT TRANSACTION restablecen el valor de ROWCOUNT en 0.
Los procedimientos almacenados compilados de forma nativa mantienen el @@ROWCOUNT anterior. Las
instrucciones Transact-SQL dentro de procedimientos almacenados compilados de forma nativa no
establecen @@ROWCOUNT. Para más información, vea Procedimientos almacenados compilados de
forma nativa.

Ejemplos
En el siguiente ejemplo se ejecuta una instrucción UPDATE y se utiliza @@ROWCOUNT para detectar si ha cambiado
alguna fila.

USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET JobTitle = N'Executive'
WHERE NationalIDNumber = 123456789
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were updated';
GO

Ver también
Funciones del sistema (Transact-SQL )
SET ROWCOUNT (Transact-SQL )
@@TRANCOUNT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de instrucciones BEGIN TRANSACTION que se han producido en la conexión actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@TRANCOUNT

Tipos devueltos
integer

Notas
La instrucción BEGIN TRANSACTION incrementa @@TRANCOUNT en 1. ROLLBACK TRANSACTION
disminuye @@TRANCOUNT a 0, salvo para ROLLBACK TRANSACTION savepoint_name, que no afecta a
@@TRANCOUNT. Cada instrucción COMMIT TRANSACTION o COMMIT WORK disminuye
@@TRANCOUNT en uno.

Ejemplos
A. Mostrar los efectos de las instrucciones BEGIN y COMMIT
En el ejemplo siguiente se muestra el efecto que tienen las instrucciones anidadas BEGIN y COMMIT en la variable
@@TRANCOUNT .

PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The COMMIT statement will decrement the transaction count by 1.
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--1
--0

B. Mostrar los efectos de las instrucciones BEGIN y ROLLBACK


En el ejemplo siguiente se muestra el efecto que tienen las instrucciones anidadas BEGIN TRAN y ROLLBACK en la
variable @@TRANCOUNT .

PRINT @@TRANCOUNT
-- The BEGIN TRAN statement will increment the
-- transaction count by 1.
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
-- The ROLLBACK statement will clear the @@TRANCOUNT variable
-- to 0 because all active transactions will be rolled back.
ROLLBACK
PRINT @@TRANCOUNT
--Results
--0
--1
--2
--0

Ver también
BEGIN TRANSACTION (Transact-SQL )
COMMIT TRANSACTION (Transact-SQL )
ROLLBACK TRANSACTION (Transact-SQL )
Funciones del sistema (Transact-SQL )
BINARY_CHECKSUM (Transact-SQL)
18/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor binario de suma de comprobación calculado en una fila de una tabla o en una lista de
expresiones.
Convenciones de sintaxis de Transact-SQL

Sintaxis
BINARY_CHECKSUM ( * | expression [ ,...n ] )

Argumentos
***
Especifica que el cálculo abarca todas las columnas de tabla. BINARY_CHECKSUM no incluye en el cálculo las
columnas que tienen tipos de datos no comparables. Entre los tipos de datos no comparables están los siguientes:
cursor
imagen
ntext
texto
xml
y los tipos de datos no comparables definidos por el usuario de CLR (Common Language Runtime).
expression
Una expresión de cualquier tipo. BINARY_CHECKSUM no incluye en el cálculo las expresiones que tienen tipos de
datos no comparables.

Tipos devueltos
int

Notas
BINARY_CHECKSUM (*), calculado en cualquier fila de una tabla, devuelve el mismo valor siempre que la fila no
se modifique posteriormente. BINARY_CHECKSUM cumple las propiedades de una función hash: si se aplica
BINARY_CHECKSUM sobre dos listas de expresiones, devuelve el mismo valor si los elementos correspondientes
de las dos listas tienen el mismo tipo y son iguales cuando se comparan utilizando el operador igual (=). En esta
definición, se dice que la comparación de valores NULL de un tipo específico se consideran como iguales. Si al
menos uno de los valores de la lista de expresiones cambia, la suma de comprobación de la expresión también
puede cambiar, aunque dicho extremo no está garantizado. Por lo tanto, para detectar si los valores han cambiado,
se recomienda usar BINARY_CHECKSUM solo si su aplicación puede tolerar una posible ausencia de cambio. De
lo contrario, es más aconsejable usar HashBytes. Con un algoritmo hash MD5 específico, la probabilidad de que
HashBytes devuelva el mismo resultado (de dos entradas diferentes) es mucho menor en comparación con
BINARY_CHECKSUM.
BINARY_CHECKSUM puede operar en una lista de expresiones y devuelve el mismo valor para una lista
especificada. BINARY_CHECKSUM aplicado a dos listas de expresiones cualquiera devuelve el mismo valor si los
elementos correspondientes de ambas listas tienen el mismo tipo y la misma representación de bytes. Para esta
definición, los valores NULL de un tipo especificado se considera que tienen la misma representación de bytes.
BINARY_CHECKSUM y CHECKSUM son funciones similares: se pueden utilizar para calcular un valor de suma
de comprobación en una lista de expresiones; el orden de las expresiones afecta al valor del resultado. El orden de
las columnas utilizadas en BINARY_CHECKSUM (*) es el orden de las columnas especificado en la definición de la
tabla o la vista. Esto incluye las columnas calculadas.
BINARY_CHECKSUM y CHECKSUM devuelven valores distintos para los tipos de datos de cadena, donde la
configuración regional puede hacer que cadenas con una presentación distinta se comparen como iguales. Los
tipos de datos String son los siguientes:
char
nchar
nvarchar
varchar
o Administrador de configuración de
sql_variant (si el tipo base de sql_variant es un tipo de datos String).
Por ejemplo, las cadenas "McCavity" y "Mccavity" tienen valores BINARY_CHECKSUM distintos. Por el contrario,
en un servidor que no distingue entre mayúsculas y minúsculas, CHECKSUM devuelve los mismos valores de
suma de comprobación para ambas cadenas. Debe evitar la comparación de valores de CHECKSUM con valores
de BINARY_CHECKSUM.
BINARY_CHECKSUM admite hasta 8000 caracteres de tipo varbinary(max) y un máximo de 255 caracteres de
tipo nvarchar(max).

Ejemplos
Este ejemplo utiliza BINARY_CHECKSUM para detectar cambios en una fila de tabla.

USE AdventureWorks2012;
GO
CREATE TABLE myTable (column1 int, column2 varchar(256));
GO
INSERT INTO myTable VALUES (1, 'test');
GO
SELECT BINARY_CHECKSUM(*) from myTable;
GO
UPDATE myTable set column2 = 'TEST';
GO
SELECT BINARY_CHECKSUM(*) from myTable;
GO

Vea también
Funciones de agregado (Transact-SQL )
CHECKSUM (Transact-SQL )
CHECKSUM_AGG (Transact-SQL )
CHECKSUM (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
La función CHECKSUM devuelve el valor de la suma de comprobación calculado sobre una fila de una tabla o sobre
una lista de expresiones. Use CHECKSUM para generar índices hash.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CHECKSUM ( * | expression [ ,...n ] )

Argumentos
*
Este argumento especifica que el cálculo de la suma de comprobación cubre todas las columnas de la tabla.
CHECKSUM devuelve un error si alguna columna tiene un tipo de datos no comparable. Entre los tipos de datos no
comparables están los siguientes:
cursor
imagen
ntext
texto
XML
Otro tipo de datos no comparable es sql_variant con cualquiera de los tipos de datos anteriores como tipo base.
expression
Una expresión de cualquier tipo, excepto un tipo de datos no comparable.

Tipos de valores devueltos


int

Notas
CHECKSUM calcula un valor hash, denominado suma de comprobación, sobre su lista de argumentos. Use este
valor hash para generar índices hash. Se generará un índice hash si la función CHECKSUM tiene argumentos de
columna y se crea un índice sobre el valor CHECKSUM calculado. Éste se puede utilizar para búsquedas de
igualdades sobre las columnas.
La función CHECKSUM cumple las propiedades de una función hash: si se aplica CHECKSUM sobre dos listas de
expresiones, se devolverá el mismo valor si los elementos correspondientes de ambas listas tienen el mismo tipo
de datos y estos elementos son iguales cuando se comparan con el operador igual (=). Se definen valores NULL
de un tipo especificado para compararse como iguales con fines de la función CHECKSUM . Si al menos uno de los
valores de la lista de expresiones cambia, la suma de comprobación de la lista probablemente cambiará, aunque
dicho extremo no está garantizado. Por lo tanto, para detectar si los valores han cambiado, se recomienda usar
CHECKSUM solo si su aplicación puede tolerar una posible ausencia de cambio. De lo contrario, es más aconsejable
usar HashBytes. Con un algoritmo hash MD5 específico, la probabilidad de que HashBytes devuelva el mismo
resultado (de dos entradas diferentes) es mucho menor en comparación con CHECKSUM.
El orden de las expresiones afecta al valor CHECKSUM calculado. El orden de las columnas usado para
CHECKSUM (*) es el orden de las columnas especificado en la definición de la tabla o la vista. Esto incluye las
columnas calculadas.
El valor de CHECKSUM depende de la intercalación. El mismo valor almacenado con una intercalación diferente
devolverá un valor de CHECKSUM diferente.

Ejemplos
En estos ejemplos se muestra el uso de CHECKSUM para generar índices hash.
Para crear el índice hash, en el primer ejemplo se agrega una columna de suma de comprobación calculada a la
tabla que se quiere indizar. Luego se crea un índice en la columna de la suma de comprobación.

-- Create a checksum index.


SET ARITHABORT ON;
USE AdventureWorks2012;
GO
ALTER TABLE Production.Product
ADD cs_Pname AS CHECKSUM(Name);
GO
CREATE INDEX Pname_index ON Production.Product (cs_Pname);
GO

En este ejemplo se muestra el uso de un índice de suma de comprobación como índice hash. Esto puede ayudar a
mejorar la velocidad de indización cuando la columna que se quiere indizar es una columna de cadenas largas de
caracteres. El índice de suma de comprobación se puede utilizar para búsquedas de igualdades.

/*Use the index in a SELECT query. Add a second search


condition to catch stray cases where checksums match,
but the values are not the same.*/
SELECT *
FROM Production.Product
WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
AND Name = N'Bearing Ball';
GO

La creación del índice en la columna calculada se materializa en la columna de suma de comprobación y cualquier
cambio en el valor de ProductName se propagará a la columna de suma de comprobación. Como alternativa se
puede crear un índice directamente en la columna que se quiere indizar, aunque para los valores de clave largos es
probable que un índice normal no se comporte tan bien como un índice de suma de comprobación.

Vea también
CHECKSUM_AGG (Transact-SQL )
HASHBYTES (Transact-SQL )
BINARY_CHECKSUM (Transact-SQL )
COMPRESS (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función comprime la expresión de entrada usando el algoritmo GZIP. La función devuelve una matriz de bytes
del tipo varbinary(max).
Convenciones de sintaxis de Transact-SQL

Sintaxis
COMPRESS ( expression )

Argumentos
expression
Un
binary(n)
char(n)
nchar(n)
nvarchar(max)
nvarchar(n)
varbinary(max)
varbinary(n)
ntext
o Administrador de configuración de
varchar(n)
expression: Para más información, vea Expresiones (Transact-SQL ).

Tipos de valores devueltos


varbinary(max) representa el contenido comprimido de la entrada.

Notas
Los datos comprimidos no se pueden indexar.
La función COMPRESS comprime los datos de la expresión de entrada. Debe invocar esta función para cada sección
de datos que se vaya a comprimir. Vea Compresión de datos para obtener más información acerca de la
compresión de datos automática durante el almacenamiento en el nivel de fila o página.

Ejemplos
A. Comprimir datos durante la inserción de tabla
En este ejemplo se muestra cómo comprimir los datos insertados en una tabla:

INSERT INTO player (name, surname, info )


VALUES (N'Ovidiu', N'Cracium',
COMPRESS(N'{"sport":"Tennis","age": 28,"rank":1,"points":15258, turn":17}'));

INSERT INTO player (name, surname, info )


VALUES (N'Michael', N'Raheem', compress(@info));

B. Archivar una versión comprimida de filas eliminadas


Esta instrucción primero elimina los registros antiguos del reproductor de la tabla player . Para ahorrar espacio,
luego almacena los registros en la tabla inactivePlayer , en un formato comprimido.

DELETE player
WHERE datemodified < @startOfYear
OUTPUT id, name, surname datemodifier, COMPRESS(info)
INTO dbo.inactivePlayers ;

Vea también
Funciones de cadena (Transact-SQL )
DECOMPRESS (Transact-SQL )
CONNECTIONPROPERTY (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Para una solicitud que llega al servidor, esta función devuelve información sobre las propiedades de conexión de la
conexión única que admite esa solicitud.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CONNECTIONPROPERTY ( property )

Argumentos
property
La propiedad de la conexión. property puede ser uno de estos valores:

VALOR TIPO DE DATOS DESCRIPCIÓN

net_transport nvarchar(40) Devuelve el protocolo de transporte


físico utilizado por esta conexión. Este
valor no admite valores NULL. Posibles
valores devueltos:

HTTP
Canalización con nombre
Session
Memoria compartida
SSL
TCP

VIA

Nota: Siempre se devuelve Session


cuando una conexión tiene habilitado
tanto el conjunto de resultados activo
múltiple (MARS) como la agrupación de
conexiones.

protocol_type nvarchar(40) Devuelve el tipo de protocolo de la


carga. Actualmente, distingue entre TDS
(TSQL) y SOAP. Acepta valores NULL.
VALOR TIPO DE DATOS DESCRIPCIÓN

auth_scheme nvarchar(40) Devuelve el esquema de autenticación


de SQL Server de la conexión. El
esquema de autenticación puede utilizar
la autenticación de Windows (NTLM,
KERBEROS, DIGEST, BASIC, NEGOTIATE)
o la autenticación de SQL Server. No
admite valores NULL.

local_net_address varchar(48) Devuelve la dirección IP del servidor


que es el destino de esta conexión
específico. Solo está disponible para las
conexiones que utilicen el proveedor de
transporte TCP. Acepta valores NULL.

local_tcp_port int Devuelve el puerto TCP del servidor de


destino de esta conexión, si se trata de
una conexión que utiliza el transporte
TCP. Acepta valores NULL.

client_net_address varchar(48) Solicita la dirección del cliente que se


está conectando a este servidor. Acepta
valores NULL.

physical_net_transport nvarchar(40) Devuelve el protocolo de transporte


físico utilizado por esta conexión.
Preciso cuando una conexión tiene
habilitado Multiple Active Result Sets
(MARS).

<Cualquier otra cadena> Devuelve NULL en una entrada no


válida.

Notas
local_net_address y local_tcp_port devuelven NULL en SQL Database.
Los valores devueltos coinciden con las opciones mostradas en las columnas correspondientes de la vista de
administración dinámica sys.dm_exec_connections. Por ejemplo:

SELECT
ConnectionProperty('net_transport') AS 'Net transport',
ConnectionProperty('protocol_type') AS 'Protocol type';

Vea también
sys.dm_exec_sessions (Transact-SQL )
sys.dm_exec_requests (Transact-SQL )
CONTEXT_INFO (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el valor context_info establecido para la sesión o lote actual, o derivada del uso de la
instrucción SET CONTEXT_INFO.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CONTEXT_INFO()

Valor devuelto
El valor context_info.
Si context_info no se ha establecido:
En SQL Server devuelve NULL.
En SQL Database devuelve un GUID único específico de sesión.

Notas
La característica de conjuntos de resultados activos múltiples (MARS ) permite a las aplicaciones ejecutar varios
lotes o solicitudes al mismo tiempo en la misma conexión. Cuando uno de los lotes de una conexión MARS
ejecuta SET CONTEXT_INFO, la función CONTEXT_INFO devuelve el nuevo valor de contexto cuando la función
CONTEXT_INFO se ejecuta en el mismo lote que la instrucción SET. Si la función CONTEXT_INFO se ejecuta en uno o
más de los otros lotes de conexión, CONTEXT_FUNCTION no devuelve el nuevo valor a menos que esos lotes hayan
comenzado después de completar el lote que ejecutó la instrucción SET.

Permisos
No requiere permisos especiales. Las siguientes vistas del sistema almacenan la información de contexto, pero la
consulta directa de estas vistas requiere los permisos SELECT y VIEW SERVER STATE:
sys.dm_exec_requests
sys.dm_exec_sessions
sys.sysprocesses

Ejemplos
En este ejemplo sencillo se establece el valor de context_info en 0x1256698456 y, después, se usa la función
CONTEXT_INFO para recuperarlo.
SET CONTEXT_INFO 0x1256698456;
GO
SELECT CONTEXT_INFO();
GO

Vea también
SET CONTEXT_INFO (Transact-SQL )
CURRENT_REQUEST_ID (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el identificador de la solicitud actual en la sesión actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CURRENT_REQUEST_ID()

Tipos de valores devueltos


smallint

Notas
Para obtener información exacta sobre la sesión actual, utilice @@SPID. Para obtener información exacta sobre la
solicitud actual, utilice CURRENT_REQUEST_ID ().

Vea también
@@SPID (Transact-SQL )
CURRENT_TRANSACTION_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el identificador de transacción de la transacción actual en la sesión actual.
Convenciones de sintaxis de Transact-SQL

Sintaxis
CURRENT_TRANSACTION_ID( )

Tipos de valores devueltos


bigint

Valor devuelto
El identificador de transacción de la transacción actual en la sesión actual tomado de
sys.dm_tran_current_transaction (Transact-SQL ).

Permisos
Cualquier usuario puede devolver el identificador de transacción de la sesión actual.

Ejemplos
En este ejemplo se devuelve el identificador de transacción de la sesión actual:

SELECT CURRENT_TRANSACTION_ID();

Vea también
sp_set_session_context (Transact-SQL )
SESSION_CONTEXT (Transact-SQL )
Seguridad de nivel de fila
CONTEXT_INFO (Transact-SQL )
SET CONTEXT_INFO (Transact-SQL )
DECOMPRESS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función descomprimirá un valor de expresión de entrada mediante el algoritmo GZIP. DECOMPRESS devolverá
una matriz de bytes (de tipo VARBINARY (MAX)).
Convenciones de sintaxis de Transact-SQL

Sintaxis
DECOMPRESS ( expression )

Argumentos
expression
Un valor varbinary(n), varbinary(max) o binary(n). Para más información, vea Expresiones (Transact-SQL ).

Tipos devueltos
Un valor de tipo de datos varbinary (max). DECOMPRESS usará el algoritmo ZIP para descomprimir el argumento
de entrada. El usuario debe convertir explícitamente el resultado en un tipo de destino si es necesario.

Notas
Ejemplos
A. Descomprimir datos en el tiempo de consulta
En este ejemplo se muestra cómo devolver datos de tabla comprimidos:

SELECT _id, name, surname, datemodified,


CAST(DECOMPRESS(info) AS NVARCHAR(MAX)) AS info
FROM player;

B. Mostrar los datos comprimidos con columna calculada


En este ejemplo se muestra cómo crear una tabla para almacenar los datos descomprimidos:

CREATE TABLE example_table (


_id int primary key identity,
name nvarchar(max),
surname nvarchar(max),
info varbinary(max),
info_json as CAST(decompress(info) as nvarchar(max))
);

Ver también
Funciones de cadena (Transact-SQL )
COMPRESS (Transact-SQL )
ERROR_LINE (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de línea de la repetición de un error que provocó la ejecución del bloque
CATCH de una construcción TRY…CATCH.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ERROR_LINE ( )

Tipo devuelto
int

Valor devuelto
Cuando se llama en un bloque CATCH, ERROR_LINE devuelve
el número de línea donde se produjo el error.
el número de línea de una rutina, si el error se produjo en un procedimiento almacenado o desencadenador.
NULL, si se llamó desde fuera del ámbito del bloque CATCH.

Notas
Una llamada a ERROR_LINE se puede producir en cualquier lugar del ámbito de un bloque CATCH.
ERROR_LINE devuelve el número de línea en que se produjo el error. Esto ocurre independientemente de la
ubicación de la llamada a ERROR_LINE dentro del ámbito del bloque CATCH y del número de llamadas a
ERROR_LINE . Esto contrasta con las funciones, como @@ERROR. @@ERROR devuelve el número de error en la
instrucción inmediatamente posterior a la que produjo el error o en la primera instrucción de un bloque CATCH.
En los bloques CATCH anidados, ERROR_LINE devuelve el número de línea del error específico del ámbito del
bloque CATCH en el que se hace referencia al mismo. Por ejemplo, el bloque CATCH de una construcción
TRY...CATCH podría contener una construcción TRY...CATCH anidada. Dentro del bloque CATCH anidado,
ERROR_LINE devuelve el número de línea del error que invocó el bloque CATCH anidado. Si ERROR_LINE se
ejecuta en el bloque CATCH externo, devuelve el número de línea del error que invocó ese bloque CATCH
específico.

Ejemplos
A. Utilizar ERROR_LINE en un bloque CATCH
En este ejemplo de código se muestra una instrucción SELECT que genera un error de división por cero.
ERROR_LINE devuelve el número de línea donde se produjo el error.
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_LINE() AS ErrorLine;
END CATCH;
GO

El conjunto de resultados es el siguiente.

Result
-----------

(0 row(s) affected)

ErrorLine
-----------
4

(1 row(s) affected)

B. Utilizar ERROR_LINE en un bloque CATCH con un procedimiento almacenado


En este ejemplo se muestra un procedimiento almacenado que genera un error de división por cero. ERROR_LINE
devuelve el número de línea donde se produjo el error.

-- Verify that the stored procedure does not already exist.


IF OBJECT_ID ( 'usp_ExampleProc', 'P' ) IS NOT NULL
DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that


-- generates a divide-by-zero error.
CREATE PROCEDURE usp_ExampleProc
AS
SELECT 1/0;
GO

BEGIN TRY
-- Execute the stored procedure inside the TRY block.
EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
SELECT ERROR_LINE() AS ErrorLine;
END CATCH;
GO

El conjunto de resultados es el siguiente.

-----------

(0 row(s) affected)

ErrorLine
-----------
7

(1 row(s) affected)

C. Utilizar ERROR_LINE en un bloque CATCH con otras herramientas de control de errores


En este ejemplo de código se muestra una instrucción SELECT que genera un error de división por cero.
ERROR_LINE devuelve el número de línea donde se produjo el error y la información relacionada con el error
propiamente dicho.

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

El conjunto de resultados es el siguiente.

-----------

(0 row(s) affected)

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage


----------- ------------- ---------- -------------- --------- ---------------------------------
8134 16 1 NULL 3 Divide by zero error encountered.

(1 row(s) affected)

Ver también
TRY...CATCH (Transact-SQL )
sys.messages (Transact-SQL )
ERROR_NUMBER (Transact-SQL )
ERROR_MESSAGE (Transact-SQL )
ERROR_PROCEDURE (Transact-SQL )
ERROR_SEVERITY (Transact-SQL )
ERROR_STATE (Transact-SQL )
RAISERROR (Transact-SQL )
@@ERROR (Transact-SQL )
ERROR_MESSAGE (Transact-SQL)
18/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el texto del mensaje del error que ha provocado la ejecución del bloque CATCH de una
construcción TRY…CATCH.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ERROR_MESSAGE ( )

Tipos devueltos
nvarchar(4000)

Valor devuelto
Cuando se llama en un bloque CATCH, ERROR_MESSAGE devuelve el texto completo del mensaje de error que ha
provocado la ejecución del bloque CATCH . En el texto se incluyen los valores proporcionados para los
parámetros sustituibles, como las longitudes, los nombres de objeto o las horas.
ERROR_MESSAGE devuelve NULL si se llama desde fuera del ámbito de un bloque CATCH.

Notas
ERROR_MESSAGE admite llamadas en cualquier lugar del ámbito de un bloque CATCH.
ERROR_MESSAGE devuelve un mensaje de error relevante, con independencia de cuántas veces se ejecute o de
dónde se ejecute dentro del ámbito del bloque CATCH . Esto contrasta con funciones como @@ERROR, que solo
devuelve un número de error en la instrucción inmediatamente posterior a la que produjo el error.
En los bloques CATCH anidados, ERROR_MESSAGE devuelve el mensaje de error específico del ámbito del bloque
CATCH al que hace referencia ese bloque CATCH . Por ejemplo, el bloque CATCH de una construcción
TRY...CATCH externa podría tener una construcción TRY...CATCH interna. Dentro de ese bloque interno CATCH ,
ERROR_MESSAGE devuelve el mensaje de error que invocó el bloque CATCH interno. Si ERROR_MESSAGE se ejecuta
en el bloque CATCH externo, devuelve el mensaje de error que invocó ese bloque CATCH externo.

Ejemplos
A. Usar ERROR_MESSAGE en un bloque CATCH
En este ejemplo se muestra una instrucción SELECT que genera un error de división por cero. El bloque CATCH
devuelve el mensaje de error.
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorMessage
----------------------------------
Divide by zero error encountered.

(1 row(s) affected)

B. Usar ERROR_MESSAGE en un bloque CATCH con otras herramientas de control de errores.


En este ejemplo se muestra una instrucción SELECT que genera un error de división por cero. Junto con el
mensaje de error, el bloque CATCH devuelve información sobre ese error.

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage


----------- ------------- ----------- --------------- ---------- ----------------------------------
8134 16 1 NULL 4 Divide by zero error encountered.

(1 row(s) affected)
ERROR_NUMBER (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número del error que ha provocado la ejecución del bloque CATCH de una construcción
TRY…CATCH.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ERROR_NUMBER ( )

Tipos devueltos
int

Valor devuelto
Si se llama en un bloque CATCH, ERROR_NUMBER devuelve el número del error que ha provocado la ejecución del
bloque CATCH.
ERROR_NUMBER devuelve NULL si se llama desde fuera del ámbito de un bloque CATCH.

Notas
ERROR_NUMBER admite llamadas en cualquier lugar del ámbito de un bloque CATCH.
ERROR_NUMBER devuelve un número de error relevante, con independencia de cuántas veces se ejecute o de dónde
se ejecute dentro del ámbito del bloque CATCH . Esto contrasta con funciones como @@ERROR, que solo
devuelve un número de error en la instrucción inmediatamente posterior a la que produjo el error.
En un bloque CATCH anidado, ERROR_NUMBER devuelve el número de error específico del ámbito del bloque
CATCH al que hace referencia ese bloque CATCH . Por ejemplo, el bloque CATCH de una construcción TRY...CATCH
externa podría tener una construcción TRY...CATCH interna. Dentro de ese bloque interno CATCH , ERROR_NUMBER
devuelve el número del error que invocó el bloque CATCH interno. Si ERROR_NUMBER se ejecuta en el bloque
CATCH externo, devuelve el número del error que invocó ese bloque CATCH externo.

Ejemplos
A. Usar ERROR_NUMBER en un bloque CATCH
En este ejemplo se muestra una instrucción SELECT que genera un error de división por cero. El bloque CATCH
devuelve el número de error.
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorNumber
-----------
8134

(1 row(s) affected)

B. Usar ERROR_NUMBER en un bloque CATCH con otras herramientas de control de errores


En este ejemplo se muestra una instrucción SELECT que genera un error de división por cero. Junto con el
número de error, el bloque CATCH devuelve información sobre ese error.

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage


----------- ------------- ----------- --------------- ---------- ----------------------------------
8134 16 1 NULL 4 Divide by zero error encountered.

(1 row(s) affected)

Ver también
sys.messages (Transact-SQL )
TRY...CATCH (Transact-SQL )
ERROR_LINE (Transact-SQL )
ERROR_MESSAGE (Transact-SQL )
ERROR_PROCEDURE (Transact-SQL )
ERROR_SEVERITY (Transact-SQL )
ERROR_STATE (Transact-SQL )
RAISERROR (Transact-SQL )
@@ERROR (Transact-SQL )
ERROR_PROCEDURE (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el nombre del procedimiento almacenado o del desencadenador en el que se produce un
error, si ese error ha causado la ejecución de un bloque CATCH de una construcción TRY…CATCH.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ERROR_PROCEDURE ( )

Tipos devueltos
nvarchar(128)

Valor devuelto
Cuando se llama en un bloque CATCH de procedimiento almacenado donde se produce un error,
ERROR_PROCEDURE devuelve el nombre de ese procedimiento almacenado.

ERROR_PROCEDURE devuelve NULL si el error no se produjo en un procedimiento almacenado o un


desencadenador.
ERROR_PROCEDURE devuelve NULL si se llama desde fuera del ámbito de un bloque CATCH.

Notas
ERROR_PROCEDURE admite llamadas en cualquier lugar del ámbito de un bloque CATCH.
ERROR_PROCEDURE devuelve el nombre del procedimiento almacenado o desencadenador en el que se produce un
error, con independencia de cuántas veces se ejecute o de dónde se ejecuta dentro del ámbito del bloque CATCH .
Esto contrasta con funciones como @@ERROR, que solo devuelve un número de error en la instrucción
inmediatamente posterior a la que produjo el error.
En un bloque CATCH anidado, ERROR_PROCEDURE devuelve el número de error específico del ámbito del bloque
CATCH al que hace referencia ese bloque CATCH . Por ejemplo, el bloque CATCH de una construcción
TRY...CATCH externa podría tener una construcción TRY...CATCH interna. Dentro de ese bloque interno CATCH ,
ERROR_PROCEDURE devuelve el número del error que invocó el bloque CATCH interno. Si ERROR_PROCEDURE se
ejecuta en el bloque CATCH externo, devuelve el número del error que invocó ese bloque CATCH externo.

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
A. Utilizar ERROR_PROCEDURE en un bloque CATCH
En este ejemplo se muestra un procedimiento almacenado que genera un error de división por cero.
ERROR_PROCEDURE devuelve el nombre del procedimiento almacenado en el que se produjo el error.
-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_ExampleProc', 'P' ) IS NOT NULL
DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that


-- generates a divide-by-zero error.
CREATE PROCEDURE usp_ExampleProc
AS
SELECT 1/0;
GO

BEGIN TRY
-- Execute the stored procedure inside the TRY block.
EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
SELECT ERROR_PROCEDURE() AS ErrorProcedure;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorProcedure
--------------------
usp_ExampleProc

(1 row(s) affected)

B. Utilizar ERROR_PROCEDURE en un bloque CATCH con otras herramientas de control de errores


En este ejemplo se muestra un procedimiento almacenado que genera un error de división por cero. Junto con el
nombre del procedimiento almacenado en el que se produjo el error, el procedimiento almacenado devuelve
información sobre el error.
-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_ExampleProc', 'P' ) IS NOT NULL
DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that


-- generates a divide-by-zero error.
CREATE PROCEDURE usp_ExampleProc
AS
SELECT 1/0;
GO

BEGIN TRY
-- Execute the stored procedure inside the TRY block.
EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_MESSAGE() AS ErrorMessage,
ERROR_LINE() AS ErrorLine;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorMessage ErrorLine


----------- ------------- ----------- ---------------- ---------------------------------- -----------
8134 16 1 usp_ExampleProc Divide by zero error encountered. 6

(1 row(s) affected)

Ver también
sys.messages (Transact-SQL )
TRY...CATCH (Transact-SQL )
ERROR_LINE (Transact-SQL )
ERROR_MESSAGE (Transact-SQL )
ERROR_NUMBER (Transact-SQL )
ERROR_SEVERITY (Transact-SQL )
ERROR_STATE (Transact-SQL )
RAISERROR (Transact-SQL )
@@ERROR (Transact-SQL )
ERROR_SEVERITY (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el valor de gravedad del error cuando se produce un error, si provoca la ejecución del
bloque CATCH de una construcción TRY…CATCH.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ERROR_SEVERITY ( )

Tipos devueltos
int

Valor devuelto
Cuando se llama en un bloque CATCH donde se produce un error, ERROR_SEVERITY devuelve la gravedad del
error que provocó la ejecución del bloque CATCH .
ERROR_SEVERITY NULL si se llamó desde fuera del ámbito de un bloque CATCH.

Notas
ERROR_SEVERITY admite llamadas en cualquier lugar del ámbito de un bloque CATCH.
ERROR_SEVERITY devuelve el valor de gravedad de un error, con independencia de cuántas veces se ejecute o de
dónde se ejecute dentro del ámbito del bloque CATCH . Esto contrasta con funciones como @@ERROR, que solo
devuelve un número de error en la instrucción inmediatamente posterior a la que produjo el error.
ERROR_SEVERITY normalmente funciona en un bloque CATCH anidado. ERROR_SEVERITY devuelve el valor de
gravedad del error específico del ámbito del bloque CATCH al que hace referencia ese bloque CATCH . Por
ejemplo, el bloque CATCH de una construcción TRY...CATCH externa podría tener una construcción TRY...CATCH
interna. Dentro de ese bloque interno CATCH , ERROR_SEVERITY devuelve el valor de gravedad del error que
invocó el bloque CATCH interno. Si ERROR_SEVERITY se ejecuta en el bloque CATCH externo, devuelve el valor de
gravedad del error que invocó ese bloque CATCH externo.

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
A. Utilizar ERROR_SEVERITY en un bloque CATCH
En este ejemplo se muestra un procedimiento almacenado que genera un error de división por cero.
ERROR_SEVERITY devuelve el valor de gravedad de ese error.
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_SEVERITY() AS ErrorSeverity;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorSeverity
-------------
16

(1 row(s) affected)

B. Utilizar ERROR_SEVERITY en un bloque CATCH con otras herramientas de control de errores


En este ejemplo se muestra una instrucción SELECT que genera un error de división por cero. El procedimiento
almacenado devuelve información sobre el error.

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

-----------

(0 row(s) affected)

ErrorNumber ErrorSeverity ErrorState ErrorProcedure ErrorLine ErrorMessage


----------- ------------- ----------- --------------- ----------- ----------------------------------
8134 16 1 NULL 4 Divide by zero error encountered.

(1 row(s) affected)

Ver también
sys.messages (Transact-SQL )
TRY...CATCH (Transact-SQL )
ERROR_LINE (Transact-SQL )
ERROR_MESSAGE (Transact-SQL )
ERROR_NUMBER (Transact-SQL )
ERROR_PROCEDURE (Transact-SQL )
ERROR_STATE (Transact-SQL )
RAISERROR (Transact-SQL )
@@ERROR (Transact-SQL )
ERROR_STATE (Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de estado del error que provocó que se ejecutara el bloque CATCH de una construcción
TRY…CATCH.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ERROR_STATE ( )

Tipos devueltos
int

Valor devuelto
Cuando se llama en un bloque CATCH, devuelve el número de estado del mensaje de error que provocó que el
bloque CATCH se ejecutara.
Devuelve NULL si se le llama desde fuera del ámbito del bloque CATCH.

Notas
Algunos mensajes de error se pueden generar en varios puntos del código de Microsoft SQL Server Motor de
base de datos. Por ejemplo, el error "1105" se puede generar bajo diferentes condiciones. Cada condición
específica que genera el error asigna un código de estado único.
Cuando se ven las bases de datos de problemas conocidos, como Microsoft Knowledge Base, puede utilizar el
número de estado para determinar si el problema registrado puede ser el mismo que el error que ha
encontrado. Por ejemplo, si un artículo de Knowledge Base trata un mensaje de error 1105 con un estado de 2 y
el mensaje de error 1105 que recibió tiene un estado de 3, probablemente su error tiene un origen distinto del
registrado en el artículo.
Un ingeniero de soporte técnico de SQL Server también puede utilizar el código de estado de un error para
encontrar la ubicación en el código de origen donde se ha producido ese error, que puede proporcionar ideas
adicionales sobre cómo diagnosticar el problema.
ERROR_STATE puede llamarse en cualquier lugar del ámbito de un bloque CATCH.
ERROR_STATE devuelve el estado de error independientemente de las veces que se ejecute o de dónde se
ejecute en el ámbito del bloque CATCH. Esto contrasta con funciones como @@ERROR, que solo devuelve el
número de error en la instrucción inmediatamente posterior a la que causa un error, o en la primera instrucción
de un bloque CATCH.
En los bloques CATCH anidados, ERROR_STATE devuelve el estado de error específico del ámbito del bloque
CATCH en el que se hace referencia al mismo. Por ejemplo, el bloque CATCH de una construcción TRY...CATCH
externa podría tener una construcción TRY...CATCH anidada. En el bloque CATCH anidado, ERROR_STATE
devuelve el estado del error que invocó el bloque CATCH anidado. Si ERROR_STATE se ejecuta en el bloque
CATCH externo, devuelve el estado del error que invocó ese bloque CATCH.

Ejemplos
A. Utilizar ERROR_STATE en un bloque CATCH
En este ejemplo de código se muestra una instrucción SELECT que genera un error de división por cero. Se
devuelve el estado del error.

BEGIN TRY
-- Generate a divide by zero error
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT ERROR_STATE() AS ErrorState;
END CATCH;
GO

B. Utilizar ERROR_STATE en un bloque CATCH con otras herramientas de control de errores


En este ejemplo de código se muestra una instrucción SELECT que genera un error de división por cero.
Además del estado de error, se devuelve otra información relacionada con el error.

BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y


Almacenamiento de datos paralelos
C. Utilizar ERROR_STATE en un bloque CATCH con otras herramientas de control de errores
En este ejemplo de código se muestra una instrucción SELECT que genera un error de división por cero.
Además del estado de error, se devuelve otra información relacionada con el error.
BEGIN TRY
-- Generate a divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

Ver también
sys.messages (Transact-SQL )
TRY...CATCH (Transact-SQL )
ERROR_LINE (Transact-SQL )
ERROR_MESSAGE (Transact-SQL )
ERROR_NUMBER (Transact-SQL )
ERROR_PROCEDURE (Transact-SQL )
ERROR_SEVERITY (Transact-SQL )
RAISERROR (Transact-SQL )
@@ERROR (Transact-SQL )
FORMATMESSAGE (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Genera un mensaje a partir de un mensaje existente en sys.messages o de una cadena proporcionada. La
funcionalidad de FORMATMESSAGE es similar a la de la instrucción RAISERROR. Sin embargo, RAISERROR
imprime el mensaje inmediatamente, mientras que FORMATMESSAGE devuelve el mensaje formateado para
que se pueda seguir procesando.
Convenciones de sintaxis de Transact-SQL

Sintaxis
FORMATMESSAGE ( { msg_number | ' msg_string ' } , [ param_value [ ,...n ] ] )

Argumentos
msg_number
Es el identificador del mensaje almacenado en sys.messages. Si msg_number es <= 13000 o si el mensaje no
existe en sys.messages, se devuelve NULL.
msg_string
Se aplica a: SQL Server (desde SQL Server 2016 (13.x) hasta la versión actual).
Es una cadena entre comillas simples que contiene marcadores de posición de valor de parámetro. El mensaje
de error puede tener 2.047 caracteres como máximo. Si el mensaje contiene más de 2.048 caracteres, solamente
aparecerán los 2.044 primeros y se agregarán puntos suspensivos para indicar que el mensaje se ha truncado.
Tenga en cuenta que los parámetros de sustitución utilizan más caracteres de lo que muestra la salida debido al
comportamiento del almacenamiento interno. Para más información sobre la estructura de una cadena de
mensaje y el uso de parámetros en la cadena, vea la descripción del argumento msg_str en RAISERROR
(Transact-SQL ).
param_value
Valor de parámetro que se utiliza en el mensaje. Puede ser más de un valor. Los valores se deben especificar en
el orden en el que las variables de marcador de posición aparezcan en el mensaje. El número máximo de valores
es 20.

Tipos devueltos
nvarchar

Notas
Al igual que la instrucción RAISERROR, FORMATMESSAGE modifica el mensaje sustituyendo los valores de
los parámetros suministrados por variables de marcador de posición del mensaje. Para más información sobre
los marcadores de posición permitidos en los mensajes de error y el proceso de edición, vea RAISERROR
(Transact-SQL ).
FORMATMESSAGE busca el mensaje en el idioma actual del usuario. Si no hay una versión del mensaje en otro
idioma, se utiliza la versión en inglés (EE.UU.).
En los mensajes en otros idiomas, los valores de los parámetros suministrados deben corresponder a los
marcadores de posición de los parámetros de la versión en inglés (EE.UU.). Es decir, el parámetro 1 de la versión
en otros idiomas debe corresponder al parámetro 1 de la versión en inglés (EE.UU.), el parámetro 2 debe
corresponder al parámetro 2, etc.

Ejemplos
A. Ejemplo con un número de mensaje
En el siguiente ejemplo se usa un mensaje de replicación 20009 almacenado en sys.messages como "No se
pudo agregar el artículo '%s' a la publicación '%s'". FORMATMESSAGE sustituye los valores First Variable y
Second Variable por los marcadores de posición de los parámetros. La cadena resultante, "No se pudo agregar
el artículo 'First Variable' a la publicación 'Second Variable'", se almacena en la variable local @var1 .

SELECT text FROM sys.messages WHERE message_id = 20009 AND language_id = 1033;
DECLARE @var1 VARCHAR(200);
SELECT @var1 = FORMATMESSAGE(20009, 'First Variable', 'Second Variable');
SELECT @var1;

B. Ejemplo con una cadena de mensaje


Se aplica a: SQL Server (desde SQL Server 2016 (13.x) hasta la versión actual).
En el siguiente ejemplo se toma una cadena como entrada.

SELECT FORMATMESSAGE('This is the %s and this is the %s.', 'first variable', 'second variable') AS Result;

Devuelve: This is the first variable and this is the second variable.

C. Más ejemplos de formato de cadena de mensaje


En los siguientes ejemplos se muestran distintas opciones de formato.

SELECT FORMATMESSAGE('Signed int %i, %d %i, %d, %+i, %+d, %+i, %+d', 5, -5, 50, -50, -11, -11, 11, 11);
SELECT FORMATMESSAGE('Signed int with leading zero %020i', 5);
SELECT FORMATMESSAGE('Signed int with leading zero 0 %020i', -55);
SELECT FORMATMESSAGE('Unsigned int %u, %u', 50, -50);
SELECT FORMATMESSAGE('Unsigned octal %o, %o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal %x, %X, %X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Unsigned octal with prefix: %#o, %#o', 50, -50);
SELECT FORMATMESSAGE('Unsigned hexadecimal with prefix: %#x, %#X, %#X, %X, %x', 11, 11, -11, 50, -50);
SELECT FORMATMESSAGE('Hello %s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %-20s!', 'TEST');
SELECT FORMATMESSAGE('Hello %20s!', 'TEST');

Ver también
RAISERROR (Transact-SQL )
THROW (Transact-SQL )
sp_addmessage (Transact-SQL )
sys.messages (Transact-SQL )
CONCAT (Transact-SQL )
CONCAT_WS (Transact-SQL )
QUOTENAME (Transact-SQL )
REPL ACE (Transact-SQL )
REVERSE (Transact-SQL )
STRING_AGG (Transact-SQL )
STRING_ESCAPE (Transact-SQL )
STUFF (Transact-SQL )
TRANSL ATE (Transact-SQL )
Funciones del sistema (Transact-SQL )
GET_FILESTREAM_TRANSACTION_CONTEXT
(Transact-SQL)
17/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un token que representa el contexto de transacción actual de una sesión. Las aplicaciones usan este
token para enlazar las operaciones de transmisión por secuencias del sistema de archivos FILESTREAM a la
transacción. Para obtener una lista de temas sobre FILESTREAM, vea Datos de objeto binario grande (Blob) (SQL
Server).
Convenciones de sintaxis de Transact-SQL

Sintaxis
GET_FILESTREAM_TRANSACTION_CONTEXT ()

Tipo devuelto
varbinary(max)

Valor devuelto
Se devuelve NULL si no se ha iniciado la transacción o si se ha cancelado o confirmado.

Notas
La transacción debe ser explícita. Use BEGIN TRANSACTION seguido de COMMIT TRANSACTION o
ROLLBACK TRANSACTION.
Cuando se llama a GET_FILESTREAM_TRANSACTION_CONTEXT, el autor de la llamada obtiene acceso a la
transacción a través del sistema de archivos mientras dure la transacción. Para que otro usuario pueda tener
acceso a la transacción a través del sistema de archivos, use EXECUTE AS para ejecutar
GET_FILESTREAM_TRANSACTION_CONTEXT como el otro usuario.

Ejemplos
En el ejemplo siguiente se usa GET_FILESTREAM_TRANSACTION_CONTEXT en una transacción Transact-SQL para obtener
el contexto de transacción.

using System;
using System.Data.SqlClient;
using System.Data;

namespace ConsoleApplication
{
/// <summary>
/// This class is a wrapper that contains methods for:
///
/// GetTransactionContect() - Returns the current transaction context.
/// BeginTransaction() - Begins a transaction.
/// CommmitTransaction() - Commits the current transaction.
///
/// </summary>

class SqlAccessWrapper
{
/// <summary>
/// Returns a byte array that contains the current transaction
/// context.
/// </summary>
/// <param name="sqlConnection">
/// SqlConnection object that represents the instance of SQL Server
/// from which to obtain the transaction context.
/// </param>
/// <returns>
/// If there is a current transaction context, the return
/// value is an Object that represents the context.
/// If there is not a current transaction context, the
/// value returned is DBNull.Value.
/// </returns>

public Object GetTransactionContext(SqlConnection sqlConnection)


{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";
cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection;

return cmd.ExecuteScalar();

/// <summary>
/// Begins the transaction.
/// </summary>
/// <param name="sqlConnection">
/// SqlConnection object that represents the server
/// on which to run the BEGIN TRANSACTION statement.
/// </param>

public void BeginTransaction(SqlConnection sqlConnection)


{
SqlCommand cmd = new SqlCommand();

cmd.CommandText = "BEGIN TRANSACTION";


cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection;

cmd.ExecuteNonQuery();
}

/// <summary>
/// Commits the transaction.
/// </summary>
/// <param name="sqlConnection">
/// SqlConnection object that represents the instance of SQL Server
/// on which to run the COMMIT statement.
/// </param>

public void CommitTransaction(SqlConnection sqlConnection)


{
SqlCommand cmd = new SqlCommand();

cmd.CommandText = "COMMIT TRANSACTION";


cmd.CommandType = CommandType.Text;
cmd.Connection = sqlConnection;
cmd.ExecuteNonQuery();
}
}

class Program
{
static void Main(string[] args)
{
//Open a connection to the local instance of SQL Server.

SqlConnection sqlConnection = new SqlConnection("Integrated Security=true;server=(local)");


sqlConnection.Open();

SqlAccessWrapper sql = new SqlAccessWrapper();

//Create a transaction so that sql.GetTransactionContext() will succeed.


sql.BeginTransaction(sqlConnection);

//The transaction context will be stored in this array.


Byte[] transactionToken;

Object txObj = sql.GetTransactionContext(sqlConnection);


if (DBNull.Value != txObj)
{
transactionToken = (byte[])txObj;
Console.WriteLine("Transaction context obtained.\n");
}

sql.CommitTransaction(sqlConnection);
}
}
}

Imports System
Imports System.Data.SqlClient
Imports System.Data

Namespace ConsoleApplication
''' <summary>
''' This class is a wrapper that contains methods for:
'''
''' GetTransactionContect() - Returns the current transaction context.
''' BeginTransaction() - Begins a transaction.
''' CommmitTransaction() - Commits the current transaction.
'''
''' </summary>

Class SqlAccessWrapper
''' <summary>
''' Returns a byte array that contains the current transaction
''' context.
''' </summary>
''' <param name="sqlConnection">
''' SqlConnection object that represents the instance of SQL Server
''' from which to obtain the transaction context.
''' </param>
''' <returns>
''' If there is a current transaction context, the return
''' value is an Object that represents the context.
''' If there is not a current transaction context, the
''' value returned is DBNull.Value.
''' </returns>

Public Function GetTransactionContext(ByVal sqlConnection As SqlConnection) As Object


Dim cmd As New SqlCommand()
cmd.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()"
cmd.CommandType = CommandType.Text
cmd.Connection = sqlConnection

Return cmd.ExecuteScalar()

End Function

''' <summary>
''' Begins the transaction.
''' </summary>
''' <param name="sqlConnection">
''' SqlConnection object that represents the server
''' on which to run the BEGIN TRANSACTION statement.
''' </param>

Public Sub BeginTransaction(ByVal sqlConnection As SqlConnection)


Dim cmd As New SqlCommand()

cmd.CommandText = "BEGIN TRANSACTION"


cmd.CommandType = CommandType.Text
cmd.Connection = sqlConnection

cmd.ExecuteNonQuery()
End Sub

''' <summary>
''' Commits the transaction.
''' </summary>
''' <param name="sqlConnection">
''' SqlConnection object that represents the instance of SQL Server
''' on which to run the COMMIT statement.
''' </param>

Public Sub CommitTransaction(ByVal sqlConnection As SqlConnection)


Dim cmd As New SqlCommand()

cmd.CommandText = "COMMIT TRANSACTION"


cmd.CommandType = CommandType.Text
cmd.Connection = sqlConnection

cmd.ExecuteNonQuery()
End Sub
End Class

Class Program
Shared Sub Main()
'''Open a connection to the local instance of SQL Server.

Dim sqlConnection As New SqlConnection("Integrated Security=true;server=(local)")


sqlConnection.Open()

Dim sql As New SqlAccessWrapper()

'''Create a transaction so that sql.GetTransactionContext() will succeed.


sql.BeginTransaction(sqlConnection)

'''The transaction context will be stored in this array.


Dim transactionToken As Byte()

Dim txObj As Object = sql.GetTransactionContext(sqlConnection)

'''If the returned object is not NULL, there is a valid transaction


'''token, and it must be converted into a format that is usable within
'''the application.

If Not txObj.Equals(DBNull.Value) Then


transactionToken = DirectCast(txObj, Byte())
Console.WriteLine("Transaction context obtained." & Chr(10) & "")
End If
sql.CommitTransaction(sqlConnection)
End Sub
End Class
End Namespace

Ver también
PathName (Transact-SQL )
Datos de objeto binario grande (Blob) (SQL Server)
GETANSINULL (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve la nulabilidad predeterminada para la base de datos para esta sesión.
Convenciones de sintaxis de Transact-SQL

Sintaxis
GETANSINULL ( [ 'database' ] )

Argumentos
"database"
Es el nombre de la base de datos para la que se devuelve información sobre nulabilidad. database es o char o
nchar. Si char, database se convierte implícitamente en nchar.

Tipos devueltos
int

Notas
Cuando la nulabilidad de la base de datos especificada permite valores NULL y la nulabilidad de la columna o del
tipo de datos no está definida explícitamente, GETANSINULL devuelve 1. Este valor es el predeterminado para
ANSI NULL.
Para habilitar el comportamiento predeterminado de ANSI NULL, se debe establecer una de las siguientes
condiciones:
ALTER DATABASE database_name SET ANSI_NULL_DEFAULT ON
SET ANSI_NULL_DFLT_ON ON
SET ANSI_NULL_DFLT_OFF OFF

Ejemplos
En el siguiente ejemplo se devuelve la nulabilidad predeterminada para la base de datos AdventureWorks2012 .

USE AdventureWorks2012;
GO
SELECT GETANSINULL('AdventureWorks2012')
GO

El conjunto de resultados es el siguiente.


------
1

(1 row(s) affected)

Ver también
Funciones del sistema (Transact-SQL )
HOST_ID (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de identificación de la estación de trabajo. El número de identificación de la estación de
trabajo es el identificador de proceso (PID ) de la aplicación en el equipo cliente que se está conectando a SQL
Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
HOST_ID ()

Tipos devueltos
char(10)

Notas
Cuando el parámetro de una función del sistema es opcional, se asumen la base de datos, el equipo host, el usuario
del servidor o el usuario de la base de datos actuales. Las funciones integradas siempre deben ir seguidas de
paréntesis.
Las funciones del sistema se pueden usar en la lista de selección, en la cláusula WHERE y en cualquier lugar donde
se permita una expresión.

Ejemplos
En el siguiente ejemplo se crea una tabla que utiliza HOST_ID() en una definición de DEFAULT para registrar el
identificador de terminal de los equipos que insertan filas en una tabla que registra pedidos.

CREATE TABLE Orders


(OrderID int PRIMARY KEY,
CustomerID nchar(5) REFERENCES Customers(CustomerID),
TerminalID char(8) NOT NULL DEFAULT HOST_ID(),
OrderDate datetime NOT NULL,
ShipDate datetime NULL,
ShipperID int NULL REFERENCES Shippers(ShipperID));
GO

Ver también
Expresiones (Transact-SQL )
Funciones del sistema (Transact-SQL )
HOST_NAME (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el nombre de la estación de trabajo.
Convenciones de sintaxis de Transact-SQL

Sintaxis
HOST_NAME ()

Tipos devueltos
nvarchar(128)

Notas
Cuando el parámetro de una función del sistema es opcional, se asumen la base de datos, el equipo host, el usuario
del servidor o el usuario de la base de datos actuales. Las funciones integradas siempre deben ir seguidas de
paréntesis.
Las funciones del sistema se pueden usar en la lista de selección, en la cláusula WHERE y en cualquier lugar donde
se permita una expresión.

IMPORTANT
La aplicación cliente proporciona el nombre de la estación de trabajo y puede proporcionar datos inexactos. No confíe en
HOST_NAME como característica de seguridad.

Ejemplos
En el ejemplo siguiente se crea una tabla que utiliza HOST_NAME() en una definición DEFAULT para registrar el
nombre de estación de trabajo de los equipos que insertan filas en una tabla que registra pedidos.

CREATE TABLE Orders


(OrderID int PRIMARY KEY,
CustomerID nchar(5) REFERENCES Customers(CustomerID),
Workstation nchar(30) NOT NULL DEFAULT HOST_NAME(),
OrderDate datetime NOT NULL,
ShipDate datetime NULL,
ShipperID int NULL REFERENCES Shippers(ShipperID));
GO

Ver también
Expresiones (Transact-SQL )
Funciones del sistema (Transact-SQL )
ISNULL (Transact-SQL)
17/07/2018 • 6 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Sustituye el valor NULL por el valor especificado.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ISNULL ( check_expression , replacement_value )

Argumentos
check_expression
Es la expresión que se va a comprobar si es NULL. check_expression puede ser de cualquier tipo.
replacement_value
Es la expresión que se devuelve si check_expression es NULL. replacement_value debe ser de un tipo que se puede
convertir implícitamente en el tipo de check_expression.

Tipos devueltos
Devuelve el mismo tipo que check_expression. Si se proporciona un literal NULL como check_expression, devuelve
el tipo de datos de replacement_value. Si se proporciona un literal NULL como check_expression y no se
proporciona replacement_value, se devuelve un int.

Notas
El valor de check_expression se devuelve si no es NULL; de lo contrario, se devuelve replacement_value después
de convertirse de forma implícita al tipo de check_expression, si los tipos son diferentes. replacement_value se
puede truncar si replacement_value es mayor que check_expression.

NOTE
Use COALESCE (Transact-SQL) para devolver el primer valor distinto de NULL.

Ejemplos
A. Usar ISNULL con AVG
En el ejemplo siguiente se busca el promedio del peso de todos los productos. Sustituye el valor 50 para todas las
entradas NULL en la columna Weight de la tabla Product .
USE AdventureWorks2012;
GO
SELECT AVG(ISNULL(Weight, 50))
FROM Production.Product;
GO

El conjunto de resultados es el siguiente.

--------------------------
59.79

(1 row(s) affected)

B. Usar ISNULL
En el siguiente ejemplo se selecciona la descripción, el porcentaje de descuento, la cantidad mínima y la cantidad
máxima de todas las ofertas especiales de AdventureWorks2012 . Si la cantidad máxima de una oferta especial
determinada es NULL, el valor de MaxQty mostrado en el conjunto de resultados es 0.00 .

USE AdventureWorks2012;
GO
SELECT Description, DiscountPct, MinQty, ISNULL(MaxQty, 0.00) AS 'Max Quantity'
FROM Sales.SpecialOffer;
GO

El conjunto de resultados es el siguiente.

DESCRIPCIÓN DISCOUNTPCT MINQTY CANTIDAD MÁXIMA

No Discount 0.00 0 0

Volume Discount 0.02 11 14

Volume Discount 0.05 15 4

Volume Discount 0.10 25 0

Volume Discount 0.15 41 0

Volume Discount 0.20 61 0

Mountain-100 Cl 0.35 0 0

Sport Helmet Di 0.10 0 0

Road-650 Overst 0.30 0 0

Mountain Tire S 0.50 0 0

Sport Helmet Di 0.15 0 0

LL Road Frame S 0.35 0 0

Touring-3000 Pr 0.15 0 0
DESCRIPCIÓN DISCOUNTPCT MINQTY CANTIDAD MÁXIMA

Touring-1000 Pr 0.20 0 0

Half-Price Peda 0.50 0 0

Mountain-500 Si 0.40 0 0

(16 row(s) affected)

C. Comprobar si hay valores NULL en una cláusula WHERE


No utilice ISNULL para buscar los valores NULL. Use IS NULL en su lugar. En el ejemplo siguiente se buscan
todos los productos que tienen NULL en la columna de peso. Tenga en cuenta el espacio entre IS y NULL .

USE AdventureWorks2012;
GO
SELECT Name, Weight
FROM Production.Product
WHERE Weight IS NULL;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
D. Usar ISNULL con AVG
En el ejemplo siguiente se busca el promedio del peso de todos los productos en una tabla de ejemplo. Sustituye el
valor 50 para todas las entradas NULL en la columna Weight de la tabla Product .

-- Uses AdventureWorks

SELECT AVG(ISNULL(Weight, 50))


FROM dbo.DimProduct;

El conjunto de resultados es el siguiente.

--------------------------
52.88

E. Usar ISNULL
En el ejemplo siguiente se usa ISNULL para comprobar los valores NULL en la columna MinPaymentAmount y
mostrar el valor 0.00 para esas filas.

-- Uses AdventureWorks

SELECT ResellerName,
ISNULL(MinPaymentAmount,0) AS MinimumPayment
FROM dbo.DimReseller
ORDER BY ResellerName;

A continuación se muestra un conjunto parcial de resultados.


RESELLERNAME MINIMUMPAYMENT

Una asociación de bicicleta 0.0000

Una tienda de bicicletas 0.0000

Una tienda de bicis 0.0000

Una gran empresa de bicicletas 0.0000

La típica tienda de bicicletas 200.0000

Servicio y ventas aceptables 0.0000

F. Usar IS NULL para probar NULL en una cláusula WHERE


En el ejemplo siguiente se buscan todos los productos que tienen NULL en la columna Weight . Tenga en cuenta el
espacio entre IS y NULL .

-- Uses AdventureWorks

SELECT EnglishProductName, Weight


FROM dbo.DimProduct
WHERE Weight IS NULL;

Ver también
Expresiones (Transact-SQL )
IS NULL (Transact-SQL )
Funciones del sistema (Transact-SQL )
WHERE (Transact-SQL )
COALESCE (Transact-SQL )
ISNUMERIC (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Determina si una expresión es un tipo numérico válido.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ISNUMERIC ( expression )

Argumentos
expression
Es la expresión que se va a evaluar.

Tipos devueltos
int

Notas
ISNUMERIC devuelve 1 cuando la expresión de entrada se evalúa para un tipo de datos numérico válido; de lo
contrario, devuelve 0. Entre los tipos de datos numéricos válidos se encuentran los siguientes:

Valores numéricos exactos bigint, int, smallint, tinyint, bit

Precisión fija decimal, numeric

Aproximado float, real

Valores monetarios money, smallmoney

NOTE
ISNUMERIC devuelve 1 para algunos caracteres que no son números, como el signo más (+), menos (-) y símbolos de
moneda válidos, como el signo de dólar ($). Para obtener una lista completa de los símbolos de moneda, vea money y
smallmoney (Transact-SQL).

Ejemplos
El siguiente ejemplo utiliza ISNUMERIC para devolver todos los códigos postales que no son valores numéricos.
USE AdventureWorks2012;
GO
SELECT City, PostalCode
FROM Person.Address
WHERE ISNUMERIC(PostalCode)<> 1;
GO

Ejemplos: Almacenamiento de datos SQL de Azure y Almacenamiento


de datos paralelos
El siguiente ejemplo utiliza ISNUMERIC para devolver todos los códigos postales que no son valores numéricos.

USE master;
GO
SELECT name, isnumeric(name) AS IsNameANumber, database_id, isnumeric(database_id) AS IsIdANumber
FROM sys.databases;
GO

Ver también
Expresiones (Transact-SQL )
Funciones del sistema (Transact-SQL )
Tipos de datos (Transact-SQL )
MIN_ACTIVE_ROWVERSION (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor rowversion activo más bajo de la base de datos actual. Un valor rowversion está activo si se
utiliza en una transacción que no se ha confirmado todavía. Para más información, vea rowversion (Transact-SQL ).

NOTE
El tipo de datos rowversion también se conoce como timestamp.

Convenciones de sintaxis de Transact-SQL

Sintaxis
MIN_ACTIVE_ROWVERSION

Tipos devueltos
Devuelve un valor binary(8).

Notas
MIN_ACTIVE_ROWVERSION es una función no determinista que devuelve el valor rowversion activo más bajo
de la base de datos actual. Normalmente, se genera un nuevo valor rowversion cuando se realiza una inserción o
una actualización en una tabla que contiene una columna de tipo rowversion. Si no hay ningún valor activo en la
base de datos, MIN_ACTIVE_ROWVERSION devuelve el mismo valor que @@DBTS + 1.
MIN_ACTIVE_ROWVERSION es útil en escenarios como la sincronización de datos que usa valores rowversion
para agrupar conjuntos de cambios. Si una aplicación usa @@DBTS en lugar de MIN_ACTIVE_ROWVERSION,
es posible que se pierdan los cambios que están activos cuando se produce la sincronización.
La función MIN_ACTIVE_ROWVERSION no se ve afectada por los cambios en los niveles de aislamiento de
transacciones.

Ejemplos
En el ejemplo siguiente se devuelven valores rowversion al usar MIN_ACTIVE_ROWVERSION y @@DBTS . Observe que
los valores difieren cuando no hay ninguna transacción activa en la base de datos.

-- Create a table that has a ROWVERSION column in it.


CREATE TABLE RowVersionTestTable (rv ROWVERSION)
GO

-- Print the current values for the database.


PRINT ''
PRINT 'DBTS'
PRINT @@DBTS
PRINT 'MIN_ACTIVE_ROWVERSION'
PRINT 'MIN_ACTIVE_ROWVERSION'
PRINT MIN_ACTIVE_ROWVERSION()
GO
---------------- Results ----------------
--DBTS
--0x00000000000007E2
--MIN_ACTIVE_ROWVERSION
--0x00000000000007E3

-- Insert a row.
INSERT INTO RowVersionTestTable VALUES (DEFAULT)
SELECT * FROM RowVersionTestTable
GO
---------------- Results ----------------
--rv
--0x00000000000007E3

-- Print the current values for the database.


PRINT ''
PRINT 'DBTS'
PRINT @@DBTS
PRINT 'MIN_ACTIVE_ROWVERSION'
PRINT MIN_ACTIVE_ROWVERSION()
GO
---------------- Results ----------------
--DBTS
--0x00000000000007E3
--MIN_ACTIVE_ROWVERSION
--0x00000000000007E4

-- Insert a new row inside a transaction but do not commit.


BEGIN TRAN
INSERT INTO RowVersionTestTable VALUES (DEFAULT)
SELECT * FROM RowVersionTestTable
GO
---------------- Results ----------------
--rv
--0x00000000000007E3
--0x00000000000007E4

-- Print the current values for the database.


PRINT ''
PRINT 'DBTS'
PRINT @@DBTS
PRINT 'MIN_ACTIVE_ROWVERSION'
PRINT MIN_ACTIVE_ROWVERSION()
GO
---------------- Results ----------------
--DBTS
--0x00000000000007E4
--MIN_ACTIVE_ROWVERSION
--0x00000000000007E4

-- Commit the transaction.


COMMIT
GO

-- Print the current values for the database.


PRINT ''
PRINT 'DBTS'
PRINT @@DBTS
PRINT 'MIN_ACTIVE_ROWVERSION'
PRINT MIN_ACTIVE_ROWVERSION()
GO
---------------- Results ----------------
--DBTS
--0x00000000000007E4
--MIN_ACTIVE_ROWVERSION
--0x00000000000007E5
Ver también
@@DBTS (Transact-SQL )
rowversion (Transact-SQL )
NEWID (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Crea un valor único del tipo uniqueidentifier.
Convenciones de sintaxis de Transact-SQL

Sintaxis
NEWID ( )

Tipos devueltos
uniqueidentifier

Notas
NEWID() es compatible con RFC4122.

Ejemplos
A. Utilizar la función NEWID con una variable
En el siguiente ejemplo se usa NEWID() para asignar un valor a una variable declarada con el tipo de datos
uniqueidentifier. El valor de la variable de tipo uniqueidentifier se imprime antes de ser comprobado.

-- Creating a local variable with DECLARE/SET syntax.


DECLARE @myid uniqueidentifier
SET @myid = NEWID()
PRINT 'Value of @myid is: '+ CONVERT(varchar(255), @myid)

El conjunto de resultados es el siguiente.

Value of @myid is: 6F9619FF-8B86-D011-B42D-00C04FC964FF

NOTE
El valor que devuelve NEWID es distinto en cada equipo. Este número solo se indica a título ilustrativo.

B. Utilizar NEWID en una instrucción CREATE TABLE


Se aplica a: SQL Server
En el siguiente ejemplo se crea una tabla cust con un tipo de datos uniqueidentifier y se usa NEWID para
llenarla con un valor predeterminado. Al asignar como valor predeterminado NEWID() , cada fila nueva y existente
tendrá un valor único en la columna CustomerID .
-- Creating a table using NEWID for uniqueidentifier data type.
CREATE TABLE cust
(
CustomerID uniqueidentifier NOT NULL
DEFAULT newid(),
Company varchar(30) NOT NULL,
ContactName varchar(60) NOT NULL,
Address varchar(30) NOT NULL,
City varchar(30) NOT NULL,
StateProvince varchar(10) NULL,
PostalCode varchar(10) NOT NULL,
CountryRegion varchar(20) NOT NULL,
Telephone varchar(15) NOT NULL,
Fax varchar(15) NULL
);
GO
-- Inserting 5 rows into cust table.
INSERT cust
(CustomerID, Company, ContactName, Address, City, StateProvince,
PostalCode, CountryRegion, Telephone, Fax)
VALUES
(NEWID(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL,
'90110', 'Finland', '981-443655', '981-443655')
,(NEWID(), 'Wellington Importadora', 'Paula Parente', 'Rua do Mercado, 12', 'Resende', 'SP',
'08737-363', 'Brasil', '(14) 555-8122', '')
,(NEWID(), 'Cactus Comidas para Ilevar', 'Patricio Simpson', 'Cerrito 333', 'Buenos Aires', NULL,
'1010', 'Argentina', '(1) 135-5555', '(1) 135-4892')
,(NEWID(), 'Ernst Handel', 'Roland Mendel', 'Kirchgasse 6', 'Graz', NULL,
'8010', 'Austria', '7675-3425', '7675-3426')
,(NEWID(), 'Maison Dewey', 'Catherine Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL,
'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68');
GO

C. Utilizar uniqueidentifier y la asignación de variable


En este ejemplo se declara una variable local denominada @myid como variable del tipo de datos
uniqueidentifier. A continuación, se asigna un valor a la variable con la instrucción SET .

DECLARE @myid uniqueidentifier ;


SET @myid = 'A972C577-DFB0-064E-1189-0154C99310DAAC12';
SELECT @myid;
GO

Ver también
NEWSEQUENTIALID (Transact-SQL )
ALTER TABLE (Transact-SQL )
CAST y CONVERT (Transact-SQL )
CREATE TABLE (Transact-SQL )
Tipos de datos (Transact-SQL )
Funciones del sistema (Transact-SQL )
uniqueidentifier (Transact-SQL )
Números de secuencia
NEWSEQUENTIALID (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Crea un identificador único global (GUID ) que es mayor que cualquier GUID generado previamente por esta
función en un equipo específico desde que se inició Windows. Después de reiniciar Windows, el GUID se puede
volver a iniciar desde un intervalo más bajo, pero sigue siendo globalmente único. Cuando una columna de GUID
se utiliza como identificador de fila, el uso de NEWSEQUENTIALID puede ser más rápido que el uso de la función
NEWID. La razón es que la función NEWID causa actividad aleatoria y utiliza menos páginas de datos en caché. El
uso de NEWSEQUENTIALID también ayuda a rellenar por completo las páginas de datos y de índices.

IMPORTANT
Si la protección de la privacidad es de particular importancia, no utilice esta función. Es posible estimar el valor del GUID
generado a continuación y, por tanto, obtener acceso a los datos asociados con dicho GUID.

NEWSEQUENTIALID es un contenedor de la función UuidCreateSequential de Windows que tiene aplicado algo


de orden de bytes aleatorio.

WARNING
La función UuidCreateSequential tiene dependencias de hardware. En SQL Server, se pueden general clústeres de valores
secuenciales cuando las bases de datos (por ejemplo, las bases de datos independientes) se mueven a otros equipos.
Cuando se usa Always On en SQL Database, se pueden generar clústeres de valores secuenciales si la base de datos
conmuta por error a otro equipo.

Convenciones de sintaxis de Transact-SQL

Sintaxis
NEWSEQUENTIALID ( )

Tipo devuelto
uniqueidentifier

Notas
NEWSEQUENTIALID () solo se puede usar con restricciones DEFAULT en columnas de tabla de tipo
uniqueidentifier. Por ejemplo:

CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID());

Cuando NEWSEQUENTIALID () se utiliza en expresiones DEFAULT, no se puede combinar con otros operadores
escalares. Por ejemplo, no se puede ejecutar lo siguiente:
CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT dbo.myfunction(NEWSEQUENTIALID()));

En el ejemplo anterior, myfunction() es una función escalar definida por el usuario que acepta y devuelve un valor
uniqueidentifier .

No se puede hacer referencia a NEWSEQUENTIALID en las consultas.


Puede usar NEWSEQUENTIALID para generar GUID a fin de reducir la contención de páginas y E/S aleatoria de
nivel hoja en los índices.
Cada GUID generado utilizando NEWSEQUENTIALID es único en ese equipo. Los GUID generados utilizando
NEWSEQUENTIALID solo son únicos en varios equipos si el equipo de origen tiene una tarjeta de red.

Ver también
NEWID (Transact-SQL )
Operadores de comparación (Transact-SQL )
ROWCOUNT_BIG (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de filas afectadas por la última instrucción ejecutada. Esta función actúa como
@@ROWCOUNT, salvo que el tipo de valor devuelto de ROWCOUNT_BIG es bigint.
Convenciones de sintaxis de Transact-SQL

Sintaxis
ROWCOUNT_BIG ( )

Tipos devueltos
bigint

Notas
A continuación de una instrucción SELECT, esta función devuelve el número de filas devueltas por la instrucción.
A continuación de las instrucciones INSERT, UPDATE o DELETE, esta función devuelve el número de filas
afectadas por la instrucción de modificación de datos.
A continuación de las instrucciones que no devuelven filas, como una instrucción IF, esta función devuelve 0.

Ver también
COUNT_BIG (Transact-SQL )
Tipos de datos (Transact-SQL )
SESSION_CONTEXT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2016) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de la clave especificada en el contexto de la sesión actual. El valor se establece con el
procedimiento sp_set_session_context (Transact-SQL ).
Convenciones de sintaxis de Transact-SQL

Sintaxis
SESSION_CONTEXT(N'key')

Argumentos
'key'
Clave (de tipo sysname) del valor que se va a recuperar.

Tipo devuelto
sql_variant

Valor devuelto
Valor asociado con la clave especificada en el contexto de la sesión, o NULL si no se ha establecido ningún valor
para esa clave.

Permisos
Cualquier usuario puede leer el contexto de la sesión.

Notas
El comportamiento de MARS en SESSION_CONTEXT es similar al de CONTEXT_INFO. Si un lote MARS
establece un par clave-valor, el nuevo valor no se devolverá en otros lotes MARS en la misma conexión, a menos
que dichos lotes se inicien después de que el lote que estableció el nuevo valor se haya completado. Si hay varios
lotes MARS activos en una conexión, los valores no se pueden establecer en "read_only". Esto evita que se
produzcan condiciones de carrera y no determinismo sobre qué valor "gana".

Ejemplos
En el siguiente ejemplo, el valor de contexto de la sesión de la clave user_id se establece en 4 y, después, se usa la
función SESSION_CONTEXT para recuperarlo.

EXEC sp_set_session_context 'user_id', 4;


SELECT SESSION_CONTEXT(N'user_id');
Ver también
sp_set_session_context (Transact-SQL )
CURRENT_TRANSACTION_ID (Transact-SQL )
Seguridad de nivel de fila
CONTEXT_INFO (Transact-SQL )
SET CONTEXT_INFO (Transact-SQL )
SESSION_ID (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server Azure SQL Database Azure SQL Data Warehouse
Almacenamiento de datos paralelos
Devuelve el identificador de la sesión de Almacenamiento de datos SQL o Almacenamiento de datos paralelos
actual.
Convenciones de sintaxis de Transact-SQL (Transact-SQL )

Sintaxis
-- Azure SQL Data Warehouse and Parallel Data Warehouse
SESSION_ID ( )

Valor devuelto
Devuelve un valor nvarchar(32).

Notas generales
El identificador de sesión se asigna a cada conexión de usuario en el momento de realizarla. Este identificador
persiste mientras dure la conexión. Cuando la conexión finalice, el identificador de sesión se libera.
Los identificadores de sesión comienzan por los caracteres alfabéticos "SID". Distinguen mayúsculas de
minúsculas y se deben escribir en mayúsculas cuando se usan en comandos SQL.
Puede consultar la vista sys.dm_pdw_exec_sessions para recuperar la misma información que esta función.

Ejemplos
En el siguiente ejemplo se devuelve el identificador de sesión actual.

SELECT SESSION_ID();

Ver también
DB_NAME (Transact-SQL )
VERSION (SQL Data Warehouse)
XACT_STATE (Transact-SQL)
17/07/2018 • 4 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Función escalar que notifica el estado de la transacción de usuario de una solicitud que se está ejecutando
actualmente. XACT_STATE indica si la solicitud tiene una transacción de usuario activa y si se puede confirmar la
transacción.
Convenciones de sintaxis de Transact-SQL

Sintaxis
XACT_STATE()

Tipo devuelto
smallint

Notas
XACT_STATE devuelve los siguientes valores.

VALOR DEVUELTO SIGNIFICADO

1 La solicitud actual tiene una transacción de usuario activa. La


solicitud puede realizar cualquier acción, incluida la escritura de
datos y la confirmación de la transacción.

0 No hay ninguna transacción de usuario activa para la solicitud


actual.

-1 La solicitud actual tiene una transacción de usuario activa,


pero se ha producido un error por el cual la transacción se
clasificó como no confirmable. La solicitud no puede confirmar
la transacción o revertirla a un punto de retorno; solo puede
solicitar que la transacción se revierta completamente.
Tampoco puede realizar operaciones de escritura hasta que se
revierta la transacción. Mientras tanto, solo puede realizar
operaciones de lectura. Una vez que la transacción se ha
revertido, la solicitud puede realizar operaciones de lectura y
escritura, y puede iniciar transacciones nuevas.

Cuando finalice la ejecución del lote más exterior, el Motor de


base de datos revertirá automáticamente todas las
transacciones no confirmables activas. Si no se envió ningún
mensaje de error cuando la transacción entró en un estado no
confirmable, cuando finalice la ejecución del lote se enviará un
mensaje de error a la aplicación cliente. Este mensaje indica
que se detectó y revirtió una transacción no confirmable.

Las funciones XACT_STATE y @@TRANCOUNT pueden usarse para detectar si la solicitud actual tiene o no una
transacción de usuario activa. No se puede usar @@TRANCOUNT para determinar si esa transacción se ha
clasificado como no confirmable. No se puede utilizar XACT_STATE para determinar si hay transacciones anidadas.

Ejemplos
En el ejemplo siguiente se utiliza XACT_STATE en el bloque CATCH de una construcción TRY…CATCH para determinar
si se debe confirmar o revertir una transacción. Como SET XACT_ABORT está en el estado ON , el error de infracción
de restricción hace que la transacción pase a un estado no confirmable.

USE AdventureWorks2012;
GO

-- SET XACT_ABORT ON will render the transaction uncommittable


-- when the constraint violation occurs.
SET XACT_ABORT ON;

BEGIN TRY
BEGIN TRANSACTION;
-- A FOREIGN KEY constraint exists on this table. This
-- statement will generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;

-- If the delete operation succeeds, commit the transaction. The CATCH


-- block will not execute.
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- Test XACT_STATE for 0, 1, or -1.
-- If 1, the transaction is committable.
-- If -1, the transaction is uncommittable and should
-- be rolled back.
-- XACT_STATE = 0 means there is no transaction and
-- a commit or rollback operation would generate an error.

-- Test whether the transaction is uncommittable.


IF (XACT_STATE()) = -1
BEGIN
PRINT 'The transaction is in an uncommittable state.' +
' Rolling back transaction.'
ROLLBACK TRANSACTION;
END;

-- Test whether the transaction is active and valid.


IF (XACT_STATE()) = 1
BEGIN
PRINT 'The transaction is committable.' +
' Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH;
GO

Ver también
@@TRANCOUNT (Transact-SQL )
BEGIN TRANSACTION (Transact-SQL )
COMMIT TRANSACTION (Transact-SQL )
ROLLBACK TRANSACTION (Transact-SQL )
SAVE TRANSACTION (Transact-SQL )
TRY...CATCH (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones escalares devuelven información estadística acerca del sistema:

@@CONNECTIONS @@PACK_RECEIVED

@@CPU_BUSY @@PACK_SENT

fn_virtualfilestats @@TIMETICKS

@@IDLE @@TOTAL_ERRORS

@@IO_BUSY @@TOTAL_READ

@@PACKET_ERRORS @@TOTAL_WRITE

Todas las funciones estadísticas del sistema son no deterministas, Por ello, estas funciones no siempre devuelven
el mismo resultado cada vez que se invocan, incluso con el mismo conjunto de valores de entrada. Para más
información sobre el determinismo de las funciones, vea Funciones deterministas y no deterministas.

Ver también
Funciones integradas (Transact-SQL )
@@CONNECTIONS (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el número de intentos de conexión, ya sean correctos o no, desde que SQL Server se inició
por última vez.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@CONNECTIONS

Tipos de valores devueltos


integer

Notas
Las conexiones son distintas de los usuarios. Las aplicaciones, por ejemplo, pueden abrir múltiples conexiones con
SQL Server sin que el usuario las vea.
Ejecute sp_monitor para ver un informe que contiene varias estadísticas de SQL Server, incluido un número de
intentos de conexión.
@@MAX_CONNECTIONS es el número máximo de conexiones simultáneas permitidas para el servidor.
@@CONNECTIONS se incrementa con cada intento de inicio de sesión; por tanto, @@CONNECTIONS puede
superar @@MAX_CONNECTIONS.

Ejemplos
Este ejemplo devuelve el número de intentos de inicio de sesión a partir de la fecha y hora actuales.

SELECT GETDATE() AS 'Today''s Date and Time',


@@CONNECTIONS AS 'Login Attempts';

El conjunto de resultados es el siguiente.

Today's Date and Time Login Attempts


---------------------- --------------
12/5/2006 10:32:45 AM 211023

Vea también
Funciones estadísticas del sistema (Transact-SQL )
sp_monitor (Transact-SQL )
@@CPU_BUSY (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve el tiempo que SQL Server ha pasado en funcionamiento activo desde su último inicio.
@@CPU_BUSY devuelve un resultado medido en incrementos de tiempo de CPU, o "tics". Este valor es acumulativo
para todas las CPU, de modo que puede superar el tiempo transcurrido real. Para convertir a microsegundos,
multiplique por @@TIMETICKS.

NOTE
Si el tiempo devuelto en @@CPU_BUSY o @@IO_BUSY supera 49 días (aproximadamente) de tiempo de CPU acumulado,
puede recibir una advertencia de desbordamiento aritmético. En este caso, el valor de las variables @@CPU_BUSY ,
@@IO_BUSY y @@IDLE no es exacto.

Convenciones de sintaxis de Transact-SQL

Sintaxis
@@CPU_BUSY

Tipos de valores devueltos


integer

Notas
Ejecute sp_monitor para ver un informe que contenga varias estadísticas de SQL Server, incluida la actividad de
CPU.

Ejemplos
En este ejemplo se devuelve la actividad de CPU de SQL Server hasta la fecha y hora actuales. El ejemplo
convierte uno de los valores al tipo de datos float . Esto evita problemas de desbordamiento aritmético cuando
se calcula un valor en microsegundos.

SELECT @@CPU_BUSY * CAST(@@TIMETICKS AS float) AS 'CPU microseconds',


GETDATE() AS 'As of' ;

El conjunto de resultados es el siguiente.

CPU microseconds As of
---------------- -----------------------
18406250 2006-12-05 17:00:50.600
Vea también
sys.dm_os_sys_info (Transact-SQL )
@@IDLE (Transact-SQL )
@@IO_BUSY (Transact-SQL )
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@IDLE (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el tiempo durante el que SQL Server ha estado inactivo desde su último inicio. El resultado se indica en
incrementos de tiempo de la CPU o "tics" y es acumulativo para todas las CPU, de modo que puede superar el
tiempo transcurrido real. Multiplique por @@TIMETICKS para convertir a microsegundos.

NOTE
Si el tiempo devuelto en @@CPU_BUSY o @@IO_BUSY supera aproximadamente 49 días de tiempo de CPU acumulado,
recibirá una advertencia de desbordamiento aritmético. En este caso, el valor de las variables @@CPU_BUSY, @@IO_BUSY y
@@IDLE no es exacto.

Convenciones de sintaxis de Transact-SQL

Sintaxis
@@IDLE

Tipos devueltos
integer

Notas
Para mostrar un informe que contenga varias estadísticas de SQL Server, ejecute sp_monitor.

Ejemplos
Este ejemplo muestra el número de milisegundos que SQL Server ha estado inactivo desde que se inició hasta la
hora actual. Para evitar el desbordamiento aritmético al convertir el valor a microsegundos, en el ejemplo se
convierte uno de los valores al tipo de datos float .

SELECT @@IDLE * CAST(@@TIMETICKS AS float) AS 'Idle microseconds',


GETDATE() AS 'as of';

El conjunto de resultados es el siguiente.

I
Idle microseconds as of
----------------- ----------------------
8199934 12/5/2006 10:23:00 AM

Ver también
@@CPU_BUSY (Transact-SQL )
sp_monitor (Transact-SQL )
@@IO_BUSY (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@IO_BUSY (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el tiempo que SQL Server ha invertido en realizar operaciones de entrada y salida desde la última vez
que se inició SQL Server. El resultado se expresa en incrementos de tiempo de CPU ("tics") y se acumula para
todas las CPU, por lo que puede superar el tiempo que ha transcurrido realmente. Multiplique por
@@TIMETICKS para convertir a microsegundos.

NOTE
Si el tiempo devuelto en @@CPU_BUSY o @@IO_BUSY supera aproximadamente 49 días de tiempo de CPU acumulado,
recibirá una advertencia de desbordamiento aritmético. En este caso, el valor de las variables @@CPU_BUSY, @@IO_BUSY y
@@IDLE no es exacto.

Convenciones de sintaxis de Transact-SQL

Sintaxis
@@IO_BUSY

Tipos devueltos
integer

Notas
Para mostrar un informe que contenga varias estadísticas de SQL Server, ejecute sp_monitor.

Ejemplos
En el ejemplo siguiente se muestra cómo devolver el número de milisegundos que SQL Server ha dedicado a
realizar operaciones de entrada o salida desde que se inició hasta la hora actual. Para evitar el desbordamiento
aritmético al convertir el valor a microsegundos, en el ejemplo se convierte uno de los valores al tipo de datos
float.

SELECT @@IO_BUSY*@@TIMETICKS AS 'IO microseconds',


GETDATE() AS 'as of';

Éste es un conjunto de resultados típico:

IO microseconds as of
--------------- ----------------------
4552312500 12/5/2006 10:23:00 AM
Ver también
sys.dm_os_sys_info (Transact-SQL )
@@CPU_BUSY (Transact-SQL )
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@PACK_SENT (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de paquetes de salida escritos en la red por SQL Server desde la última vez que se inició.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@PACK_SENT

Tipos devueltos
integer

Notas
Para mostrar un informe con varias estadísticas de SQL Server, incluidos los paquetes enviados y recibidos,
ejecute sp_monitor.

Ejemplos
En el siguiente ejemplo se muestra el uso de @@PACK_SENT .

SELECT @@PACK_SENT AS 'Pack Sent';

A continuación se muestra un conjunto de resultados de ejemplo.

Pack Sent
-----------
291

Ver también
@@PACK_RECEIVED (Transact-SQL )
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@PACKET_ERRORS (Transact-SQL)
18/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de errores de paquetes de red en las conexiones de SQL Server desde la última vez que se
inició SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@PACKET_ERRORS

Tipos devueltos
integer

Notas
Para ver un informe que contenga varias estadísticas de SQL Server, incluidos los errores de paquetes, ejecute
sp_monitor.

Ejemplos
En el siguiente ejemplo se muestra la forma de utilizar @@PACKET_ERRORS .

SELECT @@PACKET_ERRORS AS 'Packet Errors';

A continuación se muestra un conjunto de resultados de ejemplo.

Packet Errors
-------------
0

Ver también
@@PACK_RECEIVED (Transact-SQL )
@@PACK_SENT (Transact-SQL )
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@TIMETICKS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de microsegundos por tic-tac.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@TIMETICKS

Tipos devueltos
integer

Notas
La cantidad de tiempo por tic depende de cada equipo. Cada tic del sistema operativo dura 31,25 milisegundos o
un treintaidosavo de segundo.

Ejemplos
SELECT @@TIMETICKS AS 'Time Ticks';

Ver también
Funciones estadísticas del sistema (Transact-SQL )
@@TOTAL_ERRORS (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de errores de escritura en disco que ha encontrado SQL Server desde la última vez que se
inició SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@TOTAL_ERRORS

Tipos devueltos
integer

Notas
Esta función no se ocupa de todos los errores de escritura encontrados por SQL Server. Los errores de escritura
ocasionales que no son graves se administran en el propio servidor y no se consideran errores. Para mostrar un
informe con varias estadísticas de SQL Server, incluido el número total de errores, ejecute sp_monitor.

Ejemplos
En este ejemplo se muestra el número de errores que ha encontrado SQL Server hasta la fecha y hora actuales.

SELECT @@TOTAL_ERRORS AS 'Errors', GETDATE() AS 'As of';

El conjunto de resultados es el siguiente.

Errors As of
----------- ----------------------
0 3/28/2003 12:32:11 PM

Ver también
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@TOTAL_READ (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de lecturas de disco (no de caché) realizadas por SQL Server desde que SQL Server se inició
por última vez.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@TOTAL_READ

Tipos devueltos
integer

Notas
Para mostrar un informe con varias estadísticas de SQL Server, incluida la actividad de lectura y escritura, ejecute
sp_monitor.

Ejemplos
Este ejemplo muestra cómo devolver el número total de lecturas y escrituras en disco para la fecha y hora actuales.

SELECT @@TOTAL_READ AS 'Reads', @@TOTAL_WRITE AS 'Writes', GETDATE() AS 'As of';

El conjunto de resultados es el siguiente.

Reads Writes As of
----------- ----------- ----------------------
7760 97263 12/5/2006 10:23:00 PM

Ver también
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@TOTAL_WRITE (Transact-SQL )
@@TOTAL_WRITE (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de escrituras de disco de SQL Server desde la última vez que se inició SQL Server.
Convenciones de sintaxis de Transact-SQL

Sintaxis
@@TOTAL_WRITE

Tipos devueltos
integer

Notas
Para mostrar un informe con varias estadísticas de SQL Server, incluida la actividad de lectura y escritura, ejecute
sp_monitor.

Ejemplos
Este ejemplo muestra cómo devolver el número total de lecturas y escrituras en disco para la fecha y hora actuales.

SELECT @@TOTAL_READ AS 'Reads', @@TOTAL_WRITE AS 'Writes', GETDATE() AS 'As of'

El conjunto de resultados es el siguiente.

Reads Writes As of
----------- ----------- ----------------------
7760 97263 12/5/2006 10:23:00 PM

Ver también
sp_monitor (Transact-SQL )
Funciones estadísticas del sistema (Transact-SQL )
@@TOTAL_READ (Transact-SQL )
Funciones de texto e imagen - TEXTPTR (Transact-
SQL)
17/07/2018 • 7 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el valor de puntero de texto que corresponde a una columna text, ntext o image en formato varbinary.
El valor del puntero de texto devuelto se puede utilizar en las instrucciones READTEXT, WRITETEXT y UPDATE.

IMPORTANT
Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL
Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que
actualmente la utilizan. No hay ninguna funcionalidad alternativa disponible.

Convenciones de sintaxis de Transact-SQL

Sintaxis
TEXTPTR ( column )

Argumentos
column
Se utilizará la columna text, ntext o image.

Tipos devueltos
varbinary

Notas
En las tablas con texto consecutivo, TEXTPTR devuelve un controlador para el texto que se va a procesar. Es posible
obtener un puntero de texto válido aunque el valor del texto sea NULL.
La función TEXTPTR no se puede utilizar en columnas de vistas. Solo se puede utilizar en columnas de tablas. Para
utilizar la función TEXTPTR en una columna de una vista, debe establecerse el nivel de compatibilidad en 80
mediante el nivel de compatibilidad de ALTER DATABASE. Si la tabla no dispone de texto consecutivo y la
instrucción UPDATETEXT no ha inicializado una columna text, ntext o image, TEXTPTR devuelve un puntero
NULL.
Utilice TEXTVALID para comprobar si un puntero de texto existe. No es posible utilizar UPDATETEXT, WRITETEXT
o READTEXT sin un puntero de texto válido.
Estas funciones e instrucciones son también útiles cuando se trabaja con datos de tipo text, ntext e image.
FUNCIÓN O INSTRUCCIÓN DESCRIPCIÓN

PATINDEX ('%pattern%' , expression) Devuelve la posición de carácter de una cadena de caracteres


especificada en columnas de tipo text o ntext.

DATALENGTH (expression) Devuelve la longitud de datos en columnas text, ntext e


image.

SET TEXTSIZE Devuelve el límite en bytes de los datos de tipo text, ntext o
image que se devuelven con una instrucción SELECT.

SUBSTRING(text_column, start, length) Devuelve una cadena varchar según los valores especificados
en el desplazamiento start y length. La longitud debe ser
inferior a 8 KB.

Ejemplos
NOTE
Para ejecutar estos ejemplos, es necesario instalar la base de datos pubs.

A. Usar TEXTPTR
En el ejemplo siguiente se utiliza la función TEXTPTR para encontrar la columna logo de image asociada a
New Moon Books en la tabla pub_info de la base de datos pubs . El puntero de texto se coloca en la variable local
@ptrval.

USE pubs;
GO
DECLARE @ptrval varbinary(16);
SELECT @ptrval = TEXTPTR(logo)
FROM pub_info pr, publishers p
WHERE p.pub_id = pr.pub_id
AND p.pub_name = 'New Moon Books';
GO

B. Usar TEXTPTR con texto consecutivo


En SQL Server, el puntero de texto consecutivo debe utilizarse dentro de una transacción, como se muestra en el
ejemplo siguiente.

CREATE TABLE t1 (c1 int, c2 text);


EXEC sp_tableoption 't1', 'text in row', 'on';
INSERT t1 VALUES ('1', 'This is text.');
GO
BEGIN TRAN;
DECLARE @ptrval VARBINARY(16);
SELECT @ptrval = TEXTPTR(c2)
FROM t1
WHERE c1 = 1;
READTEXT t1.c2 @ptrval 0 1;
COMMIT;

C. Devolver datos de texto


En el ejemplo siguiente se seleccionan la columna pub_id y el puntero de texto de 16 bits de la columna pr_info
de la tabla pub_info .
USE pubs;
GO
SELECT pub_id, TEXTPTR(pr_info)
FROM pub_info
ORDER BY pub_id;
GO

El conjunto de resultados es el siguiente.

pub_id
------ ----------------------------------
0736 0x6c0000000000feffb801000001000100
0877 0x6d0000000000feffb801000001000300
1389 0x6e0000000000feffb801000001000500
1622 0x700000000000feffb801000001000900
1756 0x710000000000feffb801000001000b00
9901 0x720000000000feffb801000001000d00
9952 0x6f0000000000feffb801000001000700
9999 0x730000000000feffb801000001000f00

(8 row(s) affected)

En el ejemplo siguiente se muestra cómo devolver los primeros 8000 bytes de texto sin utilizar TEXTPTR.

USE pubs;
GO
SET TEXTSIZE 8000;
SELECT pub_id, pr_info
FROM pub_info
ORDER BY pub_id;
GO

El conjunto de resultados es el siguiente.

pub_id pr_info
------ -----------------------------------------------------------------
0736 New Moon Books (NMB) has just released another top ten publication. With the latest publication this
makes NMB the hottest new publisher of the year!
0877 This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database. Binnet & Hardley is
located in Washington, D.C.

This is sample text data for Binnet & Hardley, publisher 0877 in the pubs database. Binnet & Hardley is located
in Washi
1389 This is sample text data for Algodata Infosystems, publisher 1389 in the pubs database. Algodata
Infosystems is located in Berkeley, California.

9999 This is sample text data for Lucerne Publishing, publisher 9999 in the pubs database. Lucerne publishing
is located in Paris, France.

This is sample text data for Lucerne Publishing, publisher 9999 in the pubs database. Lucerne publishing is
located in

(8 row(s) affected)

D. Devolver datos de texto específicos


En el ejemplo siguiente se encuentra la columna text ( pr_info ) asociada a pub_id``0736 en la tabla pub_info de
la base de datos pubs . Primero se declara la variable local @val . A continuación, el puntero de texto (una cadena
binaria de tipo long) se coloca en @val y se suministra como parámetro a la instrucción READTEXT . De esta forma,
se devuelven 10 bytes a partir del quinto byte (el desplazamiento es 4).

USE pubs;
GO
DECLARE @val varbinary(16);
SELECT @val = TEXTPTR(pr_info)
FROM pub_info
WHERE pub_id = '0736';
READTEXT pub_info.pr_info @val 4 10;
GO

El conjunto de resultados es el siguiente.

pr_info
-----------------------------------------------------------------------
is sample
(1 row(s) affected)

Ver también
DATALENGTH (Transact-SQL )
PATINDEX (Transact-SQL )
READTEXT (Transact-SQL )
SET TEXTSIZE (Transact-SQL )
Funciones de texto e imagen (Transact-SQL )
UPDATETEXT (Transact-SQL )
WRITETEXT (Transact-SQL )
Funciones de texto e imagen - TEXTVALID (Transact-
SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Una función de tipo text, ntext o image que comprueba la validez de un puntero de texto específico.

IMPORTANT
Esta característica está en modo de mantenimiento y es posible que no se incluya en una versión futura de Microsoft SQL
Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que
actualmente la utilizan. No hay ninguna funcionalidad alternativa disponible.

Convenciones de sintaxis de Transact-SQL

Sintaxis
TEXTVALID ( 'table.column' ,text_ ptr )

Argumentos
table
Es el nombre de la tabla que se va a utilizar.
column
Es el nombre de la columna que se va a utilizar.
text_ptr
Es el puntero de texto que se va a comprobar.

Tipos devueltos
int

Notas
Devuelve 1 si el puntero es válido y 0 si no lo es. Observe que el identificador de la columna de tipo text debe
incluir el nombre de la tabla. No es posible utilizar UPDATETEXT, WRITETEXT o READTEXT sin un puntero de
texto válido.
Estas funciones e instrucciones son también útiles cuando se trabaja con datos de tipo text, ntext e image.

FUNCIÓN O INSTRUCCIÓN DESCRIPCIÓN

PATINDEX ('%pattern%', expression) Devuelve la posición de carácter de una cadena de caracteres


especificada en columnas de tipo text y ntext.
FUNCIÓN O INSTRUCCIÓN DESCRIPCIÓN

DATALENGTH (expression) Devuelve la longitud de datos en columnas text, ntext e


image.

SET TEXTSIZE Devuelve el límite en bytes de los datos de tipo text, ntext o
image que se devuelven con una instrucción SELECT.

Ejemplos
En el siguiente ejemplo se informa acerca de si existe un puntero de texto válido para cada valor de la columna
logo de la tabla pub_info .

NOTE
Para ejecutar este ejemplo, debe instalar la base de datos pubs.

USE pubs;
GO
SELECT pub_id, 'Valid (if 1) Text data'
= TEXTVALID ('pub_info.logo', TEXTPTR(logo))
FROM pub_info
ORDER BY pub_id;
GO

El conjunto de resultados es el siguiente.

pub_id Valid (if 1) Text data


------ ----------------------
0736 1
0877 1
1389 1
1622 1
1756 1
9901 1
9952 1
9999 1

(8 row(s) affected)

Ver también
DATALENGTH (Transact-SQL )
PATINDEX (Transact-SQL )
SET TEXTSIZE (Transact-SQL )
Funciones de texto e imagen (Transact-SQL )
TEXTPTR (Transact-SQL )
Funciones de desencadenador (Transact-SQL)
17/07/2018 • 2 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2012) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Las siguientes funciones escalares se pueden usar en la definición de un desencadenador para probar los cambios
de los valores de datos o para devolver otros datos.

En esta sección
COLUMNS_UPDATED
EVENTDATA
TRIGGER_NESTLEVEL
UPDATE ()
COLUMNS_UPDATED (Transact-SQL)
17/07/2018 • 8 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve un patrón de bits varbinary que indica las columnas de una tabla o vista que se insertaron
o se actualizaron. Use COLUMNS_UPDATED en cualquier lugar del cuerpo de un desencadenador INSERT o UPDATE
de Transact-SQL para probar si el desencadenador debe ejecutar ciertas acciones.
Convenciones de sintaxis de Transact-SQL

Sintaxis
COLUMNS_UPDATED ( )

Tipos de valores devueltos


varbinary

Notas
COLUMNS_UPDATEDcomprueba las acciones UPDATE o INSERT realizadas en varias columnas. Para comprobar los
intentos UPDATE o INSERT realizados en una columna, use UPDATE ().
COLUMNS_UPDATED devuelve uno o más bytes que se ordenan de izquierda a derecha. El bit situado más a la derecha
de cada byte es el menos significativo. El primer bit por la derecha del byte situado más a la izquierda representa la
primera columna de la tabla, el siguiente bit a la izquierda representa la segunda columna, y así sucesivamente.
COLUMNS_UPDATED devuelve varios bytes si la tabla en que se ha creado el desencadenador contiene más de ocho
columnas, siendo el menos significativo el primero por la izquierda. COLUMNS_UPDATED devuelve TRUE en todas las
columnas de las acciones INSERT porque en las columnas se insertaron valores explícitos o implícitos (NULL ).
Para probar las actualizaciones o inserciones en columnas específicas, siga la sintaxis con un operador bit a bit y
una máscara de bits de enteros de las columnas probadas. Por ejemplo, supongamos que la tabla t1 contiene las
columnas C1, C2, C3, C4 y C5. Para comprobar que las columnas C2, C3 y C4 se han actualizado correctamente
(donde la tabla t1 tiene un desencadenador UPDATE ), siga la sintaxis con & 14. Para comprobar si solo se ha
actualizado la columna C2, especifique & 2. Vea Ejemplo A y Ejemplo B para obtener ejemplos reales.
Use COLUMNS_UPDATED en cualquier parte dentro de un desencadenador INSERT o UPDATE de Transact-SQL.
La columna ORDINAL_POSITION de la vista INFORMATION_SCHEMA.COLUMNS no es compatible con el
patrón de bits de las columnas devueltas por COLUMNS_UPDATED . Para obtener un patrón de bits compatible con
COLUMNS_UPDATED , haga referencia a la propiedad ColumnID de la función del sistema COLUMNPROPERTY cuando
realice una consulta de la vista INFORMATION_SCHEMA.COLUMNS , como se muestra en el ejemplo siguiente.

SELECT TABLE_NAME, COLUMN_NAME,


COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2012.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person';
Conjuntos de columnas
Cuando un conjunto de columnas se define en una tabla, la función COLUMNS_UPDATED se comporta de las maneras
siguientes:
Cuando se actualiza de forma explícita una columna que es miembro del conjunto de columnas, el bit
correspondiente para esa columna se establece en 1, y el bit del conjunto de columnas se establece en 1.
Cuando se actualiza de forma explícita un conjunto de columnas, el bit del conjunto de columnas se establece
en 1, y los bits para todas las columnas dispersas de la tabla se establecen en 1.
En las operaciones de inserción, todos los bits se establecen en 1.
Dado que los cambios en un conjunto de columnas hacen que los bits de todas las columnas del conjunto
de columnas se establezcan en 1, parecerá que se han modificado las columnas sin cambiar de un conjunto
de columnas. Vea Usar conjuntos de columnas para obtener más información sobre los conjuntos de
columnas.

Ejemplos
A. Usar COLUMNS_UPDATED para comprobar las primeras ocho columnas de una tabla.
En este ejemplo se crean dos tablas: employeeData y auditEmployeeData . La tabla employeeData contiene
información confidencial de los sueldos de los empleados y la pueden modificar los miembros del departamento
de recursos humanos. Si se cambia el número de seguridad social, el sueldo anual o el número de cuenta bancaria
de un empleado, se genera un registro de auditoría y se inserta en la tabla de auditoría auditEmployeeData .
Con la función COLUMNS_UPDATED() , se pueden probar rápidamente los cambios realizados en las columnas que
contienen información confidencial de los empleados. El uso de COLUMNS_UPDATED() de esta manera solo funciona
al intentar detectar cambios en las primeras ocho columnas de la tabla.

USE AdventureWorks2012;
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'employeeData')
DROP TABLE employeeData;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'auditEmployeeData')
DROP TABLE auditEmployeeData;
GO
CREATE TABLE dbo.employeeData (
emp_id int NOT NULL PRIMARY KEY,
emp_bankAccountNumber char (10) NOT NULL,
emp_salary int NOT NULL,
emp_SSN char (11) NOT NULL,
emp_lname nchar (32) NOT NULL,
emp_fname nchar (32) NOT NULL,
emp_manager int NOT NULL
);
GO
CREATE TABLE dbo.auditEmployeeData (
audit_log_id uniqueidentifier DEFAULT NEWID() PRIMARY KEY,
audit_log_type char (3) NOT NULL,
audit_emp_id int NOT NULL,
audit_emp_bankAccountNumber char (10) NULL,
audit_emp_salary int NULL,
audit_emp_SSN char (11) NULL,
audit_user sysname DEFAULT SUSER_SNAME(),
audit_changed datetime DEFAULT GETDATE()
);
GO
CREATE TRIGGER dbo.updEmployeeData
ON dbo.employeeData
AFTER UPDATE AS
AFTER UPDATE AS
/* Check whether columns 2, 3 or 4 have been updated. If any or all
columns 2, 3 or 4 have been changed, create an audit record. The
bitmask is: power(2, (2-1)) + power(2, (3-1)) + power(2, (4-1)) = 14. To test
whether all columns 2, 3, and 4 are updated, use = 14 instead of > 0
(below). */

IF (COLUMNS_UPDATED() & 14) > 0


/* Use IF (COLUMNS_UPDATED() & 14) = 14 to see whether all columns 2, 3,
and 4 are updated. */
BEGIN
-- Audit OLD record.
INSERT INTO dbo.auditEmployeeData
(audit_log_type,
audit_emp_id,
audit_emp_bankAccountNumber,
audit_emp_salary,
audit_emp_SSN)
SELECT 'OLD',
del.emp_id,
del.emp_bankAccountNumber,
del.emp_salary,
del.emp_SSN
FROM deleted del;

-- Audit NEW record.


INSERT INTO dbo.auditEmployeeData
(audit_log_type,
audit_emp_id,
audit_emp_bankAccountNumber,
audit_emp_salary,
audit_emp_SSN)
SELECT 'NEW',
ins.emp_id,
ins.emp_bankAccountNumber,
ins.emp_salary,
ins.emp_SSN
FROM inserted ins;
END;
GO

/* Inserting a new employee does not cause the UPDATE trigger to fire. */
INSERT INTO employeeData
VALUES ( 101, 'USA-987-01', 23000, 'R-M53550M', N'Mendel', N'Roland', 32);
GO

/* Updating the employee record for employee number 101 to change the
salary to 51000 causes the UPDATE trigger to fire and an audit trail to
be produced. */

UPDATE dbo.employeeData
SET emp_salary = 51000
WHERE emp_id = 101;
GO
SELECT * FROM auditEmployeeData;
GO

/* Updating the employee record for employee number 101 to change both
the bank account number and social security number (SSN) causes the
UPDATE trigger to fire and an audit trail to be produced. */

UPDATE dbo.employeeData
SET emp_bankAccountNumber = '133146A0', emp_SSN = 'R-M53550M'
WHERE emp_id = 101;
GO
SELECT * FROM dbo.auditEmployeeData;

GO
B. Utilizar COLUMNS_UPDATED para comprobar más de ocho columnas
Para comprobar las actualizaciones que afectan a otras columnas que no sean las ocho primeras de la tabla, use la
función SUBSTRING para comprobar si COLUMNS_UPDATED devuelve el bit correcto. En este ejemplo se comprueban
las actualizaciones que afectan a las columnas 3 , 5 y 9 de la tabla AdventureWorks2012.Person.Person .

USE AdventureWorks2012;
GO
IF OBJECT_ID (N'Person.uContact2', N'TR') IS NOT NULL
DROP TRIGGER Person.uContact2;
GO
CREATE TRIGGER Person.uContact2 ON Person.Person
AFTER UPDATE AS
IF ( (SUBSTRING(COLUMNS_UPDATED(), 1, 1) & 20 = 20)
AND (SUBSTRING(COLUMNS_UPDATED(), 2, 1) & 1 = 1) )
PRINT 'Columns 3, 5 and 9 updated';
GO

UPDATE Person.Person
SET NameStyle = NameStyle,
FirstName=FirstName,
EmailPromotion=EmailPromotion;
GO

Vea también
Operadores bit a bit (Transact-SQL )
CREATE TRIGGER (Transact-SQL )
UPDATE () (Transact-SQL )
EVENTDATA (Transact-SQL)
19/07/2018 • 5 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Esta función devuelve información acerca de los eventos de base de datos o servidor. EVENTDATA se llama cuando
se activa una notificación de eventos y el resultado se devuelve al Service Broker especificado. Un desencadenador
DDL o LOGON también admite el uso interno de EVENTDATA .
Convenciones de sintaxis de Transact-SQL

Sintaxis
EVENTDATA( )

Notas
devuelve datos solo cuando se hace referencia al mismo directamente dentro de un desencadenador
EVENTDATA
DDL o LOGON. EVENTDATA devuelve NULL si otras rutinas lo llaman, incluso si un desencadenador DDL o
LOGON llama a esas rutinas.
Los datos que EVENTDATA devuelve no son válidos después de una transacción que
llamó a EVENTDATA de manera explícita
llamó a EVENTDATA de manera implícita
se confirma
se revierte
Cau t i on

EVENTDATA devuelve datos de XML, enviados al cliente como Unicode que usa 2 bytes para cada carácter.
EVENTDATA devuelve XML que puede representar estos puntos de código de Unicode:
0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML no puede expresar, ni permitirá, algunos caracteres que pueden aparecer en los datos e identificadores de
Transact-SQL. Los caracteres o datos que tienen puntos de código que no se muestran en la lista anterior se
asignan a un signo de interrogación (?).
Las contraseñas no se muestran cuando se ejecutan las instrucciones CREATE LOGIN o ALTER LOGIN . Esto protege la
seguridad del inicio de sesión.

Esquemas devueltos
EVENTDATA devuelve un valor de tipo de datos xml. De manera predeterminada, la definición de esquema para
todos los eventos se instala en este directorio: C:\Program Files\Microsoft SQL
Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.
La página web Esquemas XML de Microsoft SQL Server también tiene el esquema de eventos.
Para extraer el esquema de un evento concreto, busque el esquema del tipo complejo EVENT_INSTANCE_<event_type>
. Por ejemplo, para extraer el esquema del evento DROP_TABLE , busque el esquema de EVENT_INSTANCE_DROP_TABLE .

Ejemplos
A. Consultar datos de evento en un desencadenador DDL
En este ejemplo se crea un desencadenador DDL que impide la creación de nuevas tablas de bases de datos. El uso
de XQuery con los datos XML generados por EVENTDATA captura la instrucción Transact-SQL que activa el
desencadenador. Consulte Referencia del lenguaje XQuery (SQL Server) para más información.

NOTE
Cuando se usa Resultados a cuadrícula en SQL Server Management Studio para consultar el elemento <TSQLCommand> ,
no se muestran los saltos de línea en el texto del comando. Es preferible usar Resultados a texto.

USE AdventureWorks2012;
GO
CREATE TRIGGER safety
ON DATABASE
FOR CREATE_TABLE
AS
PRINT 'CREATE TABLE Issued.'
SELECT EVENTDATA().value
('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
RAISERROR ('New tables cannot be created in this database.', 16, 1)
ROLLBACK
;
GO
--Test the trigger.
CREATE TABLE NewTable (Column1 int);
GO
--Drop the trigger.
DROP TRIGGER safety
ON DATABASE;
GO

NOTE
Para devolver datos de evento, use el método XQuery value() en lugar del método query(). El método query() devuelve
XML e instancias de retorno de carro y avance de línea (CR/LF) con el carácter de escape “y” comercial en el resultado,
mientras que el método value() representa instancias de CR/LF invisibles en el resultado.

B. Crear una tabla de registro con datos de evento en un desencadenador DDL


En este ejemplo se crea una tabla para almacenar información sobre todos los eventos de nivel de base de datos y
rellena esa tabla con un desencadenador DDL. El uso de XQuery con los datos XML generados por EVENTDATA
captura el tipo de evento y la instrucción Transact-SQL.
USE AdventureWorks2012;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));
GO
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
INSERT ddl_log
(PostTime, DB_User, Event, TSQL)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
GO
--Test the trigger.
CREATE TABLE TestTable (a int);
DROP TABLE TestTable ;
GO
SELECT * FROM ddl_log ;
GO
--Drop the trigger.
DROP TRIGGER log
ON DATABASE;
GO
--Drop table ddl_log.
DROP TABLE ddl_log;
GO

Ver también
Usar la función EVENTDATA
Desencadenadores DDL
Notificaciones de eventos
Desencadenadores logon
TRIGGER_NESTLEVEL (Transact-SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve el número de desencadenadores que se han ejecutado para la instrucción que ha activado el
desencadenador. TRIGGER_NESTLEVEL se utiliza en desencadenadores DML y DDL para determinar el nivel
actual de anidamiento.
Convenciones de sintaxis de Transact-SQL

Sintaxis
TRIGGER_NESTLEVEL ( [ object_id ] , [ 'trigger_type' ] , [ 'trigger_event_category' ] )

Argumentos
object_id
Es el Id. de objeto de un desencadenador. Si se especifica object_id, se devuelve el número de veces que el
desencadenador especificado se ha ejecutado para la instrucción. Si no se especifica object_id, se devuelve el
número de veces que se han ejecutado todos los desencadenadores para la instrucción.
' trigger_type '
Especifica si se aplica TRIGGER_NESTLEVEL a los desencadenadores AFTER o a los desencadenadores INSTEAD
OF. Especifique AFTER para desencadenadores AFTER. Especifique IOT para desencadenadores INSTEAD OF. Si
se especifica trigger_type, trigger_event_category también debe especificarse.
' trigger_event_category '
Especifica si se aplica TRIGGER_NESTLEVEL a desencadenadores DML o DDL. Especifique DML para
desencadenadores DML. Especifique DDL para desencadenadores DDL. Si se especifica trigger_event_category,
trigger_type también debe especificarse. Tenga en cuenta que solo se puede especificar AFTER con DDL, ya que
los desencadenadores DDL solo pueden ser desencadenadores AFTER.

Notas
Cuando no se especifica ningún parámetro, TRIGGER_NESTLEVEL devuelve el número total de
desencadenadores de la pila de llamadas. Esto incluye el propio desencadenador. La omisión de los parámetros
puede darse cuando un desencadenador ejecuta comandos que causan la activación de otro desencadenador o de
una serie de desencadenadores.
Para devolver el número total de desencadenadores en la pila de llamadas para un tipo de desencadenador y una
categoría de eventos determinados, especifique object_id = 0.
TRIGGER_NESTLEVEL devuelve 0 si se ejecuta fuera de un desencadenador y cualquier parámetro es distinto de
NULL.
Cuando algunos parámetros se especifican explícitamente como NULL, el valor de NULL se devuelve
independientemente de si TRIGGER_NESTLEVEL se utilizó dentro o fuera de un desencadenador.
Ejemplos
A. Probar el nivel de anidamiento de un desencadenador DML específico

IF ( (SELECT TRIGGER_NESTLEVEL( OBJECT_ID('xyz') , 'AFTER' , 'DML' ) ) > 5 )


RAISERROR('Trigger xyz nested more than 5 levels.',16,-1)

B. Probar el nivel de anidamiento de un desencadenador DDL específico

IF ( ( SELECT TRIGGER_NESTLEVEL ( ( SELECT object_id FROM sys.triggers


WHERE name = 'abc' ), 'AFTER' , 'DDL' ) ) > 5 )
RAISERROR ('Trigger abc nested more than 5 levels.',16,-1)

C. Probar el nivel de anidamiento de todos los desencadenadores ejecutados

IF ( (SELECT trigger_nestlevel() ) > 5 )


RAISERROR
('This statement nested over 5 levels of triggers.',16,-1)

Ver también
CREATE TRIGGER (Transact-SQL )
UPDATE: funciones de desencadenador (Transact-
SQL)
17/07/2018 • 3 minutes to read • Edit Online

ESTE TEMA SE APLICA A: SQL Server (a partir de 2008) Azure SQL Database Azure SQL Data
Warehouse Almacenamiento de datos paralelos
Devuelve un valor booleano que indica si se intentó utilizar INSERT o UPDATE en una columna especificada de
una tabla o vista. UPDATE () se utiliza en cualquier lugar del cuerpo de un desencadenador INSERT o UPDATE de
Transact-SQL para probar si el desencadenador debe ejecutar ciertas acciones.
Convenciones de sintaxis de Transact-SQL

Sintaxis
UPDATE ( column )

Argumentos
column
Es el nombre de la columna que se va a probar para una acción INSERT o UPDATE. Debido a que el nombre de la
tabla se especifica en la cláusula ON del desencadenador, no lo incluya antes del nombre de la columna. Esta
columna puede ser de cualquier tipo de datos admitido por SQL Server. No obstante, no se pueden utilizar
columnas calculadas en este contexto.

Tipos devueltos
Boolean

Notas
UPDATE () devuelve TRUE independientemente de si un intento de INSERT o UPDATE tiene éxito.
Para probar una acción INSERT o UPDATE en más de una columna, especifique una cláusula UPDATE (column)
distinta a continuación de la primera. También puede probar acciones INSERT o UPDATE en varias columnas con
COLUMNS_UPDATED, que devuelve un patrón de bits que indica las columnas que se insertaron o se
actualizaron.
IF UPDATE devuelve el valor TRUE en las acciones INSERT porque en las columnas se insertaron valores
explícitos o implícitos (NULL ).

NOTE
La cláusula IF UPDATE(column) funciona de forma idéntica a una instrucción IF, IF…ELSE o WHILE, y puede usar el bloque
BEGIN…END. Para más información, vea Lenguaje de control de flujo (Transact-SQL).

UPDATE (column) se puede usar en cualquier lugar del cuerpo de un desencadenador Transact-SQL.
Ejemplos
En el ejemplo siguiente se crea un desencadenador que imprime un mensaje para el cliente si alguien intenta
actualizar las columnas StateProvinceID o PostalCode de la tabla Address .

USE AdventureWorks2012;
GO
IF EXISTS (SELECT name FROM sys.objects
WHERE name = 'reminder' AND type = 'TR')
DROP TRIGGER Person.reminder;
GO
CREATE TRIGGER reminder
ON Person.Address
AFTER UPDATE
AS
IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )
BEGIN
RAISERROR (50009, 16, 10)
END;
GO
-- Test the trigger.
UPDATE Person.Address
SET PostalCode = 99999
WHERE PostalCode = '12345';
GO

Ver también
COLUMNS_UPDATED (Transact-SQL )
CREATE TRIGGER (Transact-SQL )

You might also like