大多数开发人员都不知道的SQL Server功能/命令

Dus*_*sty 30 sql sql-server

可能重复:
SQL Server的隐藏功能

我已经作为.NET开发人员工作了一段时间,但现在主要针对SQL Server数据库3年多了.我觉得从开发的角度来看,我对SQL Server的掌握相当不错,但我很惭愧地承认我今天刚刚从这个答案中学到了"WITH TIES" - 与大多数朋友一起排名前五.

在SO上看到这样的问题和答案是令人羞愧的,因为它帮助我意识到我真的不知道我认为我做的多少,并帮助重新激发我的意志,以便了解更多,所以我想到了更好的方式而不是请大量专家对其他方便的命令/功能进行输入.

普通开发人员可能没有意识到的最有用的功能/命令是什么?

顺便说一句 - 如果你像我一样并且不知道"WITH TIES"是什么,这里有一个很好的解释.你会很快看到为什么我感到惭愧我不知道它.我可以看到它在哪里有用.- http://harriyott.com/2007/06/with-ties-sql-server-tip.aspx

我意识到这是一个主观问题所以请在关闭之前至少留出几个答案.:)我会尝试编辑我的问题以跟上您的回复列表.谢谢

[编辑] - 以下是回复摘要请向下滚动以获取更多信息.再次感谢guy/gals.

  • MERGE - 从行源INSERT/UPDATE/DELETE到表中的单个命令.
  • SQL Server 2008的FILESTREAM功能允许使用SQL Server 2008和NTFS文件系统的组合来存储和有效访问BLOB数据
  • CAST - 获取没有时间部分的日期
  • Group By - 我得说你一定应该知道这一点
  • SQL Server Management Studio
  • 交易
  • 在嵌套过程调用之间共享本地范围临时表
  • 插入
  • MSDN
  • JOINS
  • PIVOT和UNPIVOT
  • WITH(FORCESEEK) - 强制查询优化器仅使用索引查找操作作为表中数据的访问路径.
  • FOR XML
  • 合并
  • 如何收缩数据库和日志文件
  • INFORMATION_SCHEMA
  • 在Management Studio 2005中设置IMPLICIT_TRANSACTIONS
  • 派生表和公用表表达式(CTE)
  • OUTPUT子句 - 允许访问称为插入和删除的"虚拟"表(如触发器中)
  • CTRL + 0插入null
  • SQL Server 2008中的空间数据

Sri*_*ddi 11

SQL Server 2008中的FileStream:SQL Server 2008的 FILESTREAM功能允许使用SQL Server 2008和NTFS文件系统的组合来存储和有效访问BLOB数据.

创建用于存储FILESTREAM数据的表

一旦数据库具有FILESTREAM文件组,就可以创建包含FILESTREAM列的表.如前所述,FILESTREAM列定义为具有FILESTREAM属性的varbinary(max)列.以下代码创建一个包含单个FILESTREAM列的表

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
Run Code Online (Sandbox Code Playgroud)


Qua*_*noi 9

  • SQL Server 2008(和Oracle 10g)MERGE.

    INSERT / UPDATE / DELETE从行源到表中的单个命令.

  • 要生成的数字从列表131(比如,对于calendary):

    WITH   cal AS
            (
            SELECT  1 AS day
            UNION ALL
            SELECT  day + 1
            FROM    cal
            WHERE   day <= 30
            ) 
    
    Run Code Online (Sandbox Code Playgroud)
  • DESC可以使用聚簇表中的单列索引with 子句进行排序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
    
    Run Code Online (Sandbox Code Playgroud)
  • CROSS APPLYOUTER APPLY:允许连接取决于要连接的表的值的行源:

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • EXCEPTINTERSECT运算符:允许选择包含NULLs的条件

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • WITH ROLLUP 子句:为所有分组行选择总计

    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`
    
    Run Code Online (Sandbox Code Playgroud)


p.c*_*ell 6

有一些方法可以获得没有时间部分的日期; 这是一个非常高效的:

SELECT CAST(FLOOR(CAST(getdate() AS FLOAT))AS DATETIME) 
Run Code Online (Sandbox Code Playgroud)

确实对于SQL Server 2008:

SELECT CAST(getdate() AS DATE) AS TodaysDate
Run Code Online (Sandbox Code Playgroud)


pjp*_*pjp 6

令人惊讶的是,有多少人在不受SQL Server保护的情况下工作,因为他们不了解交易!

BEGIN TRAN
...
COMMIT / ROLLBACK
Run Code Online (Sandbox Code Playgroud)


KM.*_*KM. 6

在过程中创建#TempTable后,它将在所有存储过程中可用,然后从原始过程调用它们.这是在程序之间共享集合数据的好方法.见:http://www.sommarskog.se/share_data.html


jr3*_*jr3 6

COALESCE(),它接受字段和值使用,如果字段为空.例如,如果你有一个包含city,State,Zipcode的表,你可以使用COALESCE()将地址作为单个字符串返回,IE:

城市| 国家| 邮政编码

休斯顿| 德克萨斯州 77058

博蒙特| 德克萨斯州 空值

NULL | 俄亥俄州| 空值

如果您要对表运行此查询:

select city + ‘  ‘ + COALESCE(State,’’)+ ‘  ‘+COALESCE(Zipcode, ‘’)
Run Code Online (Sandbox Code Playgroud)

会回来:

德克萨斯州休斯顿77058

Beaumont Texas

俄亥俄州

您还可以使用它来转移数据,IE:

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

将返回:Houston Texas 77058,Beaumont Texas,Ohio


mar*_*c_s 6

许多SQL Server开发人员似乎仍然不了解DELETE,INSERT和UPDATE语句中的OUTPUT子句(SQL Server 2005和更新版本).

它可以知道哪些行已插入,更新或删除非常有用,并且输出子句允许这样做很容易-它允许访问称为"虚拟"的表inserteddeleted(如在触发器):

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)
Run Code Online (Sandbox Code Playgroud)

如果要将值插入具有INT IDENTITY主键字段的表中,并使用OUTPUT子句,则可以立即获取插入的新ID:

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)
Run Code Online (Sandbox Code Playgroud)

如果你正在更新,知道改变了什么是非常有用的 - 在这种情况下,inserted代表新值(在UPDATE之后),同时deleted引用UPDATE之前的旧值:

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)
Run Code Online (Sandbox Code Playgroud)

如果返回大量信息,OUTPUT的输出也可以重定向到临时表或表变量(OUTPUT INTO @myInfoTable).

非常有用 - 而且知之甚少!


Jon*_*Jon 1

这听起来很愚蠢,但我看了很多查询,我只是问自己,这个人是否不知道 GROUP BY 是什么?我不确定大多数开发人员是否没有意识到这一点,但它的出现足以让我有时感到好奇。