2009-08-06 14 views
29

Duplicar posible:
Hidden Features of SQL Servercaracterísticas de SQL Server/comandos que la mayoría de los desarrolladores son conscientes de

He trabajado como desarrollador de .NET desde hace un tiempo, pero sobre todo contra un servidor SQL Server base de datos desde hace poco más de 3 años. Siento que tengo una comprensión bastante decente de SQL Server desde el punto de vista del desarrollo, pero me avergüenza admitir que acabo de enterarme hoy sobre "WITH TIES" de esta respuesta: Top 5 with most friends.

Es humillante ver preguntas y respuestas como esta en SO porque me ayuda a darme cuenta de que realmente no sé tanto como creo que lo hago y me ayuda a reactivar mi deseo de aprender más, así que pensé mejor manera que pedir a las masas de expertos que ingresen otros comandos/funciones útiles.

¿Cuál es la característica/comando más útil que el desarrollador promedio probablemente desconoce?

BTW - si es como era y no sabe para qué sirve "WITH TIES", aquí hay una buena explicación. Verás rápidamente por qué estaba avergonzado de no haberlo sabido. Sin embargo, pude ver dónde podría ser útil. - http://harriyott.com/2007/06/with-ties-sql-server-tip.aspx

Me doy cuenta de que esta es una pregunta subjetiva, así que por favor espere al menos algunas respuestas antes de cerrarla. :) Intentaré editar mi pregunta para mantener una lista con tu respuesta. Gracias

[EDIT] - Aquí hay un resumen de las respuestas Desplácese hacia abajo para obtener más información. Gracias otra vez chicos/chicas.

  • MERGE - Un único comando para INSERTAR/ACTUALIZAR/ELIMINAR en una tabla desde una fuente de fila. característica
  • FILESTREAM de SQL Server 2008 permite el almacenamiento y el acceso eficiente a los datos BLOB utilizando una combinación de SQL Server 2008 y el sistema de archivos NTFS
  • REPARTO - obtener una fecha sin una porción de tiempo
  • Grupo A - Tengo decir que usted debe saber definitivamente esto ya
  • SQL Server Management Studio
  • Transacciones
  • El intercambio de tablas temporales ámbito local entre procedimiento anidado llama
  • INSERT INTO
  • MSDN
  • UNE A
  • pivote y UNPIVOT
  • CON (FORCESEEK) - obliga al optimizador de consultas para utilizar sólo un índice operación de búsqueda como la ruta de acceso a los datos de la tabla.
  • FOR XML
  • COALESCE
  • Cómo cambiar el tamaño de la base de datos y archivos de registro
  • INFORMATION_SCHEMA
  • SET IMPLICIT_TRANSACTIONS en Management Studio 2005
  • tablas derivadas y expresiones de tabla comunes (CTE) Cláusula
  • SALIDA - permite el acceso a las tablas "virtuales" llamadas insertadas y eliminadas (como en desencadenadores)
  • CTRL + 0 para insertar nulo
  • de Datos Espaciales en SQL Server 2008
+1

Esto debería ser una pregunta de "Funciones ocultas". –

+0

@Dusty: Igual para mí, no sabía acerca de WITH TIES hasta ahora. ¡Gracias! –

+3

No importa, ya lo es. http://stackoverflow.com/questions/121243/hidden-features-of-sql-server –

Respuesta

1

Suena tonto decirlo, pero he buscado muchas consultas donde acabo preguntaba a mí mismo que hace la persona simplemente no saben lo que GROUP BY es? No estoy seguro de si la mayoría de los desarrolladores no lo saben, pero sale lo suficiente como para que me pregunte a veces.

9
  • En SQL Server 2008 (y en Oracle 10g): MERGE.

    Un solo comando para INSERT/UPDATE/DELETE en una tabla desde una fuente de fila.

  • para generar una lista de números 1-31 (por ejemplo, para una CALENDARIO):

    WITH cal AS 
         (
         SELECT 1 AS day 
         UNION ALL 
         SELECT day + 1 
         FROM cal 
         WHERE day <= 30 
         ) 
    
  • Un índice de una sola columna con DESC cláusula en una tabla agrupado se puede utilizar para la clasificación en column DESC, cluster_key ASC :

    CREATE INDEX ix_column_desc ON mytable (column DESC) 
    
    SELECT TOP 10 * 
    FROM mytable 
    ORDER BY 
         column DESC, pk 
    -- Uses the index 
    
    SELECT TOP 10 * 
    FROM mytable 
    ORDER BY 
         column, pk 
    -- Doesn't use the index 
    
  • CROSS APPLY y OUTER APPLY: permite unir rowsources que dependen de los valores de la tabl estando unidas es:

    SELECT * 
    FROM mytable 
    CROSS APPLY 
         my_tvf(mytable.column1) tvf 
    
    SELECT * 
    FROM mytable 
    CROSS APPLY 
         (
         SELECT TOP 5 * 
         FROM othertable 
         WHERE othertable.column2 = mytable.column1 
         ) q 
    
  • EXCEPT y INTERSECT operadores: permiten la selección de condiciones que incluyen NULL s cláusula

    DECLARE @var1 INT 
    DECLARE @var2 INT 
    DECLARE @var3 INT 
    
    SET @var1 = 1 
    SET @var2 = NULL 
    SET @var2 = NULL 
    
    SELECT col1, col2, col3 
    FROM mytable 
    INTERSECT 
    SELECT @val1, @val2, @val3 
    
    -- selects rows with `col1 = 1`, `col2 IS NULL` and `col3 IS NULL` 
    
    SELECT col1, col2, col3 
    FROM mytable 
    EXCEPT 
    SELECT @val1, @val2, @val3 
    
    -- selects all other rows 
    
  • WITH ROLLUP: Selecciona un gran total para todas las filas agrupadas

    SELECT month, SUM(sale) 
    FROM mytable 
    GROUP BY 
         month WITH ROLLUP 
    
    Month SUM(sale) 
        ---  --- 
        Jan  10,000 
        Feb  20,000 
        Mar  30,000 
    NULL  60,000 -- a total due to `WITH ROLLUP` 
    
+0

+1 Aquí hay otra que desconocía. Parece que tengo algo más que hacer. Gracias – Dusty

11

FileStream in SQL Server 2008: la función FILESTREAM de SQL Server 2008 permite el almacenamiento y el acceso eficiente a datos BLOB mediante una combinación de SQL Server 2008 y el sistema de archivos NTFS.

Crear una tabla para almacenar datos FILESTREAM

Una vez que la base de datos tiene un grupo de archivos FILESTREAM, las tablas pueden ser creados que contienen columnas FILESTREAM. Como se mencionó anteriormente, una columna FILESTREAM se define como una columna varbinary (max) que tiene el atributo FILESTREAM.El siguiente código crea una tabla con una columna FILESTREAM sola

USE Production; 
GO 
CREATE TABLE DocumentStore (
     DocumentID INT IDENTITY PRIMARY KEY, 
     Document VARBINARY (MAX) FILESTREAM NULL, 
     DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL 
       UNIQUE DEFAULT NEWID()) 
FILESTREAM_ON FileStreamGroup1; 
GO 
+0

+1 Esta es otra cosa que definitivamente debería saber más. – Dusty

6

Hay un puñado de maneras de conseguir una fecha sin una porción de tiempo; Aquí hay una que es bastante performant:

SELECT CAST(FLOOR(CAST(getdate() AS FLOAT))AS DATETIME) 

hecho para SQL Server 2008:

SELECT CAST(getdate() AS DATE) AS TodaysDate 
+0

Uso ese método pero siempre me he preguntado si 'cast (cast (getdate() como int) como datetime)' es equivalente? – dotjoe

+0

+1 Hace un tiempo me enteré de que la forma en que estaba haciendo esto era incorrecta porque la respuesta que habría puesto fue rechazada. :) – Dusty

+0

SQL2008 ahora tiene un tipo de columna 'DATE'. Simplemente puede CASTAR (columna COMO FECHA) – Matthew

6

Es sorprendente cuántas personas trabajan sin protección con SQL Server, ya que no sabe acerca de las transacciones!

BEGIN TRAN 
... 
COMMIT/ROLLBACK 
+1

+1 esto es cierto, y aún así no lo uso. – jr3

+0

+1 Yo diría que esto es algo que debes saber si no sabes nada de esto. Uso Begin Transaction y siempre coloco la reversión antes de la confirmación en caso de que olvide y ejecute todo el script. – Dusty

6

Después de crear un #temptable en un procedimiento, que está disponible en todos los procedimientos almacenados que son llamados a continuación, a partir del procedimiento original. Es una buena forma de compartir datos configurados entre procedimientos. ver: http://www.sommarskog.se/share_data.html

+0

+1 Esto me recuerda a uno, así que agregaré una respuesta yo mismo. :) – Dusty

+0

No importa, un poco cutre para publicar una respuesta a mi propia pregunta. Iba a decir INTO. http://msdn.microsoft.com/en-us/library/aa933206(SQL.80).aspx – Dusty

+0

@Dusty, ¿qué significa eso? –

1

uso ctrl-0 para insertar un valor nulo en una célula

+0

Esto no es estrictamente basado en SQL Server, pero los desarrolladores deben saber esto. – Dusty

2

La documentación .

Es triste decirlo, pero he llegado a la conclusión de que la característica más oculta que desconocen los desarrolladores es la documentación en MSDN. Tomemos por ejemplo un verbo Transact-SQL como RESTORE. El BOL cubrirá no solo el syntax y el arguments de RESTORE. Pero esto es solo la punta del iceberg cuando se trata de documentación. El BOL cubre:

La lista sigue y sigue, y este es solo un tema único (copia de seguridad y restauración). Cada característica de SQL Server obtiene una cobertura similar. Tenga en cuenta que no todo obtendrá la copia de seguridad detallada y la recuperación, pero todo está documentado y hay temas de procedimientos para cada función.

La cantidad de información disponible es simplemente ridícula. Sin embargo, la documentación es uno de los recursos menos utilizados, por lo tanto, mi voto es una función oculta.

+1

La cantidad de información que no tienen en MSDN también es ridícula. Simplemente seleccione un objeto con muchos miembros y observe todos los nombres atenuados, miembros sin documentación. El motor de búsqueda también es el peor. Uso MSDN todo el tiempo, pero seguro que desearía que MS actuara de forma conjunta. –

+0

@Lance Roberts: En segundo lugar esa opinión. Encuentro que Google me lleva más rápido a la página apropiada en MSDN que en MSDN. –

+0

+1 @Remus: totalmente de acuerdo ... Es una característica que tiene mucho potencial. La implementación de MSDN necesita muchas mejoras a partir de hoy. Raramente utilizo MSDN porque sé que va a ser una tarea difícil pasar por todas las cosas que no estoy buscando. Por favor, MSDN, mejore con su búsqueda. Muévete a un nuevo paradigma. –

1

¿Por qué tengo la tentación de decir UNE?

Las tablas derivadas son unas de mis favoritas. Funcionan mucho mejor que las subconsultas correlacionadas, pero las personas pueden seguir utilizando subconsultas correlacionadas en su lugar.

Ejemplo de una tabla derivada:

select f.FailureFieldName, f.RejectedValue, f.RejectionDate, 
     ft.FailureDescription, f.DataTableLocation, f.RecordIdentifierFieldName, 
     f.RecordIdentifier , fs.StatusDescription 
    from dataFailures f 
    join(select max (dataFlowinstanceid) as dataFlowinstanceid 
      from dataFailures 
      where dataflowid = 13)a 
    on f.dataFlowinstanceid = a.dataFlowinstanceid 
    join FailureType ft on f.FailureTypeID = ft.FailureTypeID 
    join FailureStatus fs on f.FailureStatusID = fs.FailureStatusID 
3
+0

+1 Estaba esperando que alguien lo pusiera. Hace poco aprendí sobre esto y puedo ver cómo va a ser muy útil. – Dusty

1

WITH (FORCESEEK) que obliga al optimizador de consultas para utilizar sólo un índice operación de búsqueda como la ruta de acceso a los datos de la tabla.

6

COALESCE(), que acepta los campos y un valor para utilizar en caso que los campos son nulos. Por ejemplo, si tiene una tabla con ciudad, estado, código postal, puede usar COALESCE() para devolver las direcciones como cadenas únicas, por ejemplo:

Ciudad | Estado | Código postal

Houston | Texas | 77058

Beaumont | Texas | NULL

NULL | Ohio | NULL

si se va a ejecutar esta consulta en la tabla:

select city + ‘ ‘ + COALESCE(State,’’)+ ‘ ‘+COALESCE(Zipcode, ‘’) 

regresarían:

Houston, Texas 77058

Beaumont

Ohio

Puede también lo uso para pivotar datos, IE:

DECLARE @addresses VARCHAR(MAX) 
SELECT @addresses = select city + ‘ ‘ + COALESCE(State,’’)+ ‘ ‘ 
+COALESCE(Zipcode, ‘’)    + ‘,’ FROM tb_addresses 
SELECT @addresses 

Volvería: Houston, Texas 77058, Beaumont Texas, Ohio

+0

+1 He estado esperando a alguien para poner eso. Demasiado tiempo y lo habría agregado yo mismo. :) – Dusty

+0

Coalesce acepta n parámetros y devuelve el primer valor no nulo. es decir COALESCE (campo1, campo2, campo3, 'literaldata') – jasonmw

3
BACKUP LOG <DB_NAME> WITH TRUNCATE_ONLY 

DBCC_SHRINKDATABASE(<DB_LOG_NAME>, <DESIRED_SIZE>) 

Cuando empecé a manejar grandes bases de datos de MS SQL Server y el archivo de registro habían más de 300 GB Este declaraciones salvado vida. En la mayoría de los casos, la base de datos de reducción no tendrá ningún efecto.

Antes de ejecutarlos asegúrese de realizar una copia de seguridad completa de LOG, y después de ejecutarlos para hacer una copia de seguridad completa de DB (la secuencia de restauración ya no es válida).

4

El "Information_Schema" me da un montón de puntos de vista que puedo usar para recopilar información acerca de SQL objetos tablas, procedimientos, vistas, etc.

4

Si está utilizando Management Studio 2005 se puede tener ejecutar automáticamente su consulta como una transacción. En una nueva ventana de consulta, vaya a Consulta-> Opciones de consulta. Luego haga clic en la "pestaña" de ANSI (a la izquierda). Marque SET IMPLICIT_TRANSACTIONS. Haga clic en Aceptar. Ahora, si ejecuta cualquier consulta en esta ventana de consulta actual, se ejecutará como una transacción y deberá ROLLBACK o COMPROMETER manualmente antes de continuar. Además, esto solo funciona para la ventana de consulta actual; las ventanas de consulta preexistentes/nuevas necesitarán tener la opción establecida.

Lo he encontrado personalmente útil. Sin embargo, no es para los débiles de corazón. Usted debe recuerde ROLLBACK o COMPROMETE su consulta.Se NOT indica que tiene una transacción pendiente si cambia a una ventana de consulta diferente (o incluso una nueva). Sin embargo, le dirá si intenta cerrar la ventana de consulta.

+0

Sería más útil si SQL Server Management Studio tuviera botones de la barra de herramientas para confirmar y revertir. Esto es lo ÚNICO que me gusta de desarrollar consultas de Oracle en TOAD. – Bill

3

La mayoría de los desarrolladores de SQL Server deben conocer y usar tablas derivadas y expresiones de tablas comunes (CTE).

+0

+1 No uso ninguno de estos tanto como debería. – Dusty

6

Una gran cantidad de desarrolladores de SQL Server todavía no parece saber sobre el OUTPUT clause (SQL Server 2005 y posteriores) en el DELETE, INSERT y UPDATE.

Puede ser muy útil saber qué filas se han insertado, actualizado o borrado, y la cláusula de salida permite hacer esto con mucha facilidad - se permite el acceso a las tablas "virtuales" llamadas inserted y deleted (como en los disparadores):

DELETE FROM (table) 
OUTPUT deleted.ID, deleted.Description 
WHERE (condition) 

Si vas a insertar valores en una tabla que tiene un campo de clave principal INT IDENTIDAD, con la cláusula de salida, puede obtener el nuevo ID insertado inmediato:

INSERT INTO MyTable(Field1, Field2) 
OUTPUT inserted.ID 
VALUES (Value1, Value2) 

Y si estás actualizando ING, que puede ser extremadamente útil saber qué ha cambiado - en este caso, inserted representa los nuevos valores (después de la actualización), mientras que deleted se refiere a los antiguos valores antes de la actualización:

UPDATE (table) 
SET field1 = value1, field2 = value2 
OUTPUT inserted.ID, deleted.field1, inserted.field1 
WHERE (condition) 

Si una gran cantidad de información se devolverá, la salida de OUTPUT también se puede redirigir a una tabla temporal o una variable de tabla (OUTPUT INTO @myInfoTable).

Extremadamente útil, ¡y muy poco conocido!

Marc

+0

+1 No he probado esto todavía, pero si esto funciona, será muy útil. Gracias. :) – Dusty

+0

SQL 2k5 y más, pero buenas cosas – Joe

+0

¡Esto es genial! Devolver el ID de fila de un inserto parece mucho más limpio que @@ IDENTIDAD. – Bill

1

Spacial Data in SQL Server 2008 es decir, el almacenamiento de datos de latitud/longitud en un tipo de datos de geografía y ser capaz de calcular/consulta utilizando las funciones que van junto con ella.

Es compatible con datos planar y geodésicos.

+0

+1 No he trabajado en nada que requiera esto, pero apuesto a que esto hace que sea más fácil para las personas que lo usan. – Dusty

2

¿Qué tal las vistas materializadas? Agregue un índice agrupado a una vista y cree efectivamente una tabla que contenga datos duplicados que se actualicen automáticamente. Ralentiza inserciones y actualizaciones porque está realizando la operación dos veces pero hace que seleccionar un subconjunto específico sea más rápido. Y aparentemente el optimizador de base de datos lo usa sin tener que llamarlo explícitamente.

Is a view faster than a simple query?

1

Cuando empecé a trabajar como programador, que comenzó con el uso de SQL Server 2000. Se me había enseñado la teoría DB de Oracle y MySQL, así que no sé mucho acerca de SQL Server 2000.

Pero, como resultó, ni el personal de desarrollo al que me uní porque no sabía que podía convertir los tipos de datos datetime (y relacionados) en cadenas formateadas con funciones incorporadas. Estaban usando una función personalizada muy ineficiente que habían desarrollado. Estuve más que feliz de mostrarles los errores de sus caminos ... (Ya no estoy con esa compañía ...:-D)

Con que anotar:

Así que quería añadir esto a la lista:

select Convert(varchar, getdate(), 101) -- 08/06/2009 
select Convert(varchar, getdate(), 110) -- 08-06-2009 

Estos son los dos utilizo más a menudo. Hay un montón más: CAST and CONVERT on MSDN

+0

sí, he visto a personas construir una cadena con funciones de mes, día, año y todo el casting para varchar. ¡que desastre! – dotjoe

Cuestiones relacionadas