可能重复:
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.
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)
在SQL Server 2008
(和Oracle 10g
)MERGE
.
INSERT / UPDATE / DELETE
从行源到表中的单个命令.
要生成的数字从列表1
来31
(比如,对于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 APPLY
和OUTER 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)EXCEPT
和INTERSECT
运算符:允许选择包含NULL
s的条件
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)有一些方法可以获得没有时间部分的日期; 这是一个非常高效的:
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)
令人惊讶的是,有多少人在不受SQL Server保护的情况下工作,因为他们不了解交易!
BEGIN TRAN
...
COMMIT / ROLLBACK
Run Code Online (Sandbox Code Playgroud)
在过程中创建#TempTable后,它将在所有存储过程中可用,然后从原始过程调用它们.这是在程序之间共享集合数据的好方法.见:http://www.sommarskog.se/share_data.html
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
许多SQL Server开发人员似乎仍然不了解DELETE,INSERT和UPDATE语句中的OUTPUT子句(SQL Server 2005和更新版本).
它可以知道哪些行已插入,更新或删除非常有用,并且输出子句允许这样做很容易-它允许访问称为"虚拟"的表inserted
和deleted
(如在触发器):
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
).
非常有用 - 而且知之甚少!
渣