100
Mi colección Este documento se proporciona "tal cual". La información y los puntos de vista expresados en este documento, incluyendo las referencias a sitios web de Internet y direcciones URL, está sujeta a cambios sin aviso. Este documento no implica ningún derecho legal respecto a ninguna propiedad intelectual de ningún nombre de producto o producto de Microsoft. Puede copiar y utilizar este documento con fines internos y de referencia. Se permite que modifique este documento para sus fines internos y de referencia. © 2013 Microsoft. Reservados todos los derechos. Términos de uso (http://msdn.microsoft.com/cc300389.aspx) | Marcas comerciales (http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx)

Microsoft SQL Transact 2014.pdf

Embed Size (px)

Citation preview

  • Mi coleccin

    Este documento se proporciona "tal cual". La informacin y los puntos de vista expresados en este documento, incluyendo las referencias a sitios web deInternet y direcciones URL, est sujeta a cambios sin aviso. Este documento no implica ningn derecho legal respecto a ninguna propiedad intelectual de ningn

    nombre de producto o producto de Microsoft. Puede copiar y utilizar este documento con fines internos y de referencia. Se permite que modifique estedocumento para sus fines internos y de referencia. 2013 Microsoft. Reservados todos los derechos. Trminos de uso

    (http://msdn.microsoft.com/cc300389.aspx) | Marcas comerciales (http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx)

  • Table Of ContentsCaptulo 1

    BULK INSERT (Transact-SQL)DELETE (Transact-SQL)FROM (Transact-SQL)Sugerencias (Transact-SQL)INSERT (Transact-SQL)MERGE (Transact-SQL)OPTION clusula de TransactSQLOUTPUT clusula de TransactSQLREADTEXT (Transact-SQL)Condiciones de bsqueda TransactSQLSELECT (Transact-SQL)Constructor con valores de tabla (Transact-SQL)TOP (Transact-SQL)UPDATE (Transact-SQL)UPDATETEXT (Transact-SQL)WHERE (Transact-SQL)WITH common_table_expression (Transact-SQL)WRITETEXT (Transact-SQL)

  • Captulo1

  • BULK INSERT (Transact-SQL)

    Importa un archivo de datos en una tabla o vista de base de datos con un formato especificado por el usuario en SQL Server

    Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual).

    Convenciones de sintaxis de Transact-SQL (Transact-SQL)

    Sintaxis

    Argumentos

    database_nameEs el nombre de la base de datos en la que reside la tabla o vista especificada. Si no se especifica, es la base de datos actual.

    schema_nameEs el nombre del esquema de la tabla o vista. schema_name es opcional si el esquema predeterminado para el usuario que realiza la operacin de importacinmasiva es el esquema de la tabla o vista especificada. Si no se especifica schema y el esquema predeterminado del usuario que realiza la operacin deimportacin masiva es diferente de la tabla o vista especificada, SQL Server devuelve un mensaje de error y se cancela la operacin de importacin masiva.

    table_nameEs el nombre de la tabla o vista en la que se va a realizar una importacin masiva de datos. Solo se pueden utilizar vistas en las que todas las columnas haganreferencia a la misma tabla base. Para obtener ms informacin acerca de las restricciones para la carga de datos en vistas, vea INSERT (Transact-SQL).

    ' data_file 'Es la ruta de acceso completa al archivo de datos que contiene los datos que se van a importar en la tabla o vista especificada. BULK INSERT puede importardatos desde un disco incluidos una ubicacin de red, disquete, disco duro, etc..

    data_file debe especificar una ruta de acceso vlida del servidor en el que se ejecuta SQL Server. Si data_file es un archivo remoto, especifique un nombre UNCConvencin de nomenclatura universal. Un nombre UNC tiene el formato \\Systemname\ShareName\Path\FileName. Por ejemplo,\\SystemX\DiskZ\Sales\update.txt.

    BATCHSIZE =batch_sizeEspecifica el nmero de filas de un lote. Cada lote se copia en el servidor como una transaccin. Si no ocurre as, SQL Server confirma o revierte la transaccinde cada lote. De forma predeterminada, todos los datos del archivo de datos especificado componen un lote. Para obtener informacin acerca deconsideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este tema.

    CHECK_CONSTRAINTSEspecifica que deben comprobarse todas las restricciones de la tabla o vista de destino durante la operacin de importacin masiva. Sin la opcinCHECK_CONSTRAINTS, se omiten las restricciones CHECK y FOREIGN KEY, y, despus de la operacin, la restriccin sobre la tabla se marca como de noconfianza.

    Nota

    Las restricciones UNIQUE y PRIMARY KEY se aplican siempre. Cuando se importa en una columna de caracteres definida con la restriccin NOT NULL, BULKINSERT inserta una cadena vaca cuando no hay valor en el archivo de texto.

    En algn momento, debe examinar las restricciones de toda la tabla. Si la tabla no estaba vaca antes de la operacin de importacin masiva, el costo derevalidar la restriccin puede superar del costo de aplicar restricciones CHECK a los datos incrementales.

    SQL Server 2014

    BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM 'data_file' [ WITH ( [ [ , ] BATCHSIZE = batch_size ] [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] [ [ , ] DATAFILETYPE = { 'char' | 'native'| 'widechar' | 'widenative' } ] [ [ , ] FIELDTERMINATOR = 'field_terminator' ] [ [ , ] FIRSTROW = first_row ] [ [ , ] FIRE_TRIGGERS ] [ [ , ] FORMATFILE = 'format_file_path' ] [ [ , ] KEEPIDENTITY ] [ [ , ] KEEPNULLS ] [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] [ [ , ] LASTROW = last_row ] [ [ , ] MAXERRORS = max_errors ] [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] [ [ , ] ROWS_PER_BATCH = rows_per_batch ] [ [ , ] ROWTERMINATOR = 'row_terminator' ] [ [ , ] TABLOCK ] [ [ , ] ERRORFILE = 'file_name' ] )]

  • Una situacin en la que quiz desee que las restricciones estn deshabilitadas comportamiento predeterminado se produce cuando los datos de entradacontienen filas que infringen las restricciones. Con las restricciones CHECK deshabilitadas, puede importar los datos y utilizar despus instrucciones TransactSQLpara quitar los datos no vlidos.

    Nota

    La opcin MAXERRORS no se aplica a la comprobacin de restricciones.

    CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }Especifica la pgina de cdigos 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.

    Nota

    Microsoft recomienda especificar un nombre de intercalacin para cada columna de un archivo de formato.

    Valor de CODEPAGE Descripcin

    ACP Las columnas con el tipo de datos char, varchar o text se convierten de la pgina de cdigos ANSI/Microsoft Windows ISO 1252 ala pgina de cdigos de SQL Server.

    OEM (valorpredeterminado)

    Las columnas con los tipos de datos char, varchar o text se convierten de la pgina de cdigos OEM del sistema a la pgina decdigos de SQL Server.

    RAW No se realiza ninguna conversin de una pgina de cdigos a otra; se trata de la opcin ms rpida.

    code_page Nmero especfico de una pgina de cdigos; por ejemplo, 850.

    Importante

    SQL Server no admite la pgina de cdigos 65001 codificacin UTF8.

    DATAFILETYPE = { 'char' | 'native' | 'widechar' | 'widenative' }Especifica que BULK INSERT realiza la operacin de importacin con el valor de tipo de archivo de datos especificado.

    Valor deDATAFILETYPE

    Todos los datos representados en:

    char (valorpredeterminado)

    Formato de caracteres.

    Para obtener ms informacin, vea Usar el formato de caracteres para importar o exportar datos (SQL Server).

    native Tipos de datos nativos (base de datos). Cree el archivo de datos nativos mediante la importacin masiva de datos desde SQL Server conla utilidad bcp.

    El valor native ofrece una alternativa de mayor rendimiento al valor char.

    Para obtener ms informacin, vea Usar el formato nativo para importar o exportar datos (SQL Server).

    widechar Caracteres Unicode.

    Para obtener ms informacin, vea Usar el formato de caracteres Unicode para importar o exportar datos (SQL Server).

    widenative Tipos de datos nativos (base de datos), salvo en las columnas char, varchar y text en las que los datos se almacenan como datosUnicode. Cree el archivo de datos de widenative mediante la importacin masiva de datos desde SQL Server con la utilidad bcp.

    El valor widenative ofrece una alternativa de mayor rendimiento a widechar. Si el archivo de datos contiene caracteres extendidos ANSI,especifique widenative.

    Para obtener ms informacin, vea Usar el formato nativo Unicode para importar o exportar datos (SQL Server).

    FIELDTERMINATOR ='field_terminator'Especifica el terminador de campo que se va a utilizar para archivos de datos de tipo char y widechar. El terminador de campo predeterminado es \t(tabulador). Para obtener ms informacin, vea Especificar terminadores de campo y de fila (SQL Server).

    FIRSTROW =first_rowEspecifica el nmero de la primera fila que se va a cargar. El valor predeterminado es la primera fila del archivo de datos especificado. FIRSTROW comienza en1.

    Nota

    El atributo FIRSTROW no est pensado para saltar los encabezados de columna. La instruccin BULK INSERT no permite omitir los encabezados. Al omitirfilas, Motor de base de datos de SQL Server solo analiza los terminadores de campo y no valida los datos en los campos de las filas omitidas.

    FIRE_TRIGGERSEspecifica que se ejecutarn todos los desencadenadores de insercin definidos en la tabla de destino durante la operacin de importacin masiva. Si sedefinen desencadenadores para operaciones INSERT en la tabla de destino, se activan para cada lote completado.

    Si no se especifica FIRE_TRIGGERS, no se ejecuta ningn desencadenador de insercin.

    FORMATFILE ='format_file_path'Especifica la ruta de acceso completa de un archivo de formato. Un archivo de formato describe el archivo de datos que contiene respuestas almacenadascreado con la utilidad bcp en la misma tabla o vista. Se debe usar el archivo de formato si:

  • El archivo de datos contiene un nmero de columnas mayor o menor que la tabla o vista.

    Las columnas estn en un orden diferente.

    Los delimitadores de columna varan.

    Hay otros cambios en el formato de los datos. Los archivos de formato se suelen crear con la utilidad bcp y se modifican con un procesador de texto sies necesario. Para obtener ms informacin, vea bcp (utilidad).

    KEEPIDENTITYEspecifica que se utilizar el valor o valores de identidad del archivo de datos importado para la columna de identidad. Si no se especifica KEEPIDENTITY, losvalores de identidad de esta columna se comprueban pero no se importan y SQL Server asigna automticamente valores nicos basados en los valores deinicializacin y de incremento especificados durante la creacin de la tabla. Si el archivo de datos no contiene valores para la columna de identidad de la tabla ovista, utilice un archivo de formato para especificar que se debe omitir la columna de identidad de la tabla o vista cuando se importen los datos; SQL Serverasigna automticamente valores nicos para la columna. Para obtener ms informacin, vea DBCC CHECKIDENT (Transact-SQL).

    Para obtener ms informacin acerca de cmo mantener los valores de identidad, vea Mantener valores de identidad al importar datos de forma masiva (SQLServer).

    KEEPNULLSEspecifica que las columnas vacas deben conservar un valor NULL durante la operacin de importacin masiva, en lugar de tener valores predeterminados paralas columnas insertadas. Para obtener ms informacin, vea Mantener valores NULL o usar valores predeterminados durante la importacin masiva SQL Server.

    KILOBYTES_PER_BATCH = kilobytes_per_batchEspecifica el nmero aproximado de kilobytes KB de datos por lote como kilobytes_per_batch. De forma predeterminada, el valor de KILOBYTES_PER_BATCH esdesconocido. Para obtener informacin acerca de consideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este tema.

    LASTROW=last_rowEspecifica el nmero de la ltima fila que se va a cargar. El valor predeterminado es 0, que indica la ltima fila del archivo de datos especificado.

    MAXERRORS = max_errorsEspecifica el nmero mximo de errores de sintaxis permitidos en los datos antes de cancelar la operacin de importacin masiva. Cada fila que no se puedeimportar con la operacin de importacin masiva se omite y se considera un error. Si no se especifica max_errors, el valor predeterminado es 10.

    Nota

    La opcin MAX_ERRORS no se aplica para comprobar restricciones ni para convertir tipos de datos money y bigint.

    ORDER ( { column [ ASC | DESC ] } [ ,... n ] )Especifica la forma en que estn ordenados los datos del archivo de datos. El rendimiento de la importacin masiva mejora si los datos importados se ordenansegn el ndice clster de la tabla, si lo hay. Si el archivo de datos se ordena siguiendo otro criterio que no sea el orden de una clave de ndice clster, o si nohay ningn ndice clster en la tabla, la clusula ORDER se pasa por alto. Los nombres de columna facilitados deben ser nombres vlidos en la tabla de destino.De forma predeterminada, la operacin de insercin masiva presupone que los datos del archivo no estn ordenados. Para optimizar las operaciones deimportacin masiva, SQL Server tambin se valida que los datos importados estn ordenados.

    nEs un marcador de posicin que indica que se pueden especificar varias columnas.

    ROWS_PER_BATCH =rows_per_batchIndica el nmero aproximado de filas de datos del archivo de datos.

    De forma predeterminada, todos los datos del archivo de datos se envan al servidor en una sola transaccin y el optimizador de consultas desconoce elnmero de filas del lote. Si especifica ROWS_PER_BATCH con el valor > 0 el servidor utiliza este valor para optimizar la operacin de importacin masiva. Elvalor especificado para ROWS_PER_BATCH debe ser aproximadamente el mismo que el nmero real de filas. Para obtener informacin acerca deconsideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en este tema.

    ROWTERMINATOR ='row_terminator'Especifica el terminador de fila que se va a utilizar para archivos de datos de tipo char y widechar. El terminador de fila predeterminado es \r\n carcter denueva lnea. Para obtener ms informacin, vea Especificar terminadores de campo y de fila (SQL Server).

    TABLOCKEspecifica que se obtiene un bloqueo de tabla durante la operacin de importacin masiva. Varios clientes pueden cargar una tabla simultneamente si sta notiene ndices y se especifica TABLOCK. De forma predeterminada, el comportamiento del bloqueo viene determinado por la opcin de tabla table lock on bulkload. Al mantener un bloqueo durante la operacin de importacin masiva, se reduce la contencin por bloqueos de la tabla y en algunos casos puedemejorarse notablemente el rendimiento. Para obtener informacin acerca de consideraciones de rendimiento, vea la seccin "Comentarios" ms adelante en estetema.

    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 eneste archivo de errores desde el archivo de datos "tal cual".

    El archivo de errores se crea cuando se ejecuta el comando. Se produce un error si el archivo ya existe. Adems, se crea un archivo de control con la extensin.ERROR.txt. Este archivo hace referencia a cada fila del archivo de errores y proporciona diagnsticos de errores. Tan pronto como se corrigen los errores, sepueden cargar los datos.

    Compatibilidad

    BULK INSERT aplica una estricta validacin y comprobacin de los datos ledos de un archivo que pueden dar lugar a errores en los scripts existentes cuando seejecutan en datos no vlidos. Por ejemplo, BULK INSERT comprueba que:

    Las representaciones nativas de los tipos de datos float o real son vlidas.

  • Los datos Unicode tienen una longitud de bytes uniforme.

    Tipos de datos

    Conversiones de tipos de datos de cadena a decimalLas conversiones de tipos de datos de cadena a decimal utilizadas en BULK INSERT siguen las mismas reglas que la funcin CONVERT de Transact-SQL, que rechaza lascadenas que representan valores numricos con notacin cientfica. Por lo tanto, BULK INSERT trata esas cadenas como valores no vlidos y genera errores deconversin.

    Para solucionar este comportamiento, use un archivo de formato para la importacin masiva de datos de tipo float con notacin cientfica en una columna con valoresdecimales. En el archivo de formato, describa explcitamente la columna como de datos real o float. Para obtener ms informacin acerca de estos tipos de datos, veafloat y real (Transact-SQL).

    Nota

    Los archivos de formato representan los datos real como el tipo de datos SQLFLT4 y los datos float como el tipo de datos SQLFLT8. Para obtener informacinacerca de los archivos de formato no XML, vea Especificar el tipo de almacenamiento en archivo mediante bcp (SQL Server).

    Ejemplo de importacin de un valor numrico que utiliza notacin cientficaEn este ejemplo se utiliza la siguiente tabla:

    El usuario desea importar masivamente datos en la tabla t_float. El archivo de datos (C:\t_float-c.dat) contiene datos float con notacin cientfica; por ejemplo:

    No obstante, BULK INSERT no puede importar estos datos directamente en t_float, ya que su segunda columna, c2, utiliza el tipo de datos decimal. Por lo tanto, esnecesario un archivo de formato. El archivo de formato debe asignar los datos float con notacin cientfica al formato decimal de la columna c2.

    El siguiente archivo de formato utiliza el tipo de datos SQLFLT8 para asignar el segundo campo de datos a la segunda columna:

    Para utilizar este archivo de formato (con el nombre de archivo C:\t_floatformat-c-xml.xml) para importar los datos de prueba en la tabla de prueba, emita lasiguiente instruccin TransactSQL:

    Tipos de datos para importar o exportar masivamente documentos SQLXMLPara 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 oSQLVARCHAR

    Los datos se envan en la pgina de cdigos del cliente o en la pgina de cdigos implcita en la intercalacin. El efecto es el mismo que si seespecifica DATAFILETYPE ='char' sin especificar un archivo de formato.

    SQLNCHAR oSQLNVARCHAR

    Los datos se envan como Unicode. El efecto es el mismo que si se especifica DATAFILETYPE = 'widechar' sin especificar un archivo deformato.

    SQLBINARY oSQLVARBIN

    Los datos se envan sin realizar ninguna conversin.

    Comentarios generales

    CREATE TABLE t_float(c1 float, c2 decimal (5,4));

    8.0000000000000002E-28.0000000000000002E-2

    BULK INSERT bulktest..t_floatFROM 'C:\t_float-c.dat' WITH (FORMATFILE='C:\t_floatformat-c-xml.xml');GO

  • Para obtener una comparacin de la instruccin BULK INSERT, la instruccin INSERT ... SELECT * FROM OPENROWSET(BULK...) y el comando bcp, vea Importar yexportar datos de forma masiva (SQL Server).

    Para obtener informacin sobre cmo preparar los datos para la importacin masiva, vea Preparar los datos para exportar o importar de forma masiva (SQL Server).

    La instruccin BULK INSERT se puede ejecutar en una transaccin definida por el usuario para importar datos en una tabla o una vista. Opcionalmente, para utilizarvarias coincidencias para la importacin masiva de datos, una transaccin puede especificar la clusula BATCHSIZE en la instruccin BULK INSERT. Si una transaccin devarios lotes se revierte, cada lote que la transaccin ha enviado a SQL Server se revierte.

    Interoperabilidad

    Importar datos desde un archivo CSVLas operaciones de importacin masiva de SQL Server no admiten los archivos de valores separados por comas CSV. Sin embargo, en algunos casos se puede utilizarun archivo de valores separados por comas CSV como archivo de datos para una importacin masiva de datos en SQL Server. Para obtener informacin acerca delos requisitos para importar datos de un archivo de datos CSV, vea Preparar los datos para exportar o importar de forma masiva (SQL Server).

    Comportamiento del registro

    Para obtener informacin acerca de cundo se registran en el registro de transacciones las operaciones de insercin de filas que se efectan durante la importacinmasiva, vea Requisitos previos para el registro mnimo durante la importacin masiva.

    Restricciones

    Cuando se usa un archivo de formato con BULK INSERT, solo se puede especificar un mximo de 1024 campos. Es el mismo nmero mximo de columnas permitido enuna tabla. Si usa BULK INSERT con un archivo de datos que contenga ms de 1024 campos, BULK INSERT genera el error 4822. La utilidad bcp no tiene esta limitacin,por lo que para los archivos de datos que contengan ms de 1024 campos use el comando bcp.

    Consideraciones de rendimiento

    Si el nmero de pginas que van a vaciarse en un nico lote supera un umbral interno, podra producirse un examen completo del grupo de bferes para identificarqu pginas se han de vaciar cuando el lote se confirme. Este examen completo puede afectar de forma desfavorable al rendimiento de la importacin masiva. Un casoen el que es probable que se supere el umbral interno se produce cuando un grupo de bferes grande se combina con un subsistema de E/S lento. Para evitar losdesbordamientos del bfer en equipos grandes, no utilice la sugerencia TABLOCK que quita la optimizacin masiva o use un tamao de lote menor que la preserva.

    Dado que los equipos varan, es recomendable que pruebe varios tamaos de lote con la carga de datos para averiguar lo que funciona mejor en su caso.

    Seguridad

    Delegacin de cuentas de seguridad suplantacinSi un usuario utiliza un inicio de sesin de SQL Server, se utilizar el perfil de seguridad de la cuenta de proceso de SQL Server. Un inicio de sesin mediante laautenticacin de SQL Server no puede autenticarse fuera del motor de base de datos. Por tanto, cuando un inicio de sesin mediante la autenticacin de SQL Serverinicia un comando BULK INSERT, la conexin con los datos se realiza utilizando el contexto de seguridad de la cuenta de proceso de SQL Server la cuenta que utiliza elservicio del motor de base de datos de SQL Server). Para leer correctamente los datos de origen, debe conceder acceso a los datos de origen a la cuenta utilizada porel motor de base de datos de SQL Server. En cambio, si un usuario de SQL Server inicia sesin con la autenticacin de Windows, el usuario solo puede leer los archivosa los que tiene acceso la cuenta de usuario, independientemente del perfil de seguridad del proceso de SQL Server.

    Si al ejecutar la instruccin BULK INSERT utiliza sqlcmd u osql desde un equipo e inserta datos en SQL Server en un segundo equipo y especifica data_file en un tercerequipo con una ruta de acceso UNC, es posible que reciba el error 4861.

    Para resolver este error, utilice la autenticacin de SQL Server y especifique un inicio de sesin de SQL Server, que utiliza el perfil de seguridad de la cuenta del procesode SQL Server, o bien configure Windows para habilitar la delegacin de la cuenta de seguridad. Para obtener informacin acerca de cmo habilitar una cuenta deusuario para que sea de confianza para la delegacin, vea la Ayuda de Windows.

    Para obtener ms informacin acerca de esta y otras consideraciones de seguridad en el uso de BULK INSERT, vea Importar de forma masiva datos mediante BULKINSERT u OPENROWSET(BULK...) (SQL Server).

    PermisosSe requieren los permisos INSERT y ADMINISTER BULK OPERATIONS. Adems, es necesario el permiso ALTER TABLE si se da una o varias de las siguientescircunstancias:

    Existen restricciones y no se ha especificado la opcin CHECK_CONSTRAINTS.

    Nota

    El comportamiento predeterminado es deshabilitar las restricciones. Para comprobar las restricciones CHECK explcitamente, utilice la opcinCHECK_CONSTRAINTS.

    Existen desencadenadores y no se ha especificado la opcin FIRE_TRIGGER.

    Nota

  • De manera predeterminada no se activan los desencadenadores. Para activar los desencadenadores explcitamente, use la opcin FIRE_TRIGGER.

    Se utiliza la opcin KEEPIDENTITY para importar el valor de identidad de un archivo de datos.

    Ejemplos

    A.Usar canalizaciones para importar datos de un archivoEn el siguiente ejemplo se importa informacin detallada de pedidos en la tabla AdventureWorks2012.Sales.SalesOrderDetail desde un archivo de datosespecificado utilizando una canalizacin | ) como terminador de campo y |\n como terminador de fila.

    B.Usar el argumento FIRE_TRIGGERSEn el ejemplo siguiente se especifica el argumento FIRE_TRIGGERS.

    C.Usar el salto de lnea como terminador de filaEn el siguiente ejemplo se importa un archivo que utiliza el salto de lnea como terminador de fila, igual que en una salida de UNIX:

    Nota

    Debido al modo en que Microsoft Windows trata los archivos de texto, (\n se reemplaza automticamente por \r\n).

    Otros ejemplosSe proporcionan otros ejemplos de uso de BULK INSERT en los temas siguientes:

    Ejemplos de importacin y exportacin de forma masiva documentos XML SQL Server

    Mantener valores de identidad al importar datos de forma masiva (SQL Server)

    Mantener valores NULL o usar valores predeterminados durante la importacin masiva SQL Server

    Especificar terminadores de campo y de fila (SQL Server)

    Usar un archivo de formato para importar datos de forma masiva (SQL Server)

    Usar el formato de caracteres para importar o exportar datos (SQL Server)

    Usar el formato nativo para importar o exportar datos (SQL Server)

    Usar el formato de caracteres Unicode para importar o exportar datos (SQL Server)

    Usar el formato nativo Unicode 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 asignar columnas de tabla a campos de un archivo de datos (SQL Server)

    Vea tambin

    BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail FROM 'f:\orders\lineitem.tbl' WITH ( FIELDTERMINATOR =' |', ROWTERMINATOR =' |\n' );

    BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail FROM 'f:\orders\lineitem.tbl' WITH ( FIELDTERMINATOR =' |', ROWTERMINATOR = ':\n', FIRE_TRIGGERS );

    DECLARE @bulk_cmd varchar(1000);SET @bulk_cmd = 'BULK INSERT AdventureWorks2012.Sales.SalesOrderDetailFROM '':\\'' WITH (ROWTERMINATOR = '''+CHAR(10)+''')';EXEC(@bulk_cmd);

  • Referenciabcp (utilidad)INSERT (Transact-SQL)OPENROWSET (Transact-SQL)sp_tableoption (Transact-SQL)ConceptosImportar y exportar datos de forma masiva (SQL Server)Archivos de formato para importar o exportar datos (SQL Server)Preparar los datos para exportar o importar de forma masiva (SQL Server)

    2014 Microsoft

  • DELETE (Transact-SQL)

    Quita una o varias filas de una tabla o vista de SQL Server.

    Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).

    Convenciones de sintaxis de Transact-SQL

    Sintaxis

    Argumentos

    WITH Especifica el conjunto de resultados de nombre temporal, tambin conocido como expresin de tabla comn, definido dentro del mbito de la instruccinDELETE. El conjunto de resultados se deriva de una instruccin SELECT.

    Las expresiones de tabla comunes tambin se pueden utilizar con las instrucciones SELECT, INSERT, UPDATE y CREATE VIEW. Para obtener ms informacin, veaWITH common_table_expression (Transact-SQL).

    TOP (expression) [ PERCENT ]Especifica el nmero o el porcentaje de filas aleatorias que se van a eliminar. expression puede ser un nmero o un porcentaje de las filas. Las filas a las que sehace referencia en la expresin TOP utilizada con INSERT, UPDATE o DELETE no se ordenan. Para obtener ms informacin, vea TOP (Transact-SQL).

    FROMPalabra clave opcional que se puede usar entre la palabra clave DELETE y el destino table_or_view_name o rowset_function_limited.

    table_aliasAlias especificado en la clusula FROM table_source que representa la tabla o vista de la que se van a eliminar las filas.

    server_name

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Nombre del servidor un nombre de servidor vinculado o la funcin OPENDATASOURCE como nombre de servidor) en el que se encuentra la tabla o la vista. Sise especifica server_name, son obligatorios database_name y schema_name.

    database_nameEl nombre de la base de datos.

    schema_nameNombre del esquema al que pertenece la tabla o la vista.

    table_or view_nameNombre de la tabla o vista cuyas filas se van a quitar.

    SQL Server 2014

    [ WITH [ ,...n ] ]DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] { { table_alias | | rowset_function_limited [ WITH ( table_hint_limited [ ...n ] ) ] } | @table_variable } [ ] [ FROM table_source [ ,...n ] ] [ WHERE { | { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ] [ OPTION ( [ ,...n ] ) ] [; ]

    ::={ [ server_name.database_name.schema_name. | database_name. [ schema_name ] . | schema_name. ] table_or_view_name }

  • En este mbito, se puede utilizar una variable de tabla como origen de tabla de una instruccin DELETE.

    La vista a la que hace referencia table_or_view_name debe poderse actualizar y debe hacer referencia exactamente a una tabla base de la clusula FROM de ladefinicin de vista. Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL).

    rowset_function_limited

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Funcin OPENQUERY u OPENROWSET, dependiendo del proveedor.

    WITH ( [... n] )Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios. No sepermiten NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla (Transact-SQL).

    Devuelve filas eliminadas, o expresiones basadas en ellas, como parte de la operacin DELETE. La clusula OUTPUT no se admite en instrucciones DML dirigidasa tablas o vistas remotas. Para obtener ms informacin, vea OUTPUT clusula de TransactSQL.

    FROM table_sourceEspecifica una clusula FROM adicional. Esta extensin de TransactSQL para DELETE permite especificar datos de y eliminar las filascorrespondientes de la tabla en la primera clusula FROM.

    Se puede utilizar esta extensin, que especifica una combinacin, en lugar de una subconsulta en la clusula WHERE para identificar las filas que se van a quitar.

    Para obtener ms informacin, vea FROM (Transact-SQL).

    WHEREEspecifica las condiciones utilizadas para limitar el nmero de filas que se van a eliminar. Si no se proporciona una clusula WHERE, DELETE quita todas las filasde la tabla.

    Hay dos formas de operaciones de eliminacin, que se basan en las condiciones que se especifiquen en la clusula WHERE:

    Las eliminaciones por bsqueda especifican una condicin de bsqueda que califica las filas que se van a eliminar. Por ejemplo, WHERE column_name =value.

    Las eliminaciones por posicin utilizan la clusula CURRENT OF para especificar un cursor. La operacin de eliminacin se produce en la posicin actualdel cursor. Este mtodo puede ser ms preciso que una instruccin DELETE por bsqueda que utilice una clusula WHERE search_condition para calificarlas filas que se van a eliminar. Una instruccin DELETE por bsqueda elimina varias filas si la condicin de bsqueda no identifica exclusivamente una nicafila.

    Especifica las condiciones restrictivas de las filas que se van a eliminar. No hay lmite en el nmero de predicados que se pueden incluir en una condicin debsqueda. Para obtener ms informacin, vea Condiciones de bsqueda TransactSQL.

    CURRENT OFEspecifica que la instruccin DELETE se ejecutar en la posicin actual del cursor especificado.

    GLOBALEspecifica que cursor_name hace referencia a un cursor global.

    cursor_nameEs el nombre del cursor abierto desde el que se realiza la captura. Si hay un cursor global y otro local con el nombre cursor_name, este argumento hacereferencia al cursor global si se especifica GLOBAL; de lo contrario, hace referencia al cursor local. El cursor debe permitir actualizaciones.

    cursor_variable_nameNombre de una variable de cursor. La variable de cursor debe hacer referencia a un cursor que permita realizar actualizaciones.

    OPTION ( [ ,... n] )Palabras clave que indican que se utilizan sugerencias del optimizador para personalizar el procesamiento de la instruccin por parte del Motor de base dedatos. Para obtener ms informacin, vea Sugerencias de consulta (Transact-SQL).

    Prcticas recomendadasPara eliminar todas las filas de una tabla, use TRUNCATE TABLE. TRUNCATE TABLE es ms rpido que DELETE y utiliza menos recursos de los registros de transaccionesy de sistema. TRUNCATE TABLE tiene restricciones; por ejemplo, la tabla no puede participar en la replicacin. Para obtener ms informacin, vea TRUNCATE TABLE(Transact-SQL).

    Use la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas a la aplicacin cliente. Para obtener ms informacin, vea @@ROWCOUNT (Transact-SQL).

    Tratamiento de errores

    Puede implementar el control de errores de la instruccin DELETE especificando la instruccin en una construccin TRYCATCH.

    La instruccin DELETE puede tener un error si infringe un desencadenador o intenta quitar una fila a la que hacen referencia datos de otra tabla con una restriccinFOREIGN KEY. Si la instruccin DELETE quita varias filas y cualquiera de las filas eliminadas infringe un desencadenador o restriccin, se cancela la instruccin, sedevuelve un error y no se elimina ninguna fila.

    Cuando una instruccin DELETE encuentra un error aritmtico desbordamiento, divisin entre cero o error de dominio al evaluar una expresin, el Motor de base dedatos trata ese error como si SET ARITHABORT fuese ON. Se cancela el resto del proceso por lotes y se devuelve un mensaje de error.

  • Interoperabilidad

    Es posible utilizar DELETE en el cuerpo de una funcin definida por el usuario si el objeto que se va a modificar es una variable de tabla.

    Al eliminar una fila que contiene una columna FILESTREAM, tambin elimina los archivos del sistema de archivos subyacentes. El recolector de elementos no utilizadosde FILESTREAM quita los archivos subyacentes. Para obtener ms informacin, vea Obtener acceso a datos FILESTREAM con Transact-SQL.

    No se puede especificar la clusula FROM en una instruccin DELETE que haga referencia, directa o indirectamente, a una vista que tiene definido un desencadenadorINSTEAD OF. Para obtener ms informacin acerca de los desencadenadores INSTEAD OF, vea CREATE TRIGGER (Transact-SQL).

    Limitaciones y restricciones

    Cuando se usa TOP con DELETE, las filas a las que hace referencia no estn organizadas de ninguna manera y la clusula ORDER BY no se puede especificardirectamente en esta instruccin. Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe usar TOP junto con una clusula ORDER BY enuna instruccin de subseleccin. Vea la seccin Ejemplos que aparece ms adelante en este tema.

    TOP no se puede usar en una instruccin DELETE con vistas divididas en particiones.

    Comportamiento del bloqueo

    De forma predeterminada, una instruccin DELETE siempre adquiere un bloqueo exclusivo X en la tabla que modifica y retiene ese bloqueo hasta que se completa latransaccin. Al utilizar un bloqueo exclusivo (X), el resto de las transacciones no pueden modificar los datos; las operaciones de lectura solo se pueden realizar si seutiliza la sugerencia NOLOCK o el nivel de aislamiento de lectura no confirmada. Puede especificar sugerencias de tabla para invalidar este comportamientopredeterminado durante la ejecucin de la instruccin DELETE especificando otro mtodo de bloqueo, sin embargo se recomienda que solo los desarrolladores yadministradores de bases de datos experimentados usen las sugerencias y nicamente como ltimo recurso. Para obtener ms informacin, vea Sugerencias de tabla(Transact-SQL).

    Cuando se eliminan filas de un montn, Motor de base de datos puede usar bloqueo de filas o pginas para la operacin. Como consecuencia, las pginas que hanquedado vacas por la operacin de eliminacin permanecen asignadas al montn. Si no se cancela la asignacin de las pginas vacas, otros objetos de la base dedatos no pueden volver a utilizar el espacio asociado.

    Para eliminar las filas de un montn y cancelar la asignacin de las pginas, use uno de los mtodos siguientes.

    Especifique la sugerencia TABLOCK en la instruccin DELETE. Si se utiliza la sugerencia TABLOCK, la operacin de eliminacin aplica un bloqueo exclusivo a latabla, en lugar de un bloqueo de fila o de pgina. Esto permite cancelar la asignacin de las pginas. Para obtener ms informacin acerca de la sugerenciaTABLOCK, vea Sugerencias de tabla (Transact-SQL).

    Se debe utilizar TRUNCATE TABLE si se van a eliminar todas las filas de la tabla.

    Cree un ndice clster en el montn antes de eliminar las filas. Puede quitar el ndice clster tras eliminar las filas. Este mtodo requiere ms tiempo que losmtodos anteriores y utiliza ms recursos temporales.

    Comportamiento del registro

    La instruccin DELETE siempre est registrada totalmente.

    Seguridad

    PermisosSe requieren permisos DELETE en la tabla de destino. Tambin se requieren los permisos para utilizar SELECT si la instruccin contiene una clusula WHERE.

    Los permisos para utilizar DELETE corresponden de forma predeterminada a los miembros del rol fijo de servidor sysadmin, de los roles fijos de base de datosdb_owner y db_datawriter y al propietario de la tabla. Los miembros de los roles sysadmin, db_owner y db_securityadmin y el propietario de la tabla puedentransferir permisos a otros usuarios.

    Ejemplos

    Categora Elementos de sintaxis ofrecidos

    Sintaxis bsica DELETE

    Limitar las filas eliminadas WHERE FROM cursor

    Eliminar filas de una tabla remota Servidor vinculado funcin de conjunto de filas OPENQUERY funcin de conjunto defilas OPENDATASOURCE

    Invalidar el comportamiento predeterminado del optimizador de consultasmediante sugerencias

    Sugerencias de tabla sugerencias de consulta

  • Capturar los resultados de la instruccin DELETE Clusula OUTPUT

    Sintaxis bsicaEn los ejemplos de esta seccin se muestra la funcionalidad bsica de la instruccin DELETE usando la sintaxis mnima requerida.

    A.Utilizar DELETE sin la clusula WHEREEn el ejemplo siguiente se eliminan todas las filas de la tabla SalesPersonQuotaHistory de la base de datos AdventureWorks2012 porque no se utiliza una clusulaWHERE para limitar el nmero de filas eliminadas.

    Limitar las filas eliminadasEn los ejemplos de esta seccin se muestra cmo se limita el nmero de filas que se van a eliminar.

    A.Usar la clusula WHERE para eliminar un conjunto de filasEn el ejemplo siguiente se eliminan todas las filas de la tabla ProductCostHistory de la base de datos AdventureWorks2012 en las que el valor de la columnaStandardCost es superior a 1000.00.

    En el siguiente ejemplo se muestra una clusula WHERE ms compleja. La clusula WHERE define dos condiciones que deben cumplirse para determinar las filas que sevan a eliminar. El valor de la columna StandardCost debe estar comprendido entre 12.00 y 14.00 y el valor de la columna SellEndDate debe ser NULL. En el ejemplose imprime tambin el valor desde la funcin @@ROWCOUNT para devolver el nmero de filas eliminadas.

    B.Usar un cursor para determinar la fila que se va a eliminarEn el ejemplo siguiente se elimina una fila nica de la tabla EmployeePayHistory de la base de datos AdventureWorks2012 mediante un cursor denominado mycursor.La operacin de eliminacin solo afecta a la nica fila que se captura actualmente del cursor.

    C.Usar combinaciones y subconsultas en los datos de una tabla para eliminar filas de otra tablaEn los siguientes ejemplos se muestran dos maneras de eliminar filas de una tabla en funcin de los datos de otra tabla. En ambos ejemplos, se eliminan las filas de latabla SalesPersonQuotaHistory de la base de datos AdventureWorks2012 basndose en las ventas del ao hasta la fecha almacenadas en la tabla SalesPerson. Laprimera instruccin DELETE muestra la solucin de subconsulta compatible con ISO y la segunda instruccin DELETE muestra la extensin de FROM de TransactSQL para unir las dos tablas.

    DELETE FROM Sales.SalesPersonQuotaHistory;GO

    DELETE FROM Production.ProductCostHistoryWHERE StandardCost > 1000.00;GO

    DELETE Production.ProductCostHistoryWHERE StandardCost BETWEEN 12.00 AND 14.00 AND EndDate IS NULL;PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));

    DECLARE complex_cursor CURSOR FOR SELECT a.BusinessEntityID FROM HumanResources.EmployeePayHistory AS a WHERE RateChangeDate (SELECT MAX(RateChangeDate) FROM HumanResources.EmployeePayHistory AS b WHERE a.BusinessEntityID = b.BusinessEntityID) ;OPEN complex_cursor;FETCH FROM complex_cursor;DELETE FROM HumanResources.EmployeePayHistoryWHERE CURRENT OF complex_cursor;CLOSE complex_cursor;DEALLOCATE complex_cursor;GO

    -- SQL-2003 Standard subquery

    DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN (SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > 2500000.00);GO

    -- Transact-SQL extension

  • A.Utilizar TOP para limitar el nmero de filas eliminadasCuando se utiliza una clusula TOP n con DELETE, la operacin de eliminacin se realiza en una seleccin aleatoria de n nmero de filas. En el ejemplo siguiente seeliminan 20 filas aleatorias de la tabla PurchaseOrderDetail de la base de datos AdventureWorks2012 cuyas fechas de vencimiento sean anteriores al primero de juliode 2006.

    Si necesita utilizar TOP para eliminar filas por un orden cronolgico significativo, debe utilizarla junto con ORDER BY en una instruccin de subseleccin. La siguienteconsulta elimina de la tabla PurchaseOrderDetail las 10 filas con las fechas de vencimiento ms antiguas. Para garantizar que solo se eliminen 10 filas, la columnaespecificada en la instruccin de subseleccin PurchaseOrderID) es la clave principal de la tabla. El uso de una columna sin clave en la instruccin de subseleccinpodra causar la eliminacin de ms de 10 filas si la columna especificada contiene valores duplicados.

    Eliminar filas de una tabla remotaEn los ejemplos de esta seccin se muestra cmo se eliminan filas de una tabla remota mediante un servidor vinculado o una funcin de conjunto de filas para hacerreferencia a la tabla remota. Una tabla remota existe en un servidor o instancia diferente de SQL Server.

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    A.Eliminar datos de una tabla remota usando un servidor vinculadoEn el ejemplo siguiente se eliminan filas de una tabla remota. En el ejemplo se comienza creando un vnculo al origen de datos remoto mediante sp_addlinkedserver. Elnombre del servidor vinculado, MyLinkServer, se especifica entonces como parte del nombre de objeto de cuatro partes en el formato server.catalog.schema.object.

    B.Eliminar datos de una tabla remota con la funcin OPENQUERYEn el ejemplo siguiente se eliminan filas de una tabla remota especificando la funcin de conjunto de filas OPENQUERY. En este ejemplo se usa el nombre del servidorvinculado creado en el ejemplo anterior.

    C.Eliminar datos de una tabla remota con una funcin OPENDATASOURCEEn el ejemplo siguiente se elimina una fila de una tabla remota especificando la funcin de conjunto de filas OPENDATASOURCE. Especifique un nombre de servidorvlido para el origen de datos con el formato server_name o server_name\instance_name.

    DELETE FROM Sales.SalesPersonQuotaHistory FROM Sales.SalesPersonQuotaHistory AS spqhINNER JOIN Sales.SalesPerson AS spON spqh.BusinessEntityID = sp.BusinessEntityIDWHERE sp.SalesYTD > 2500000.00;GO

    DELETE TOP (20) FROM Purchasing.PurchaseOrderDetailWHERE DueDate < '20020701';GO

    DELETE FROM Purchasing.PurchaseOrderDetailWHERE PurchaseOrderDetailID IN (SELECT TOP 10 PurchaseOrderDetailID FROM Purchasing.PurchaseOrderDetail ORDER BY DueDate ASC);GO

    USE master;GO-- Create a link to the remote data source. -- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.

    EXEC sp_addlinkedserver @server = N'MyLinkServer', @srvproduct = N' ', @provider = N'SQLNCLI', @datasrc = N'server_name', @catalog = N'AdventureWorks2012';GO

    -- Specify the remote data source using a four-part name -- in the form linked_server.catalog.schema.object.

    DELETE MyLinkServer.AdventureWorks2012.HumanResources.Department WHERE DepartmentID > 16;GO

    DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.DepartmentWHERE DepartmentID = 18');GO

  • Capturar los resultados de la instruccin DELETEA.Usar DELETE con la clusula OUTPUTEn el ejemplo siguiente se muestra cmo se guardan los resultados de una instruccin DELETE en una variable de tabla en la base de datos AdventureWorks2012.

    B.Usar OUTPUT con en una instruccin DELETEEn el ejemplo siguiente se eliminan las filas de la tabla ProductProductPhoto de la base de datos AdventureWorks2012 segn los criterios de bsqueda definidos en laclusula FROM de la instruccin DELETE. La clusula OUTPUT devuelve columnas de la tabla que se elimina (DELETED.ProductID, DELETED.ProductPhotoID) y de la tablaProduct. Esta informacin se utiliza en la clusula FROM para especificar las filas que se deben eliminar.

    Vea tambinReferenciaCREATE TRIGGER (Transact-SQL)INSERT (Transact-SQL)SELECT (Transact-SQL)TRUNCATE TABLE (Transact-SQL)UPDATE (Transact-SQL)WITH common_table_expression (Transact-SQL)@@ROWCOUNT (Transact-SQL)

    2014 Microsoft

    DELETE FROM OPENDATASOURCE('SQLNCLI', 'Data Source= ; Integrated Security=SSPI') .AdventureWorks2012.HumanResources.Department WHERE DepartmentID = 17;'

    DELETE Sales.ShoppingCartItemOUTPUT DELETED.* WHERE ShoppingCartID = 20621;

    --Verify the rows in the table matching the WHERE clause have been deleted.SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem WHERE ShoppingCartID = 20621;GO

    DECLARE @MyTableVar table ( ProductID int NOT NULL, ProductName nvarchar(50)NOT NULL, ProductModelID int NOT NULL, PhotoID int NOT NULL);

    DELETE Production.ProductProductPhotoOUTPUT DELETED.ProductID, p.Name, p.ProductModelID, DELETED.ProductPhotoID INTO @MyTableVarFROM Production.ProductProductPhoto AS phJOIN Production.Product as p ON ph.ProductID = p.ProductID WHERE p.ProductModelID BETWEEN 120 and 130;

    --Display the results of the table variable.SELECT ProductID, ProductName, ProductModelID, PhotoID FROM @MyTableVarORDER BY ProductModelID;GO

  • FROM (Transact-SQL)

    Especifica las tablas, vistas, tablas derivadas y tablas combinadas que se utilizan en las instrucciones DELETE, SELECT y UPDATE en SQL Server 2014. En la instruccinSELECT, la clusula FROM es necesaria excepto cuando la lista de seleccin solo contiene constantes, variables y expresiones aritmticas sin nombres de columna.

    Se aplica a: SQL Server (desde SQL Server 2008 hasta la versin actual, Windows Azure SQL Database desde la versin inicial hasta la versin actual).

    Convenciones de sintaxis de Transact-SQL

    Sintaxis

    Argumentos

    Especifica el origen de una tabla, una vista, una tabla variable o una tabla derivada, con o sin alias, para utilizarlo en la instruccin TransactSQL. Se puedenutilizar hasta 256 orgenes de tabla en una instruccin, aunque el lmite vara en funcin de la memoria disponible y de la complejidad del resto de lasexpresiones de la consulta. Las consultas individuales pueden no admitir un mximo de 256 orgenes de tabla.

    Nota

    El rendimiento de las consultas se puede ver afectado si se hace referencia a un nmero elevado de tablas en ellas. El tiempo de compilacin y optimizacintambin se puede ver afectado por factores adicionales. Dichos factores pueden ser la presencia de ndices y vistas indizadas en cada y eltamao de en la instruccin SELECT.

    El orden de los orgenes de tabla despus de la palabra clave FROM no afecta al conjunto de resultados devuelto. SQL Server devuelve errores si aparecennombres duplicados en la clusula FROM.

    SQL Server 2014

    [ FROM { } [ ,...n ] ] ::= { table_or_view_name [ [ AS ] table_alias ] [ ] [ WITH ( < table_hint > [ [ , ]...n ] ) ] | rowset_function [ [ AS ] table_alias ] [ ( bulk_column_alias [ ,...n ] ) ] | user_defined_function [ [ AS ] table_alias ] ] | OPENXML | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] | | | | @variable [ [ AS ] table_alias ] | @variable.function_call ( expression [ ,...n ] ) [ [ AS ] table_alias ] [ (column_alias [ ,...n ] ) ]} ::= TABLESAMPLE [SYSTEM] ( sample_number [ PERCENT | ROWS ] ) [ REPEATABLE ( repeat_seed ) ]

    ::= { ON | CROSS JOIN | left_table_source { CROSS | OUTER } APPLY right_table_source | [ ( ] [ ) ] } ::= [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ ] ] JOIN

    ::= table_source PIVOT [ AS ] table_alias

    ::= ( aggregate_function ( value_column [ [ , ]...n ]) FOR pivot_column IN ( ) )

    ::= table_source UNPIVOT [ AS ] table_alias

    ::= ( value_column FOR pivot_column IN ( ) )

    ::= column_name [ ,...n ]

  • table_or_view_nameEs el nombre de una tabla o una vista.

    Si la tabla o la vista existen en otra base de datos de la misma instancia de SQL Server, utilice un nombre completo con el formato database.schema.object_name.

    Si la tabla o la vista existen fuera de la instancia de SQL Serverl, utilice un nombre de cuatro partes con el formato linked_server.catalog.schema.object. Paraobtener ms informacin, vea sp_addlinkedserver (Transact-SQL). El nombre de cuatro partes de la tabla o la vista creado con la funcin OPENDATASOURCEcomo la parte de servidor del nombre tambin se puede utilizar para especificar el origen de tabla remoto. Cuando se especifica OPENDATASOURCE, es posibleque database_name y schema_name no se puedan aplicar a todos los orgenes de datos y dependan de las funciones del proveedor OLE DB que tiene acceso alobjeto remoto.

    [AS] table_aliasEs un alias para table_source que se puede utilizar por comodidad o para distinguir una tabla o una vista en una autocombinacin o una subconsulta. El aliassuele ser un nombre de tabla abreviado que se utiliza para hacer referencia a columnas especficas de las tablas en una combinacin. Si el mismo nombre decolumna existe en ms de una tabla en una combinacin, SQL Server requiere que el nombre de columna sea calificado mediante un nombre de tabla, unnombre de vista o un alias. No se puede utilizar el nombre de la tabla si se ha definido un alias.

    Si se utiliza una tabla derivada, una funcin de conjuntos de filas o con valores de tabla, o una clusula de operador como PIVOT o UNPIVOT, el parmetrotable_alias requerido al final de la clusula es el nombre de tabla asociado para todas las columnas devueltas, incluidas las columnas de agrupacin.

    WITH ( )Especifica que el optimizador de consultas utiliza una estrategia de optimizacin o bloqueo con esta tabla y para esta instruccin. Para obtener ms informacin,vea Sugerencias de tabla (Transact-SQL).

    rowset_function

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Especifica una de las funciones de conjuntos de filas, como OPENROWSET, que devuelve un objeto que se puede utilizar en lugar de una referencia de tabla.Para obtener ms informacin acerca de la lista de funciones de conjuntos de filas, vea Funciones de conjuntos de filas (Transact-SQL).

    El uso de las funciones OPENROWSET y OPENQUERY para especificar que un objeto remoto depende de las capacidades del proveedor OLE DB que tieneacceso al objeto.

    bulk_column_alias

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Es un alias opcional para sustituir el nombre de una columna en el conjunto de resultados. Los alias de columna se permiten solo en las instrucciones SELECTque utilizan la funcin OPENROWSET con la opcin BULK. Si utiliza bulk_column_alias, especifique un alias para cada columna de tabla en el mismo orden que lascolumnas del archivo.

    Nota

    Este alias invalida al atributo NAME de los elementos COLUMN de un archivo de formato XML si est presente.

    user_defined_functionEspecifica una funcin con valores de tabla.

    OPENXML

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Proporciona una vista de un conjunto de filas en un documento XML. Para obtener ms informacin, vea OPENXML (Transact-SQL).

    derived_tableEs una subconsulta que recupera filas de la base de datos. derived_table se utiliza como entrada a la consulta externa.

    derived _table puede utilizar la caracterstica de constructor de valores de TransactSQL para especificar varias filas. Por ejemplo, SELECT * FROM (VALUES (1,2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);. Para obtener ms informacin, vea Constructor con valores de tabla (Transact-SQL).

    column_aliasEs un alias opcional para sustituir el nombre de una columna en el conjunto de resultados de la tabla derivada. Incluya un alias de columna para cada columnade la lista de seleccin y delimite la lista de alias de columna con parntesis.

    Especifica que se devuelva un ejemplo de los datos de la tabla. El ejemplo puede ser aproximado. Esta clusula se puede utilizar en cualquier tabla principal ocombinada de una instruccin SELECT, UPDATE o DELETE. TABLESAMPLE no se puede especificar con vistas.

    Nota

    Cuando se utiliza TABLESAMPLE en bases de datos que se actualizan a SQL Server, el nivel de compatibilidad de la base de datos se establece en 110 osuperior y no se permite PIVOT en una consulta de expresin de tabla comn CTE recursiva. Para obtener ms informacin, vea Nivel de compatibilidad deALTER DATABASE (Transact-SQL).

    SYSTEMSe trata de un mtodo de muestreo dependiente de la implementacin especificado por los estndares ISO. En SQL Server, es el nico mtodo de muestreodisponible y se aplica de forma predeterminada. SYSTEM aplica un mtodo de muestreo basado en pginas en el que se elige un conjunto de pginas aleatoriode la tabla para el ejemplo y todas las filas de dichas pginas se devuelven como el subconjunto de ejemplo.

    sample_numberEs una expresin numrica constante exacta o aproximada que representa el porcentaje o el nmero de filas. Si se especifica con PERCENT, sample_number seconvierte implcitamente a un valor float; en caso contrario, se convierte en bigint. PERCENT es el valor predeterminado.

    PERCENTEspecifica que se debe recuperar de la tabla el porcentaje sample_number de filas de la tabla. Si se especifica PERCENT, SQL Server devuelve un valoraproximado del porcentaje especificado. Si se especifica PERCENT, la expresin sample_number debe dar como resultado un valor comprendido entre 0 y 100.

    ROWS

  • Especifica que se recupere aproximadamente el nmero sample_number de filas. Si se especifica ROWS, SQL Server devuelve una aproximacin del nmero defilas especificado. Si se especifica ROWS, la expresin sample_number debe ser un valor entero mayor que cero.

    REPEATABLEIndica que el ejemplo seleccionado se puede devolver de nuevo. Si se especifica con el mismo valor de repeat_seed , SQL Server devuelve el mismo subconjuntode filas siempre que no se hayan realizado cambios en las filas de la tabla. Si se especifica con otro valor de repeat_seed, es probable que SQL Server devuelvaun muestra distinto de filas de la tabla. Se consideran cambios en la tabla las siguientes acciones: insertar, actualizar, eliminar, volver a generar o desfragmentarndices, y restaurar o adjuntar bases de datos.

    repeat_seedEs una expresin de tipo entero constante utilizada por SQL Server para generar un nmero aleatorio. repeat_seed es de tipo bigint. Si no se especificarepeat_seed, SQL Server asigna un valor de forma aleatoria. Para un valor repeat_seed especfico, el resultado del muestreo es siempre el mismo si no ha aplicadoningn cambio a la tabla. La expresin repeat_seed debe ser un entero mayor que cero.

    Es un conjunto de resultados producto de dos o ms tablas. Para varias combinaciones, utilice parntesis para cambiar el orden natural de las combinaciones.

    Especifica el tipo de operacin de combinacin.

    INNEREspecifica que se devuelvan todos los pares de filas coincidentes. Rechaza las filas no coincidentes de las dos tablas. Si no se especifica ningn tipo decombinacin, ste es el valor predeterminado.

    FULL [ OUTER ]Especifica que una fila de la tabla de la derecha o de la izquierda, que no cumpla la condicin de combinacin, se incluya en el conjunto de resultados y que lascolumnas que correspondan a la otra tabla se establezcan en NULL. De esta forma se agregan ms filas a las que se suelen devolver con INNER JOIN.

    LEFT [ OUTER ]Especifica que todas las filas de la tabla izquierda que no cumplan la condicin de combinacin se incluyan en el conjunto de resultados, con las columnas deresultados de la otra tabla establecidas en NULL, adems de todas las filas devueltas por la combinacin interna.

    RIGHT [OUTER]Especifica que todas las filas de la tabla derecha que no cumplan la condicin de combinacin se incluyan en el conjunto de resultados, con las columnas deresultados de la otra tabla establecidas en NULL, adems de todas las filas devueltas por la combinacin interna.

    Especifica que el optimizador de consultas de SQL Server debe utilizar una sugerencia de combinacin o un algoritmo de ejecucin por cada combinacinespecificada en la clusula FROM de la consulta. Para obtener ms informacin, vea Sugerencias de combinacin TransactSQL.

    JOINIndica que se va a ejecutar la operacin de combinacin especificada entre los orgenes de tabla o vistas indicados.

    ON Especifica la condicin en la que se basa la combinacin. La condicin puede especificar cualquier predicado, aunque se suelen utilizar columnas y operadoresde comparacin; por ejemplo:

    Cuando la condicin especifique columnas, no ser necesario que tengan el mismo nombre o el mismo tipo de datos; sin embargo, si los tipos de datos no sonidnticos, deben ser compatibles o tratarse de tipos que SQL Server pueda convertir implcitamente. Si los tipos de datos no se pueden convertir implcitamente,la condicin debe convertir de forma explcita el tipo de datos mediante la funcin CONVERT.

    Puede haber predicados relacionados solamente con una de las tablas combinadas de la clusula ON. Estos predicados tambin pueden estar en la clusulaWHERE de la consulta. Aunque la posicin de estos predicados no produce ninguna diferencia en el caso de combinaciones INNER, podra generar un resultadodiferente si estuvieran implicadas las combinaciones OUTER. La razn es que los predicados de la clusula ON se aplican a la tabla antes de la combinacin,mientras la clusula WHERE se aplica de forma semntica al resultado de la combinacin.

    Para obtener ms informacin acerca de los predicados y las condiciones de bsqueda, vea Condiciones de bsqueda TransactSQL.

    CROSS JOINEspecifica el producto resultante de dos tablas. Devuelve las mismas filas que se devolveran si no se especificara la clusula WHERE en una combinacin deestilo antiguo distinta del estilo de SQL-92.

    left_table_source{ CROSS | OUTER } APPLY right_table_sourceEspecifica que el argumento right_table_source del operador APPLY se evale con respecto a cada fila de left_table_source. Esta funcionalidad es til siright_table_source contiene una funcin con valores de tabla que toma los valores de columna de left_table_source como uno de sus argumentos.

    Se debe especificar OUTER o CROSS con APPLY. Si se especifica CROSS, no se genera ninguna fila cuando right_table_source se evala con respecto a una filaespecificada de left_table_source y se devuelve un conjunto de resultados vaco.

    Si se especifica OUTER, se genera una fila para cada fila de left_table_source, incluso si right_table_source se evala con respecto a dicha fila y devuelve unconjunto de resultados vaco.

    Para obtener ms informacin, vea la seccin Comentarios.

    left_table_sourceEs un origen de tabla segn se ha definido en el argumento anterior. Para obtener ms informacin, vea la seccin Comentarios.

    right_table_sourceEs un origen de tabla segn se ha definido en el argumento anterior. Para obtener ms informacin, vea la seccin Comentarios.

    SELECT p.ProductID, v.BusinessEntityIDFROM Production.Product AS p JOIN Purchasing.ProductVendor AS vON (p.ProductID = v.ProductID);

  • table_source PIVOT Especifica que table_source se dinamiza segn pivot_column. table_source es una tabla o expresin de tabla. La salida es una tabla que contiene todas lascolumnas de table_source, excepto pivot_column y value_column. Las columnas de table_source, excepto pivot_column y value_column, se denominan columnas deagrupamiento del operador dinmico.

    PIVOT realiza una operacin de agrupamiento en la tabla de entrada con respecto a las columnas de agrupamiento y devuelve una fila para cada grupo.Adems, el resultado contiene una columna para cada valor especificado en column_list que aparece en el parmetro pivot_column de input_table.

    Para obtener ms informacin, vea la seccin Comentarios a continuacin.

    aggregate_functionEs una funcin de agregado del sistema o definida por el usuario que acepta una o ms entradas. La funcin de agregado no puede variar con respecto a losvalores NULL. Una funcin de agregado invariable con respecto a los valores NULL no tiene en cuenta los valores NULL del grupo mientras evala el valor delagregado.

    No se permite la funcin de agregado del sistema COUNT*.

    value_columnEs la columna de valores del operador PIVOT. Si se utiliza con UNPIVOT, value_column no puede ser el nombre de una columna existente en el parmetrotable_source de entrada.

    FOR pivot_columnEs la columna dinmica del operador PIVOT. pivot_column debe ser de un tipo que se pueda convertir implcita o explcitamente a nvarchar(). Esta columna nopuede ser image o rowversion.

    Si se utiliza UNPIVOT, pivot_column es el nombre de la columna de salida restringida a partir de table_source. No puede haber ninguna columna en table_sourcecon ese nombre.

    IN (column_list )En la clusula PIVOT, se incluyen los valores de pivot_column que se van a convertir en los nombres de columnas de la tabla de salida. La lista no puedeespecificar ningn nombre de columna que ya exista en el parmetro table_source de entrada que se est dinamizando.

    En la clusula UNPIVOT, se incluyen las columnas de table_source que se va a restringir en una sola pivot_column.

    table_aliasEs el nombre de alias de la tabla de salida. pivot_table_alias debe especificarse.

    UNPIVOT < unpivot_clause >Especifica que la tabla de entrada se restringe a partir de varias columnas de column_list en una sola columna denominada pivot_column.

    Comentarios

    La clusula FROM admite la sintaxis SQL92SQL para las tablas combinadas y las tablas derivadas. La sintaxis SQL92 proporciona los operadores de combinacinINNER, LEFT OUTER, RIGHT OUTER, FULL OUTER y CROSS.

    En las vistas, tablas derivadas y subconsultas se admiten las operaciones UNION y JOIN dentro de una clusula FROM.

    Una autocombinacin es una tabla que se combina consigo misma. Las inserciones o actualizaciones basadas en una autocombinacin siguen el orden de la clusulaFROM.

    Puesto que SQL Server considera las estadsticas de cardinalidad y distribucin de servidores vinculados que proporcionan estadsticas de distribucin de columnas, noes necesaria la sugerencia de combinacin REMOTE para exigir la evaluacin de una combinacin de forma remota. El procesador de consultas de SQL Serverconsidera las estadsticas remotas y determina si es apropiada una estrategia de combinacin remota. La sugerencia de combinacin REMOTE es til para losproveedores que no proporcionan estadsticas de distribucin de columnas.

    Usar APPLYLos operandos izquierdo y derecho del operador APPLY son expresiones de tabla. La diferencia principal entre estos operandos es que right_table_source puede utilizaruna funcin con valores de tabla que tome una columna de left_table_source como uno de los argumentos de la funcin. left_table_source puede incluir funciones convalores de tabla, pero no puede contener argumentos que sean columnas de right_table_source.

    El operador APPLY funciona del siguiente modo para generar el origen de tabla para la clusula FROM:

    1. Evala right_table_source con respecto a cada fila de left_table_source para generar conjuntos de filas.

    Los valores en right_table_source dependen de left_table_source. right_table_source se pueden representar aproximadamente de esta manera:TVF(left_table_source.row), donde TVF es una funcin con valores de tabla.

    2. Combina los conjuntos de resultados generados para cada fila en la evaluacin de right_table_source con left_table_source, mediante una operacin UNION ALL.

    La lista de columnas que genera el resultado del operador APPLY es el conjunto de columnas de left_table_source combinado con la lista de columnas deright_table_source.

    Usar PIVOT y UNPIVOTpivot_column y value_column son columnas de agrupamiento utilizadas por el operador PIVOT. Para obtener el conjunto de resultados de salida, PIVOT aplica elsiguiente proceso:

    1. Realiza una operacin GROUP BY en input_table para las columnas de agrupamiento y genera una fila de resultados para cada grupo.

    Las columnas de agrupamiento de la fila de salida obtienen los valores de columna correspondientes para dicho grupo en input_table.

    2. Genera valores para las columnas de la lista de columnas para cada fila de resultados mediante las siguientes operaciones:

  • a. Agrupacin adicional de las filas generadas en GROUP BY en el paso anterior para pivot_column.

    Para cada columna de salida de column_list, se selecciona un subgrupo que cumple la condicin:

    pivot_column = CONVERT(, 'output_column')

    b. aggregate_function se evala con respecto a value_column en este subgrupo y su resultado se devuelve como un valor de output_column correspondiente.Si el subgrupo est vaco, SQL Server genera un valor NULL para output_column. Si la funcin de agregado es COUNT y el subgrupo est vaco, sedevuelve cero (0).

    Permisos

    Requiere los permisos para la instruccin DELETE, SELECT o UPDATE.

    Ejemplos

    A.Usar una clusula FROM sencillaEn el siguiente ejemplo se recuperan las columnas TerritoryID y Name de la tabla SalesTerritory de la base de datos de ejemplo AdventureWorks2012.

    El conjunto de resultados es el siguiente.

    B.Usar las sugerencias del optimizador TABLOCK y HOLDLOCKEn la siguiente transaccin parcial se muestra cmo colocar un bloqueo explcito de tabla compartida en Employee y cmo leer el ndice. El bloqueo se mantienedurante toda la transaccin.

    C.Usar la sintaxis CROSS JOIN de SQL-92Este ejemplo devuelve el producto resultante de las tablas Employee y Department de la base de datos AdventureWorks2012. Se devuelve la lista de todas lascombinaciones posibles de las filas de BusinessEntityID y todas las filas con el nombre Department .

    D.Usar la sintaxis FULL OUTER JOIN de SQL-92En el siguiente ejemplo se devuelve el nombre del producto y los pedidos de venta correspondientes de la tabla SalesOrderDetail de la base de datosAdventureWorks2012. Adems, se devuelven todos los pedidos de venta que no incluyen ningn producto en la tabla Product y todos los productos con un pedido deventa distinto del especificado en la tabla Product.

    SELECT TerritoryID, NameFROM Sales.SalesTerritoryORDER BY TerritoryID ;

    TerritoryID Name ----------- ------------------------------1 Northwest 2 Northeast 3 Central 4 Southwest 5 Southeast 6 Canada 7 France 8 Germany 9 Australia 10 United Kingdom (10 row(s) affected)

    BEGIN TRANSELECT COUNT(*) FROM HumanResources.Employee WITH (TABLOCK, HOLDLOCK) ;

    SELECT e.BusinessEntityID, d.Name AS DepartmentFROM HumanResources.Employee AS eCROSS JOIN HumanResources.Department AS dORDER BY e.BusinessEntityID, d.Name ;

    -- The OUTER keyword following the FULL keyword is optional.SELECT p.Name, sod.SalesOrderIDFROM Production.Product AS p

    Transact-SQL

    Transact-SQL

    Transact-SQL

  • E.Usar la sintaxis LEFT FULL OUTER de SQL-92Este ejemplo combina dos tablas en ProductID y mantiene las filas no coincidentes de la tabla izquierda. La tabla Product coincide con la tabla SalesOrderDetail enlas columnas ProductID de cada tabla. Todos los productos, ordenados y no ordenados, aparecen en el conjunto de resultados.

    F.Usar la sintaxis INNER JOIN de SQL-92En el siguiente ejemplo se devuelven todos los nombres de productos e identificadores de pedidos de venta.

    G.Usar la sintaxis RIGHT OUTER JOIN de SQL-92Este ejemplo combina dos tablas en TerritoryID y mantiene las filas no coincidentes de la tabla derecha. La tabla SalesTerritory coincide con la tabla SalesPersonen la columna TerritoryID de cada tabla. Todos los vendedores aparecen en el conjunto de resultados con independencia de que tengan un territorio asignado.

    H.Usar las sugerencias de combinacin HASH y MERGEEn el siguiente ejemplo se realiza una combinacin de tres tablas entre las tablas Product, ProductVendor y Vendor para generar una lista de productos y susproveedores. El optimizador de consultas combina Product y ProductVendor (p y pv mediante una combinacin MERGE. A continuacin, los resultados de lacombinacin MERGE de Product y ProductVendor (p y pv) se combinan mediante HASH con la tabla Vendor para generar (p y pv) y v.

    Importante

    Despus de especificar una sugerencia de combinacin, la palabra clave INNER ya no es opcional y se tiene que incluir explcitamente para hacer combinacionesINNER JOIN.

    I.Usar una tabla derivadaEn el siguiente ejemplo se utiliza una tabla derivada y una instruccin SELECT despus de la clusula FROM para devolver los nombres y apellidos de todos losempleados y las ciudades en que residen.

    FULL OUTER JOIN Sales.SalesOrderDetail AS sodON p.ProductID = sod.ProductIDWHERE p.ProductID IS NULL OR sod.ProductID IS NULLORDER BY p.Name ;

    SELECT p.Name, sod.SalesOrderIDFROM Production.Product AS pLEFT OUTER JOIN Sales.SalesOrderDetail AS sodON p.ProductID = sod.ProductIDORDER BY p.Name ;

    -- By default, SQL Server performs an INNER JOIN if only the JOIN -- keyword is specified.SELECT p.Name, sod.SalesOrderIDFROM Production.Product AS pINNER JOIN Sales.SalesOrderDetail AS sodON p.ProductID = sod.ProductIDORDER BY p.Name ;

    SELECT st.Name AS Territory, sp.BusinessEntityIDFROM Sales.SalesTerritory AS st RIGHT OUTER JOIN Sales.SalesPerson AS spON st.TerritoryID = sp.TerritoryID ;

    SELECT p.Name AS ProductName, v.Name AS VendorNameFROM Production.Product AS p INNER MERGE JOIN Purchasing.ProductVendor AS pv ON p.ProductID = pv.ProductIDINNER HASH JOIN Purchasing.Vendor AS vON pv.BusinessEntityID = v.BusinessEntityIDORDER BY p.Name, v.Name ;

    SELECT RTRIM(p.FirstName) + ' ' + LTRIM(p.LastName) AS Name, d.CityFROM Person.Person AS pINNER JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID INNER JOIN (SELECT bea.BusinessEntityID, a.City FROM Person.Address AS a INNER JOIN Person.BusinessEntityAddress AS bea ON a.AddressID = bea.AddressID) AS dON p.BusinessEntityID = d.BusinessEntityIDORDER BY p.LastName, p.FirstName;

    Transact-SQL

    Transact-SQL

    Transact-SQL

    Transact-SQL

    Transact-SQL

  • J.Usar TABLESAMPLE para leer datos de un ejemplo de filas de una tablaEn el siguiente ejemplo se utiliza TABLESAMPLE en la clusula FROM para devolver aproximadamente el 10 por ciento de todas las filas de la tabla Customer.

    K.Usar APPLYEn el siguiente ejemplo se da por supuesto que las siguientes tablas con el esquema que se indica existen en la base de datos:

    Departments: DeptID, DivisionID, DeptName, DeptMgrID

    EmpMgr: MgrID, EmpID

    Employees: EmpID, EmpLastName, EmpFirstName, EmpSalary

    Se incluye adems una funcin con valores de tabla, GetReports(MgrID), que devuelve la lista de todos los empleados (EmpID, EmpLastName, EmpSalary) quedependen directa o indirectamente del MgrID especificado.

    En el ejemplo se utiliza APPLY para devolver todos los departamentos y todos los empleados de cada departamento. Si un departamento concreto no tiene ningnempleado, no se devuelve ninguna fila para dicho departamento.

    Si desea que la consulta genere filas para los departamentos sin empleados, lo que genera valores NULL para las columnas EmpID, EmpLastName y EmpSalary, utiliceOUTER APPLY.

    L.Usar PIVOT y UNPIVOTEn el siguiente ejemplo se devuelve el nmero de pedidos de compra realizados por los empleados con los identificadores 164, 198, 223, 231 y 233, clasificados encategoras por identificador de proveedor.

    A continuacin se muestra un conjunto de resultados parcial:

    VendorID Emp1 Emp2 Emp3 Emp4 Emp5

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

    1 4 3 5 4 4

    2 4 1 5 5 5

    3 4 3 5 4 4

    4 4 2 5 5 4

    5 5 1 5 5 5

    Para anular la dinamizacin de la tabla, debe dar por supuesto que el conjunto de resultados generado en el ejemplo anterior se almacena como pvt. La consulta serala siguiente.

    SELECT *FROM Sales.Customer TABLESAMPLE SYSTEM (10 PERCENT) ;

    SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalaryFROM Departments d CROSS APPLY dbo.GetReports(d.DeptMgrID) ;

    SELECT DeptID, DeptName, DeptMgrID, EmpID, EmpLastName, EmpSalaryFROM Departments d OUTER APPLY dbo.GetReports(d.DeptMgrID) ;

    SELECT VendorID, [250] AS Emp1, [251] AS Emp2, [256] AS Emp3, [257] AS Emp4, [260] AS Emp5FROM (SELECT PurchaseOrderID, EmployeeID, VendorIDFROM Purchasing.PurchaseOrderHeader) AS pPIVOT(COUNT (PurchaseOrderID)FOR EmployeeID IN( [250], [251], [256], [257], [260] )) AS pvtORDER BY VendorID;

    --Create the table and insert values as portrayed in the previous example.CREATE TABLE dbo.pvt (VendorID int, Emp1 int, Emp2 int,Emp3 int, Emp4 int, Emp5 int);GOINSERT INTO dbo.pvt VALUES

    Transact-SQL

    Transact-SQL

    Transact-SQL

  • A continuacin se muestra un conjunto de resultados parcial:

    VendorID Employee Orders

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

    1 Emp1 4

    1 Emp2 3

    1 Emp3 5

    1 Emp4 4

    1 Emp5 4

    2 Emp1 4

    2 Emp2 1

    2 Emp3 5

    2 Emp4 5

    2 Emp5 5

    M.Usar CROSS APPLYEn el ejemplo siguiente se recupera una instantnea de todos los planes de consulta que residen en la memoria cach del plan mediante una consulta a la vista deadministracin dinmica sys.dm_exec_cached_plans para recuperar los identificadores de todos los planes de consulta almacenados en la memoria cach. Acontinuacin se especifica el operador CROSS APPLY para pasar los identificadores del plan a sys.dm_exec_query_plan. La salida del plan de presentacin XML detodos los planes almacenados actualmente en la cach del plan se muestra en la columna query_plan de la tabla devuelta.

    Vea tambinReferenciaCONTAINSTABLE (Transact-SQL)DELETE (Transact-SQL)FREETEXTTABLE (Transact-SQL)INSERT (Transact-SQL)OPENQUERY (Transact-SQL)OPENROWSET (Transact-SQL)Operadores (Transact-SQL)UPDATE (Transact-SQL)WHERE (Transact-SQL)

    2014 Microsoft

    (1,4,3,5,4,4),(2,4,1,5,5,5),(3,4,3,5,4,4),(4,4,2,5,5,4),(5,5,1,5,5,5);GO--Unpivot the table.SELECT VendorID, Employee, OrdersFROM (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM dbo.pvt) AS pUNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5))AS unpvtGO

    USE master;GOSELECT dbid, object_id, query_plan FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle); GO

  • Sugerencias (Transact-SQL)

    Las sugerencias son opciones o estrategias especificadas para que el procesador de consultas de SQL Server las aplique en instrucciones SELECT, INSERT, UPDATE oDELETE. Las sugerencias reemplazan a cualquier plan de ejecucin que pueda seleccionar el optimizador de consultas para una consulta.

    Advertencia

    Puesto que el optimizador de consultas de SQL Server selecciona normalmente el mejor plan de ejecucin para una consulta, se recomienda que las sugerencias, y solamente se utilicen como ltimo recurso y por parte de programadores y administradores de bases de datosexperimentados.

    En esta seccin se describen las sugerencias siguientes:

    Sugerencia de combinacin

    Sugerencia de consulta

    Sugerencia de tabla

    2014 Microsoft

    SQL Server 2014

  • INSERT (Transact-SQL)

    Agrega una o varias filas a una tabla o una vista en SQL Server. Para obtener ejemplos, vea Ejemplos.

    Se aplica a: SQL Server (SQL Server 2008 a versin actual, Windows Azure SQL Database Versin inicial a versin actual).

    Convenciones de sintaxis de Transact-SQL

    Sintaxis

    SQL Server 2014

    [ WITH [ ,...n ] ]INSERT { [ TOP ( expression ) [ PERCENT ] ] [ INTO ] { | rowset_function_limited [ WITH ( [ ...n ] ) ] } { [ ( column_list ) ] [ ] { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] | derived_table | execute_statement | | DEFAULT VALUES } }}[;]

    ::={ [ server_name . database_name . schema_name . | database_name .[ schema_name ] . | schema_name . ] table_or_view_name}

    ::= SELECT FROM ( ) [AS] table_alias [ ( column_alias [ ,...n ] ) ] [ WHERE ] [ OPTION ( [ ,...n ] ) ]

    -- External tool only syntaxINSERT { [BULK] [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] ( ) [ WITH ( [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] FIRE_TRIGGERS ] [ [ , ] KEEP_NULLS ] [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] [ [ , ] ROWS_PER_BATCH = rows_per_batch ] [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] [ [ , ] TABLOCK ] ) ]}

    [; ] ::= column_name [ COLLATE collation_name ] [ NULL | NOT NULL ]

    ::= [ type_schema_name . ] type_name [ ( precision [ , scale ] | max ]

  • Argumentos

    WITH Especifica el conjunto de resultados con nombre temporal, denominado tambin expresin de tabla comn, definido en el mbito de la instruccin INSERT. Elconjunto de resultados se deriva de una instruccin SELECT. Para obtener ms informacin, vea WITH common_table_expression (Transact-SQL).

    TOP (expression) [ PERCENT ]Especifica el nmero o el porcentaje de filas aleatorias que se van a insertar. expression puede ser un nmero o un porcentaje de las filas. Para obtener msinformacin, vea TOP (Transact-SQL).

    INTOEs una palabra clave opcional que se puede utilizar entre INSERT y la tabla de destino.

    server_name

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Es el nombre del servidor vinculado en el que se encuentra la tabla o la vista. server_name puede especificarse como un nombre de servidor vinculado o usandola funcin OPENDATASOURCE.

    Cuando server_name se especifica como un servidor vinculado, se requieren database_name y schema_name. Cuando server_name se especifica conOPENDATASOURCE, database_name y schema_name pueden no aplicarse a todos los orgenes de datos y estar sujetos a las capacidades del proveedor OLE DBque tiene acceso al objeto remoto.

    database_name

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Es el nombre de la base de datos.

    schema_nameEs el nombre del esquema al que pertenece la tabla o la vista.

    table_or view_nameEs el nombre de la tabla o la vista que va a recibir los datos.

    Se puede utilizar una variable de tabla, en su mbito, como origen de tabla en una instruccin INSERT.

    La vista a la que hace referencia table_or_view_name debe poder actualizarse y debe hacer referencia exactamente a una tabla base en la clusula FROM de lavista. Por ejemplo, la instruccin INSERT de una vista de varias tablas debe utilizar una column_list que solamente haga referencia a columnas de una tabla base.Para obtener ms informacin acerca de las vistas que se pueden actualizar, vea CREATE VIEW (Transact-SQL).

    rowset_function_limited

    Se aplica a: SQL Server 2008 a SQL Server 2014.

    Especifica la funcin OPENQUERY u OPENROWSET. El uso de estas funciones est sujeto a las capacidades del proveedor OLE DB que tiene acceso al objetoremoto.

    WITH ( [... n ] )Especifica una o varias sugerencias de tabla que estn permitidas en una tabla de destino. La palabra clave WITH y los parntesis son obligatorios.

    No se permiten READPAST, NOLOCK ni READUNCOMMITTED. Para obtener ms informacin acerca de las sugerencias de tabla, vea Sugerencias de tabla(Transact-SQL).

    Importante

    La posibilidad de especificar las sugerencias HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD o UPDLOCK en tablas que son destinos deinstrucciones INSERT se quitar en una versin futura de SQL Server. Estas sugerencias no influyen en el rendimiento de las instrucciones INSERT. Evite el usode dichas sugerencias en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que las utilizan actualmente.

    Especificar la sugerencia TABLOCK en una tabla que es el destino de una instruccin INSERT tiene el mismo efecto que especificar la sugerencia TABLOCKX. Serealiza un bloqueo exclusivo en la tabla.

    (column_list)Es una lista de una o ms columnas donde se van a insertar los datos. column_list se debe incluir entre parntesis y delimitar con comas.

    Si la columna no se incluye en column_list, Motor de base de datos debe ser capaz de proporcionar un valor basado en la definicin de la columna; de locontrario, no se puede cargar la fila. Motor de base de datos proporciona automticamente un valor para la columna si esta:

    Tiene una propiedad IDENTITY. Se usa el valor de identidad incremental siguiente.

    Tiene un valor predeterminado. Se usa el valor predeterminado de la columna.

    Tiene un tipo de datos timestamp. Se utiliza el valor actual de marca de tiempo.

    Admite valores NULL. Se usa un valor NULL.

    Es una columna calculada. Se utiliza el valor calculado.

    Se debe usar column_list al insertar valores explcitos en una columna de identidad. La opcin SET IDENTITY_INSERT debe ser ON para la tabla.

    Clusula OUTPUTDevuelve las filas insertadas como parte de la operacin de insercin. Los resultados se pueden devolver a la aplicacin de procesamiento o insertarse en unatabla o variable de tabla para su nuevo procesamiento.

  • La clusula OUTPUT no se admite en las instrucciones DML que hacen referencia a vistas locales con particiones, vistas distribuidas con particiones, tablasremotas o instrucciones INSERT que contengan una execute_statement. La clusula OUTPUT INTO no se admite en instrucciones INSERT que contengan unaclusula .

    VALUESPresenta la lista o listas de valores de datos que se van a insertar. Debe haber un valor de datos por cada columna en column_list, si se especifica, o en la tabla.La lista de valores debe ir entre parntesis.

    Si los valores de la lista Value no estn en el mismo orden que las columnas de la tabla o no contienen un valor para cada columna de la tabla, se debe usarcolumn_list para especificar de forma explcita la columna que almacenar cada valor de entrada.

    Puede utilizar el constructor de filas de TransactSQL que tambin se denomina constructor con valores de tabla para especificar varias filas en una nicainstruccin INSERT. El constructor de filas se compone de una nica clusula VALUES con varias listas de valores escritos entre parntesis y separados por unacoma. Para obtener ms informacin, vea Constructor con valores de tabla (Transact-SQL).

    DEFAULTHace que Motor de base de datos cargue el valor predeterminado definido para una columna. Si no existe ningn valor predeterminado para la columna y estaadmite valores NULL, se inserta NULL. Para una columna definida con el tipo de datos timestamp, se inserta el siguiente valor de marca de tiempo. DEFAULT noes un valor vlido para una columna de identidad.

    expressionEs una constante, variable o expresin. La expresin no puede contener una instruccin EXECUTE.

    Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe agregarse como prefijo la letra mayscula 'N' a 'expression'.Si no se especifica 'N', SQL Server convierte la cadena en la pgina de cdigos correspondiente a la intercalacin predeterminada de la base de datos o lacolumna. Los caracteres que no se encuentren en esta pgina de cdigos se perdern.

    derived_tableEs cualquier instruccin SELECT vlida que devuelva filas con los datos que se van a cargar en la tabla. La instruccin SELECT no puede contener una expresinde tabla comn CTE.

    execute_statementEs cualquier instruccin EXECUTE vlida que devuelva datos con instrucciones SELECT o READTEXT. Para obtener ms informacin, vea EXECUTE (Transact-SQL).

    Las opciones de RESULT SETS de la instruccin EXECUTE no se pueden especificar en una instruccin INSERTEXEC.

    Si se usa execute_statement con INSERT, cada conjunto de resultados debe ser compatible con las columnas de la tabla o de column_list.

    execute_statement se puede utilizar para ejecutar procedimientos almacenados en el mismo servidor o en un servidor remoto. Se ejecuta el procedimiento en elservidor remoto, se devuelven los conjuntos de resultados al servidor local y se cargan en la tabla del servidor local. En una transaccin distribuida,execute_statement no se puede emitir en un servidor vinculado de bucle invertido cuando la conexin tiene varios conjuntos de resultados activos mltiples(MARS) habilitados.

    If execute_statement devuelve datos con la instruccin READTEXT, cada instruccin READTEXT puede devolver un mximo de 1 MB 1024 KB de datos.execute_statement tambin se puede usar con procedimientos extendidos. execute_statement inserta los datos devueltos por el subproceso principal delprocedimiento extendido; no obstante, los resultados de los subprocesos distintos del subproceso principal no se insertan.

    No puede especificar un parmetro con valores de tabla como el destino de una instruccin INSERT EXEC; sin embargo, se puede especificar como un origen enla cadena o procedimiento almacenado INSERT EXEC. Para obtener ms informacin, vea Usar parmetros con valores de tabla motor de base de datos.

    Especifica que las filas insertadas en la tabla de destino son las que ha devuelto la clusula OUTPUT de una instruccin INSERT, UPDATE, DELETE o MERGE,filtradas opcionalmente por una clusula WHERE. Si se especifica , el destino de la instruccin INSERT externa debe cumplir las restriccionessiguientes:

    Debe ser una tabla base, no una vista.

    No puede ser una tabla remota.

    No puede tener definido ningn desencadenador.

    No puede participar en ninguna relacin clave principalclave externa.

    No puede participar en la replicacin de mezcla ni en las suscripciones actualizables para la replicacin transaccional.

    El nivel de compatibilidad de la base de datos debe estar establecido en 100 o superior. Para obtener ms informacin, vea OUTPUT clusula de TransactSQL.

    Es una lista separada por comas que especifica las columnas devueltas por la clusula OUTPUT que se tienen que insertar. Las columnas de debenser compatibles con las columnas en las que se insertan los valores. no puede hacer referencia a funciones de agregado ni a TEXTPTR.

    Nota

    Las variables enumeradas en la lista SELECT hacen referencia a sus valores originales, sin tener en cuenta los cambios realizados en ellos en.

    Es una instruccin INSERT, UPDATE, DELETE o MERGE vlida que devuelve las filas afectadas en una clusula OUTPUT. La instruccin no puede contener unaclusula WITH y no puede tener como destino tablas remotas o vistas con particiones. Si se especifica UPDATE o DELETE, no puede ser una instruccin UPDATE oDELETE