2009-08-06 27 views
29

thể trùng lặp:
Hidden Features of SQL ServerSQL Server tính năng/lệnh mà hầu hết các nhà phát triển là không biết gì về

Tôi đã làm việc như một nhà phát triển NET trong một thời gian bây giờ, nhưng chủ yếu là chống lại một SQL Server cơ sở dữ liệu cho một ít hơn 3 năm nay. Tôi cảm thấy rằng tôi có một nắm bắt khá phong nha của SQL Server từ một quan điểm phát triển, nhưng tôi xấu hổ khi thừa nhận rằng tôi vừa học được ngày hôm nay về "WITH TIES" từ câu trả lời này - Top 5 with most friends. Thật là khiêm nhường khi nhìn thấy các câu hỏi và câu trả lời như thế này trên SO vì nó giúp tôi nhận ra rằng tôi thực sự không biết nhiều như tôi nghĩ và giúp tái tạo năng lực cho ý chí của mình để tìm hiểu thêm, vì vậy tôi đã tìm ra điều gì cách tốt hơn so với yêu cầu khối lượng của các chuyên gia cho đầu vào trên các lệnh/tính năng tiện dụng khác.

Tính năng/lệnh hữu ích nhất mà nhà phát triển trung bình có thể không biết là gì?

BTW - nếu bạn giống như tôi đã và không biết những gì "VỚI TIES" là, đây là một lời giải thích tốt. Bạn sẽ thấy một cách nhanh chóng tại sao tôi xấu hổ tôi đã không biết về nó. Tôi có thể thấy nó có thể hữu ích ở đâu. - http://harriyott.com/2007/06/with-ties-sql-server-tip.aspx

Tôi nhận thấy đây là câu hỏi chủ quan, vì vậy, vui lòng cho phép ít nhất một vài câu trả lời trước khi bạn đóng câu trả lời. :) Tôi sẽ cố gắng chỉnh sửa câu hỏi của tôi để cập nhật danh sách với câu trả lời của bạn. Cảm ơn

[EDIT] - Dưới đây là tóm tắt các câu trả lời Vui lòng cuộn xuống để biết thêm thông tin. Cảm ơn một lần nữa guys/gals.

  • MERGE - Một lệnh duy nhất để INSERT/UPDATE/DELETE vào bảng từ nguồn hàng. Tính năng
  • FileStream của SQL Server 2008 cho phép lưu trữ và truy cập hiệu quả với dữ liệu BLOB sử dụng một sự kết hợp của SQL Server 2008 và hệ thống tập tin NTFS
  • CAST - có được một ngày mà không có một phần thời gian
  • Nhóm Bằng - I gotta nói bạn chắc chắn nên biết điều này đã
  • SQL server Management Studio
  • Giao dịch
  • Việc chia sẻ bảng phạm vi địa phương tạm thời giữa thủ tục lồng nhau gọi
  • INSERT INTO
  • 01.
  • MSDN
  • NỐI
  • PIVOT và UNPIVOT
  • VỚI (FORCESEEK) - buộc tôi ưu truy vấn để chỉ sử dụng một chỉ mục tìm kiếm hoạt động như con đường truy cập vào các dữ liệu trong bảng.
  • FOR XML
  • liên hiệp
  • Làm thế nào để thu nhỏ cơ sở dữ liệu và file log
  • INFORMATION_SCHEMA
  • IMPLICIT_TRANSACTIONS SET trong Management Studio 2005
  • bảng nguồn gốc và các biểu thức bảng chung (CTEs) khoản
  • OUTPUT - cho phép truy cập vào các bảng "ảo" được gọi là chèn và xóa (như trong trình kích hoạt)
  • CTRL + 0 để chèn null
  • liệu Spacial trong SQL Server 2008
+1

Đây phải là câu hỏi "Tính năng ẩn". –

+0

@ Dusty: Cũng giống như tôi, không biết về WITH TIES cho đến bây giờ. Cảm ơn bạn! –

+3

Đừng bận tâm, nó đã là. http://stackoverflow.com/questions/121243/hidden-features-of-sql-server –

Trả lời

1

Nghe có vẻ ngớ ngẩn để nói nhưng tôi đã xem xét rất nhiều truy vấn mà tôi chỉ tự hỏi không người chỉ không biết những gì GROUP BY là? Tôi không chắc chắn nếu hầu hết các nhà phát triển không biết về nó, nhưng nó đi lên đủ mà tôi tự hỏi đôi khi.

9
  • Trong SQL Server 2008 (và trong Oracle 10g): MERGE.

    Một lệnh duy nhất để INSERT/UPDATE/DELETE vào bảng từ nguồn hàng.

  • Để tạo một danh sách các số 1-31 (nói, đối với một calendary):

    WITH cal AS 
         (
         SELECT 1 AS day 
         UNION ALL 
         SELECT day + 1 
         FROM cal 
         WHERE day <= 30 
         ) 
    
  • Một chỉ số duy nhất cột với DESC điều khoản trong một bảng nhóm có thể được sử dụng để phân loại trên 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 APPLYOUTER APPLY: cho phép tham gia rowsources mà phụ thuộc vào các giá trị của tabl es được gia nhập:

    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 
    
  • EXCEPTINTERSECT nhà khai thác: cho phép lựa chọn các điều kiện bao gồm NULL s khoản

    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: chọn một tổng lớn cho tất cả các hàng nhóm

    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 Đây là một điều khác mà tôi không biết. Có vẻ như tôi có nhiều nghiên cứu hơn để làm. Cảm ơn – Dusty

11

FileStream in SQL Server 2008: Tính năng FILESTREAM của SQL Server 2008 cho phép lưu trữ và truy cập hiệu quả vào dữ liệu BLOB bằng cách sử dụng kết hợp SQL Server 2008 và hệ thống tệp NTFS.

Tạo một bảng để lưu trữ dữ liệu FileStream

Khi cơ sở dữ liệu có một filegroup FileStream, bảng có thể được tạo ra có chứa các cột FileStream. Như đã đề cập trước đó, một cột FILESTREAM được định nghĩa là một cột varbinary (max) có thuộc tính FILESTREAM.Đoạn mã sau tạo một bảng có một cột FILESTREAM duy nhất

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 Đây là một điều khác mà tôi chắc chắn nên biết thêm. – Dusty

6

Có một số cách để có được một ngày không có thời gian; đây là một trong đó là khá performant:

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

Thật vậy cho SQL Server 2008:

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

Tôi sử dụng phương pháp đó nhưng tôi đã luôn luôn tự hỏi nếu 'cast (cast (getdate() như int) là datetime)' là tương đương? – dotjoe

+0

+1 Tôi phát hiện ra một thời gian trở lại trên SO rằng cách tôi đã làm điều này là sai vì câu trả lời tôi đã có thể đưa đã bỏ phiếu xuống. :) – Dusty

+0

SQL2008 hiện có loại cột 'DATE'. Bạn có thể chỉ cần CAST (cột AS DATE) – Matthew

6

Thật ngạc nhiên là có bao nhiêu người làm việc không an toàn với SQL Server như họ không biết về các giao dịch!

BEGIN TRAN 
... 
COMMIT/ROLLBACK 
+1

+1 điều này là đúng, nhưng tôi vẫn không sử dụng nó. – jr3

+0

+1 Tôi muốn nói điều này là phải biết nếu bạn chưa biết về điều này. Tôi sử dụng Bắt đầu giao dịch và tôi luôn đặt rollback trước khi cam kết trong trường hợp tôi quên và chạy toàn bộ tập lệnh. – Dusty

6

Sau khi tạo #TempTable trong quy trình, nó có sẵn trong tất cả các quy trình được lưu sau đó được gọi từ quy trình gốc. Đó là một cách hay để chia sẻ dữ liệu thiết lập giữa các thủ tục. xem: http://www.sommarskog.se/share_data.html

+0

+1 Điều này nhắc tôi về một vì vậy tôi sẽ tự thêm một câu trả lời. :) – Dusty

+0

Nevermind, kinda sleezy để gửi một câu trả lời cho câu hỏi của riêng tôi. Tôi định nói INTO. http://msdn.microsoft.com/en-us/library/aa933206 (SQL.80).aspx – Dusty

+0

@ Dusty, điều đó có nghĩa là gì? –

1

sử dụng Ctrl-0 để chèn một giá trị null trong một tế bào

+0

Đây không phải là hoàn toàn dựa trên SQL Server, nhưng các nhà phát triển nên biết điều này. – Dusty

2

Các tài liệu.

Rất tiếc phải nói, nhưng tôi đã đi đến kết luận rằng tính năng ẩn nhất mà nhà phát triển không biết là tài liệu trên MSDN. Lấy ví dụ một động từ Transact-SQL như RESTORE. BOL sẽ không chỉ bao gồm syntaxarguments của RESTORE. Nhưng đây chỉ là đỉnh của tảng băng trôi khi nói đến tài liệu. Các BOL bao gồm:

Danh sách tiếp tục, và đây chỉ là một chủ đề duy nhất (sao lưu và khôi phục). Mọi tính năng của SQL Server đều được bảo hiểm tương tự. Reckon không phải tất cả mọi thứ sẽ nhận được sao lưu chi tiết và phục hồi được, nhưng tất cả mọi thứ được tài liệu và có Làm thế nào để chủ đề cho mỗi tính năng.

Lượng thông tin có sẵn chỉ là lố bịch. Tuy nhiên, tài liệu là một trong những tài nguyên không được sử dụng nhiều nhất, do đó tôi bỏ phiếu cho nó là một tính năng ẩn.

+1

Lượng thông tin họ không có trên MSDN cũng rất lố bịch. Chỉ cần chọn một đối tượng có nhiều thành viên và xem tất cả các tên bị mờ đi, các thành viên không có tài liệu. Các công cụ tìm kiếm cũng là tồi tệ nhất. Tôi sử dụng MSDN tất cả các thời gian nhưng chắc chắn muốn MS sẽ có được hành động của họ với nhau. –

+0

@Lance Roberts: Tôi là ý kiến ​​thứ hai. Tôi thấy rằng Google sẽ đưa tôi đến trang thích hợp trên MSDN hơn là tìm kiếm trên MSDN. –

+0

+1 @Remus: hoàn toàn đồng ý ... Đó là một tính năng có nhiều tiềm năng. Triển khai của MSDN cần rất nhiều cải tiến kể từ hôm nay. Tôi hiếm khi sử dụng MSDN bởi vì tôi biết nó sẽ là một việc vặt chỉ để lội qua tất cả những điều tôi không tìm kiếm. Xin vui lòng MSDN, nhận được tốt hơn với tìm kiếm của bạn. Chuyển sang một mô hình mới. –

1

Tại sao tôi lại muốn nói JOIN?

Bảng có nguồn gốc là một trong những mục yêu thích của tôi. Chúng hoạt động tốt hơn nhiều so với các truy vấn con tương quan nhưng có thể mọi người tiếp tục sử dụng các truy vấn con tương quan thay thế.

Ví dụ về một bảng có nguồn gốc:

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 Tôi đã chờ đợi một người nào đó để đặt này. Gần đây tôi đã học về điều này và có thể thấy nó sẽ rất hữu ích. – Dusty

1

WITH (FORCESEEK) mà buộc tôi ưu truy vấn để chỉ sử dụng một chỉ mục tìm kiếm hoạt động như con đường truy cập vào các dữ liệu trong bảng.

6

liên hiệp(), nó chấp nhận các lĩnh vực và một giá trị sử dụng trong trường hợp các lĩnh vực đều bãi bỏ. Ví dụ: nếu bạn có bảng với thành phố, Tiểu bang, Mã bưu điện, bạn có thể sử dụng COALESCE() để trả lại địa chỉ dưới dạng chuỗi đơn, IE:

Thành phố | Tiểu bang | Mã bưu điện

Houston | Texas | 77058

Beaumont | Texas | NULL

NULL | Ohio | NULL

nếu bạn đã chạy truy vấn này để chống lại bảng:

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

Would return:

Houston Texas 77058

Beaumont Texas

Ohio

Bạn có thể cũng sử dụng nó cho dữ liệu trục, IE:

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

Would return: Houston Texas 77.058, Beaumont Texas, Ohio

+0

+1 Tôi đã chờ đợi ai đó để đưa điều đó. Quá nhiều thời gian và tôi đã tự thêm nó. :) – Dusty

+0

Coalesce chấp nhận tham số n và trả về giá trị không null đầu tiên. tức là COALESCE (field1, field2, field3, 'literaldata') – jasonmw

3
BACKUP LOG <DB_NAME> WITH TRUNCATE_ONLY 

DBCC_SHRINKDATABASE(<DB_LOG_NAME>, <DESIRED_SIZE>) 

Khi tôi bắt đầu để quản lý cơ sở dữ liệu rất lớn trên MS SQL Server và các tập tin đăng nhập đã hơn 300 GB báo cáo này lưu của tôi đời sống. Trong hầu hết các trường hợp, cơ sở dữ liệu thu nhỏ sẽ không có hiệu lực.

Trước khi chạy, hãy đảm bảo sao lưu đầy đủ LOG, và sau khi chạy chúng để sao lưu toàn bộ DB (chuỗi khôi phục không còn hợp lệ).

4

Các "Information_Schema" mang lại cho tôi rất nhiều quan điểm mà tôi có thể sử dụng để thu thập thông tin về các đối tượng SQL bảng, thủ tục, quan điểm vv

4

Nếu bạn đang sử dụng Management Studio 2005 bạn có thể có nó sẽ tự động thực hiện truy vấn của bạn như một giao dịch. Trong một cửa sổ truy vấn mới, truy cập Query-> Query Options. Sau đó bấm vào tab ANSI "(bên trái). Kiểm tra SET IMPLICIT_TRANSACTIONS. Nhấp vào OK. Bây giờ nếu bạn chạy bất kỳ truy vấn nào trong cửa sổ truy vấn hiện tại, nó sẽ chạy như một giao dịch và bạn phải tự ROLLBACK hoặc COMMIT nó trước khi tiếp tục. Ngoài ra, điều này chỉ hoạt động cho cửa sổ truy vấn hiện tại; các cửa sổ truy vấn có sẵn/mới sẽ cần phải có bộ tùy chọn.

Cá nhân tôi thấy nó hữu ích. Tuy nhiên, nó không dành cho người yếu tim. Bạn phải nhớ ROLLBACK hoặc COMMIT truy vấn của bạn.Nó sẽ NOT cho bạn biết rằng bạn có giao dịch đang chờ xử lý nếu bạn chuyển sang cửa sổ truy vấn khác (hoặc thậm chí là cửa sổ truy vấn mới). Tuy nhiên, nó sẽ cho bạn biết nếu bạn cố gắng đóng cửa sổ truy vấn.

+0

Sẽ dễ dàng hơn nếu SQL Server Management Studio có các nút trên thanh công cụ cho cam kết và rollback. Đây là điều duy nhất tôi thích về việc phát triển các truy vấn Oracle trong TOAD. – Bill

3

Hầu hết các nhà phát triển SQL Server nên biết và sử dụng các bảng có nguồn gốc và biểu thức bảng chung (CTE).

+0

+1 Tôi không sử dụng một trong số này nhiều như tôi có lẽ nên. – Dusty

6

Rất nhiều nhà phát triển SQL Server dường như không biết về OUTPUT clause (SQL Server 2005 và mới hơn) trên câu lệnh DELETE, INSERT và UPDATE. Có thể cực kỳ hữu ích khi biết những hàng nào đã được INSERTED, UPDATEd hoặc DELETEd và mệnh đề OUTPUT cho phép thực hiện điều này rất dễ dàng - nó cho phép truy cập vào các bảng "ảo" được gọi là inserteddeleted (như trong bộ kích hoạt)):

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

Nếu bạn đang chèn giá trị vào một bảng trong đó có một INT SẮC trường tiểu học trọng, với mệnh đề OUTPUT, bạn có thể nhận được chèn ID mới ngay lập tức:

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

Và nếu bạn đang cập nhật ing, nó có thể cực kỳ hữu ích để biết những gì thay đổi - trong trường hợp này, inserted đại diện cho các giá trị mới (sau khi UPDATE), trong khi deleted đề cập đến các giá trị cũ trước khi UPDATE:

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

Nếu rất nhiều thông tin sẽ được trả lại, đầu ra của OUTPUT cũng có thể được chuyển hướng đến một bảng tạm thời hoặc một biến bảng (OUTPUT INTO @myInfoTable).

Vô cùng hữu ích - và rất ít được biết đến!

Marc

+0

+1 Tôi chưa thử điều này, nhưng nếu công trình này sẽ cực kỳ tiện dụng. Cảm ơn. :) – Dusty

+0

SQL 2k5 trở lên, nhưng nội dung tốt – Joe

+0

Đá này! Trả lại ID hàng từ một chèn có vẻ sạch hơn nhiều so với @@ IDENTITY. – Bill

1

Spacial Data in SQL Server 2008 ví dụ: lưu trữ dữ liệu Lat/Long trong một datatype địa lý và có khả năng tính toán/truy vấn bằng cách sử dụng chức năng mà đi cùng với nó.

Nó hỗ trợ cả dữ liệu Planar và Geodetic.

+0

+1 Tôi chưa từng làm bất cứ điều gì đòi hỏi điều này, nhưng tôi đặt cược điều này làm cho nó dễ dàng hơn cho những người sử dụng nó. – Dusty

2

Làm thế nào về quan điểm vật chất? Thêm một chỉ số nhóm vào một khung nhìn và bạn tạo một bảng chứa dữ liệu trùng lặp được cập nhật tự động một cách hiệu quả. Làm chậm các chèn và cập nhật vì bạn đang thực hiện thao tác hai lần nhưng bạn thực hiện chọn một tập hợp con cụ thể nhanh hơn. Và rõ ràng là trình tối ưu hóa cơ sở dữ liệu sử dụng nó mà không cần phải gọi nó một cách rõ ràng.

Is a view faster than a simple query?

1

Khi tôi lần đầu tiên bắt đầu làm việc như lập trình viên, tôi bắt đầu với việc sử dụng SQL Server 2000. Tôi đã được dạy lý thuyết DB trên Oracle và MySQL vì vậy tôi không biết nhiều về SQL Server 2000.

Nhưng, hóa ra cũng như nhân viên phát triển mà tôi đã tham gia vì họ không biết rằng bạn có thể chuyển đổi các kiểu dữ liệu datetime (và có liên quan) thành các chuỗi được định dạng với các hàm dựng sẵn. Họ đã sử dụng một chức năng tùy chỉnh rất kém hiệu quả mà họ đã phát triển. Tôi rất vui khi cho họ thấy những sai lầm của cách họ ... (Tôi không còn với công ty đó nữa ...:-D)

Với chú thích rằng:

Vì vậy, tôi muốn để thêm video này vào danh sách:

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

Đây là hai tôi sử dụng thường xuyên nhất. Có nhiều hơn: CAST and CONVERT on MSDN

+0

yea, tôi đã thấy mọi người xây dựng một chuỗi với các hàm tháng, ngày, năm và tất cả các phép đúc thành các biến. thật là một mớ hỗn độn! – dotjoe

Các vấn đề liên quan