web-dev-qa-db-ja.com

SQL Serverの隠された機能

SQL Server の隠された機能は何ですか?

たとえば、文書化されていないシステムストアドプロシージャ、非常に有用であるが十分に文書化されていないことを行うためのトリックはありますか?


回答

すべてのすばらしい答えをみんなに感謝!

ストアドプロシージャ

  • sp_msforeachtable:「?」でコマンドを実行します各テーブル名に置き換えられます(v6.5以降)
  • sp_msforeachdb:「?」でコマンドを実行します各データベース名に置き換えられます(v7以降)
  • sp_who2:sp_whoと同じですが、トラブルシューティングブロック(v7以降)の詳細情報があります
  • sp_helptext:ストアドプロシージャのコードが必要な場合は、ビューとUDF
  • sp_tables:スコープ内のデータベースのすべてのテーブルとビューのリストを返します。
  • sp_stored_procedures:すべてのストアドプロシージャのリストを返す
  • xp_sscanf:各形式引数で指定された引数位置に文字列からデータを読み込みます。
  • xp_fixeddrives::最大の空き容量を持つ固定ドライブを見つける
  • sp_help:テーブルの構造、インデックス、制約を知りたい場合。ビューとUDFも。ショートカットはAlt + F1です

スニペット

  • ランダムな順序で行を返す
  • 最終変更日別のすべてのデータベースユーザーオブジェクト
  • 返却日のみ
  • 日付が現在の週のどこかにあるレコードを検索します。
  • 先週発生した日付のレコードを検索します。
  • 現在の週の初めの日付を返します。
  • 先週の初めの日付を返します。
  • サーバーにデプロイされた手順のテキストを参照してください
  • データベースへのすべての接続をドロップします
  • テーブルチェックサム
  • 行チェックサム
  • データベース内のすべてのプロシージャを削除します
  • 復元後にログインIDを正しく再マップします
  • INSERTステートメントからストアドプロシージャを呼び出す
  • キーワードで手順を検索
  • データベース内のすべてのプロシージャを削除します
  • プログラムでデータベースのトランザクションログを照会します。

関数

  • HashBytes()
  • EncryptByKey
  • PIVOTコマンド

その他

  • 接続文字列の追加
  • TableDiff.exe
  • ログオンイベントのトリガー(Service Pack 2の新機能)
  • 永続計算列(pcc)でパフォーマンスを向上させます。
  • Sys.database_principlesのDEFAULT_SCHEMA設定
  • 強制パラメーター化
  • Vardecimalストレージ形式
  • 最も人気のあるクエリを数秒で把握する
  • スケーラブルな共有データベース
  • SQL Management Studioのテーブル/ストアドプロシージャフィルター機能
  • トレースフラグ
  • GOがバッチを繰り返した後の数
  • スキーマを使用したセキュリティ
  • 組み込みの暗号化機能、ビュー、トリガー付きベーステーブルを使用した暗号化
215
Sklivvz

Management Studioでは、GOバッチ終了マーカーの後に数字を入力して、その回数だけバッチを繰り返すことができます。

PRINT 'X'
GO 10

「X」を10回印刷します。これにより、繰り返しの作業を行うときに面倒なコピー/貼り付けからあなたを救うことができます。

91
GilM

多くのSQL Server開発者は、OUTPUT句(SQL Server 2005以降)についてまだ知らないようです。 DELETE、INSERT、およびUPDATEステートメント。

どの行がINSERT、UPDATE、またはDELETEされたかを知ることは非常に役立ちます。また、OUTPUT句を使用すると、これを非常に簡単に行うことができます。insertedおよびdeleted(トリガーのように):

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

OUTPUT句を使用して、INT IDENTITY主キーフィールドを持つテーブルに値を挿入する場合、挿入された新しいIDをすぐに取得できます。

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

更新している場合、何が変更されたかを知ることは非常に役立ちます。この場合、insertedは新しい値(UPDATE後)を表し、deletedは前の古い値を表します更新:

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

大量の情報が返される場合、OUTPUTの出力は一時テーブルまたはテーブル変数(OUTPUT INTO @myInfoTable)。

非常に便利-ほとんど知られていない!

マーク

70
marc_s

sp_msforeachtable:「?」でコマンドを実行します各テーブル名に置き換えられます。例えば.

exec sp_msforeachtable "dbcc dbreindex('?')"

テーブルごとに最大3つのコマンドを発行できます

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

また、sp_MSforeachdb

52
Mitch Wheat

接続文字列の追加:

MultipleActiveResultSets = true;

これにより、単一のデータベース接続でADO.Net 2.0以上が複数の転送専用、読み取り専用の結果セットを読み取り、多くの読み取りを行う場合のパフォーマンスを向上させることができます。クエリの種類が混在している場合でも、有効にすることができます。

アプリケーション名= MyProgramName

Sysprocessesテーブルを照会してアクティブな接続のリストを表示したい場合、プログラムの名前は「.Net SqlClient Data Provider」ではなく、program_name列に表示されます。

51
Chris Wenham

TableDiff.exe

  • Table Differenceツールを使用すると、ソーステーブルと宛先テーブルまたはビューの違いを検出して調整できます。 Tablediffユーティリティは、スキーマとデータの違いをレポートできます。 tablediffの最も一般的な機能は、テーブル間の違いを調整する宛先で実行できるスクリプトを生成できるという事実です。

リンク

33
Sklivvz

ランダムな順序で行を返すためのあまり知られていないTSQLテクニック:

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())
31
Mitch Wheat

Management Studioでは、次の方法でテーブルの列のカンマ区切りリストをすばやく取得できます。

  1. オブジェクトエクスプローラーで、特定のテーブルの下のノードを展開します(したがって、列、キー、制約、トリガーなどのフォルダーが表示されます)
  2. Columnsフォルダーをポイントし、クエリにドラッグします。

これは、テーブルを右クリックして[スクリプトテーブル...]を選択し、次に[挿入...]を選択することで返される凶悪な形式を使用したくない場合に便利です。フォルダー内に含まれる名前のコンマ区切りリスト。

30
Thomas

行コンストラクタ

単一の挿入ステートメントで複数行のデータを挿入できます。

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')
23
Rob Boek

HashBytes() は、入力のMD2、MD4、MD5、SHA、またはSHA1ハッシュを返します。

22
Joel Coehoorn

テーブル構造、インデックス、および制約を知りたい場合:

sp_help 'TableName'
22
Eduardo Molteni

最も人気のあるクエリを把握する

  • Sys.dm_exec_query_statsを使用すると、1つのクエリでクエリ分析の多くの組み合わせを把握できます。

リンク コマンドで

select * from sys.dm_exec_query_stats 
order by execution_count desc
20
Sklivvz
17
Martin Smith

正確に隠されていないことは知っていますが、 [〜#〜] pivot [〜#〜] コマンドについて知っている人はあまり多くありません。カーソルを使用するストアドプロシージャを変更し、2分の時間をかけて、1/10の行数である高速の6秒のコードを実行することができました。

16
BoltBait

EXCEPTおよびINTERSECT

精巧な結合とサブクエリを記述する代わりに、これらの2つのキーワードは、2つのクエリ結果を比較するときにクエリの意図を表現する、はるかに簡潔で読みやすい方法です。 SQL Server 2005の新機能は、長年TSQL言語にすでに存在していたUNIONを強力に補完します。

EXCEPT、INTERSECT、およびUNIONの概念は、すべての最新のRDBMSで使用されるリレーショナルモデリングの基礎および基盤となる集合論の基本です。これで、TSQLを使用して、ベン図の結果をより直感的かつ簡単に生成できるようになりました。

16
Ray Vega

テスト目的などのためにデータベースを復元するときに便利です。ログインIDを正しく再マップします。

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
16
Kolten

データベースへのすべての接続をドロップします。

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End
15
GateKiller

これが隠された機能であるかどうかはわかりませんが、私はこれにつまずいて、多くの機会に役立つことがわかりました。カーソルを使用してselectステートメントをループするのではなく、単一のselectステートメントでフィールドのセットを連結できます。

例:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

結果:

Acme, Microsoft, Apple,
15
Sheki

テーブルチェックサム

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

行チェックサム

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
15
GateKiller

ストアドプロシージャのコードが必要な場合:

sp_helptext 'ProcedureName'

(隠された機能かどうかはわかりませんが、私は常にそれを使用しています)

14
Eduardo Molteni

ストアドプロシージャの秘Aは、INSERTステートメントから呼び出すことができるということです。これは、SQL Serverデータベースで作業していたときに非常に役立ちました。

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto
13
edomaur

SQL Server 2005/2008でSELECTクエリ結果に行番号を表示するには:

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

ORDER BYは強制条項です。 OVER()句は、指定された列(この場合はOrderId)でデータを並べ替え、並べ替えの結果に従って番号を割り当てるようにSQLエンジンに指示します。

12
Binoj Antony

ストアドプロシージャの引数の解析に便利: xp_sscanf

文字列から各形式引数で指定された引数の場所にデータを読み込みます。

次の例では、xp_sscanfを使用して、ソース文字列の形式での位置に基づいてソース文字列から2つの値を抽出します。

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', 
  @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

結果セットは次のとおりです。

-------------------- -------------------- 
products10.tmp        random
10
Sklivvz

dm_db_index_usage_stats

これにより、テーブルにDateUpdated列がない場合でも、テーブルのデータが最近更新されたかどうかを知ることができます。

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MyDatabase')
AND OBJECT_ID=OBJECT_ID('MyTable')

コード: http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

参照される情報: SQL Server-テーブルに最後に挿入された行の日付/時刻は?

SQL 2005以降で利用可能

9
Nathan Koop

返却日のみ

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

または

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
9
GateKiller

日付が現在の週のどこかにあるレコードを検索します。

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

先週発生したレコードを検索します。

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

現在の週の初めの日付を返します。

select dateadd( week, datediff( week, 0, getdate() ), 0 )

先週の初めの日付を返します。

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )
7
GateKiller

隠された機能ではなく、Management StudioのTools\Options\Keyboardでキーマッピングを設定します。Alt+ F1のデフォルトはsp_help "selected text"ですが、sp_helptext "selected text"にCtrl + F1を追加しないと生きられません。

7
JohnD

並べ替えるのに適した列がない場合や、テーブルのデフォルトの並べ替え順序が必要で、各行を列挙したい場合があります。そのためには、「order by」句に「(select 1)」を入力すると、必要なものが得られます。きちんとした、え?

select row_number() over (order by (select 1)), * from dbo.Table as t
7
Denis Valeev

永続計算列

  • 計算列は、実行時の計算コストをデータ変更フェーズに移行するのに役立ちます。計算列は残りの行とともに格納され、計算列の式とクエリが一致した場合に透過的に利用されます。また、PCCにインデックスを作成して、式のフィルタリングと範囲スキャンを高速化することもできます。

リンク

7
Sklivvz

ここに私が便利だと思ういくつかの機能がありますが、多くの人は知らないようです:

sp_tables

現在の環境で照会できるオブジェクトのリストを返します。これは、同義語オブジェクトを除く、FROM句に表示できるオブジェクトを意味します。

リンク

sp_stored_procedures

現在の環境のストアドプロシージャのリストを返します。

リンク

7
Sklivvz

/ *最大の空き容量を持つ固定ドライブを見つけます。ファイルをコピーして、どのディスクが最も速いかを推定することもできます* /

EXEC master..xp_fixeddrives

/ *使用または参照の前にファイルに関する仮定を確認* /

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

詳細はこちら

6
ICW

EncryptByKey を使用した単純な暗号化

6
John Sheehan

これはシンプルですが便利なものです:

テーブルの内容を手動で編集している場合、Control-と入力して列にNULLを挿入を実行できます。

6
Ryan Lundy

今週学んだ最も驚くべきことは、ORDER BY句でCASEステートメントを使用することです。例えば:

declare @orderby varchar(10)

set @orderby = 'NAME'

select * 
    from Users
    ORDER BY 
        CASE @orderby
            WHEN 'NAME' THEN LastName
            WHEN 'EMAIL' THEN EmailAddress
        END
6
NotMe

SQLCMD

何度も実行するスクリプトを持っているが、わずかな詳細を変更する必要がある場合、 sqlcmd mode でssmsを実行するのは素晴らしいです。 sqlcmdコマンドライン も非常に洗練されています。

私のお気に入りの機能は次のとおりです。

  • 変数を設定できます。 sp_execフープをジャンプする必要のない適切な変数
  • 複数のスクリプトを順番に実行できます
  • これらのスクリプトは、「外部」スクリプトの変数を参照できます

Red GateによるSimpletalkは、これ以上のことを言うのではなく、sqlcmdのすばらしいまとめを行いました- The SQLCMD Workbench 。 Donabel Santosには素晴らしい SQLCMDの例 もあります。

6
Dan F

これは、最終更新日ごとにすべてのDBユーザーオブジェクトを一覧表示するために作成したクエリです。

select name, modify_date, 
case when type_desc = 'USER_TABLE' then 'Table'
when type_desc = 'SQL_STORED_PROCEDURE' then 'Stored Procedure'
when type_desc in ('SQL_INLINE_TABLE_VALUED_FUNCTION', 'SQL_SCALAR_FUNCTION', 'SQL_TABLE_VALUED_FUNCTION') then 'Function'
end as type_desc
from sys.objects
where type in ('U', 'P', 'FN', 'IF', 'TF')
and is_ms_shipped = 0
order by 2 desc
5
Gordon Bell

GETDATE()+または-とともに使用して、近くの日付を計算します

SELECT GETDATE() - 1 -- yesterday, 1 day ago, 24 hours ago
SELECT GETDATE() - .5 -- 12 hours ago
SELECT GETDATE() - .25 -- 6 hours ago
SELECT GETDATE() - (1 / 24.0) -- 1 hour ago (implicit decimal result after division)
4
MikeM

トレースフラグ ! 「1204」は、SQL Server 2000でのデッドロックデバッグに非常に貴重でした(2005にはこれに適したツールがあります)。

4
Constantin

キーワードによる手順の検索

特定のテキスト(テーブル名、列名、変数名、TODOなど)を含むプロシージャは何ですか?

SELECT OBJECT_NAME(ID) FROM SysComments 
WHERE Text LIKE '%SearchString%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
4
Meff

この小さなスクリプトは、サーバーに展開された手順のテキストを見るのに非常に便利です。

DECLARE @procedureName NVARCHAR( MAX ), @procedureText NVARCHAR( MAX )

SET @procedureName = 'myproc_Proc1'

SET @procedureText =    (
                            SELECT  OBJECT_DEFINITION( object_id )
                            FROM    sys.procedures 
                            WHERE   Name = @procedureName
                        )

PRINT @procedureText
4
cheeves

OKここに残ったいくつかがあります、残念ながらスタートを逃しましたが、それを維持してくださいここにいくつかのトップのものがあります!

クエリアナライザー

  • _Alt+F1_は、選択したテキストで_sp_help_を実行します
  • _Alt-D_-データベースドロップダウンにフォーカスして、文字のカーソルキーでselect dbを使用できるようにします。

T-Sql

  • if (object_id("nameofobject") IS NOT NULL) begin <do something> end-最も簡単な存在チェック
  • _sp_locks_-sp_who2(呼び出しの最初のポート)よりも詳細なロック情報
  • dbcc inputbuffer(spid)-実行中のプロセスの一番上の行のリスト(ちょっと役立つがv。簡潔)
  • dbcc outputbuffer(spid)-実行中プロセスの出力の最上行のリスト

T-sqlの一般的なヒント

  • 大容量の場合、サブクエリを自由に使用してセット内のデータを処理します

例えば50人以上の既婚者のリストを取得するには、サブクエリで結婚している人々のセットを選択し、50人以上の同じ人々のセットと結合し、結合された結果を出力できます。

4
penderi

バッチセパレーター

ほとんどの人はそれを知りませんが、「GO」はSQLコマンドではありません。これは、クライアントツールで使用されるデフォルトのバッチ区切り文字です。詳細については Books Online をご覧ください。

Management Studioで[ツール]-> [オプション]を選択し、[クエリ実行]セクションで[バッチセパレーター]オプションを変更して、バッチセパレーターを変更できます。

なぜいたずら以外でこれをしたいのかはわかりませんが、ちょっと面白いトリビアです。

4
Rob Boek
sp_executesql 

文字列内のステートメントを実行します。 実行と同じですが、パラメータを返すことができます

4
Eduardo Molteni

sp_who2、sp_whoと同じですが、トラブルシューティングブロックの詳細情報が含まれています

4
Booji Boy

SQL Server Management Studio(SSMS)では、オブジェクトエクスプローラーでオブジェクト名を強調表示し、Ctrl-Cを押して名前をクリップボードにコピーできます。

F2キーを押すか、右クリックしてオブジェクトの名前を変更して名前をコピーする必要はありません。

オブジェクトをオブジェクトエクスプローラーからクエリウィンドウにドラッグアンドドロップすることもできます。

3
Rob Boek

SQL 2000+ DBCC DROPCLEANBUFFERS:バッファをクリアします。バッファがクリーンなときにクエリの速度をテストするのに役立ちます。

2
Brian

ストアドプロシージャsp_MSdependenciesは、sp_dependsよりも便利な方法でオブジェクトの依存関係を示します。一部の製品リリースでは、子テーブル制約を一時的に無効にし、変更を適用してから子テーブル制約を再度有効にすると便利です。これは、親テーブルに依存するオブジェクトを見つけるのに最適な方法です。

このコードは、子テーブルの制約を無効にします。

create table #deps
( oType int,
  oObjName sysname,
  oOwner nvarchar(200),
  oSequence int
)

insert into #deps  
exec sp_MSdependencies @tableName, null, 1315327

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? NOCHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

変更が適用された後、次のコードを実行して制約を再度有効にできます。

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

3番目のパラメーターは@flagsと呼ばれ、どの種類の依存関係がリストされるかを制御します。 procの内容を読んで、目的に合わせて@flagsを変更する方法を確認してください。 procは、ビットマスクを使用して、返されるものを解読します。

2
Sir Wobin

私はDBAではなくプログラマーなので、私のお気に入りの隠し機能は SMOライブラリ です。データベース/テーブル/列の作成と削除から、スクリプト作成からバックアップと復元まで、SQL Serverのほとんどすべてを自動化できます。 SQL Server Management Studioで実行できる場合は、SMOで自動化できます。

2
Ryan Lundy

取引を検索する必要があったため、今日私が学んだものを紹介します。

:: fn_dblog
これにより、データベースのトランザクションログを照会できます。

USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)

http://killspid.blogspot.com/2006/07/using-fndblog.html

2
Chris Roland

私のお気に入りはmaster..xp_cmdshellです。サーバーのコマンドプロンプトからコマンドを実行し、出力を確認できます。サーバーにログインできない場合は非常に便利ですが、情報を取得するか、何らかの方法で制御する必要があります。

たとえば、SQL Serverが実行されているサーバーのC:ドライブのフォルダーを一覧表示するには。

  • master..xp_cmdshell 'dir c:\'

サービスを開始および停止することもできます。

  • master..xp_cmdshell 'sc query "My Service"'

  • master..xp_cmdshell 'sc stop "My Service"'

  • master..xp_cmdshell 'sc start "My Service"'

非常に強力ですが、セキュリティ上のリスクもあります。簡単に使用できてサーバー上で悪いことをする可能性があるため、多くの人が無効にします。ただし、アクセスできる場合は、非常に便利です。

2
Jim

ログオンイベントのトリガー

  • ログオントリガーは、監査とコンプライアンスを補完するのに役立ちます。たとえば、ログオンイベントは、接続にルールを適用する(特定のユーザー名による接続の制限、特定の期間へのユーザー名による接続の制限など)ため、または単に一般的な接続アクティビティを追跡および記録するために使用できます。トリガーと同様に、ROLLBACKは実行中の操作をキャンセルします。ログオンイベントの場合は、接続の確立をキャンセルすることを意味します。サーバーが最小構成モードで起動されたとき、または専用管理接続(DAC)を介して接続が確立されたとき、ログオンイベントは発生しません。

リンク

2
Sklivvz

強化されたデータベース開発者によるそれに対する激しい反応と思われるものに基づいて、CLR統合はすぐそこにランクされます。 =)

2
casperOne

ストアドプロシージャを実行し、さらに処理するために(temp)テーブルに結果をキャプチャします。例:

INSERT INTO someTable EXEC sp_someproc

例:sp_help出力を表示しますが、データベースサイズで並べ替えます:

CREATE TABLE #dbs
(
    name nvarchar(50),
    db_size nvarchar(50),
    owner nvarchar(50),
    dbid int,
    created datetime,
    status nvarchar(255),
    compatiblity_level int
)
INSERT INTO #dbs EXEC sp_helpdb

SELECT * FROM #dbs 
ORDER BY CONVERT(decimal, LTRIM(LEFT(db_size, LEN(db_size)-3))) DESC

DROP TABLE #dbs
1
Duncan Smart

隠された機能であるテーブル/ストアドプロシージャフィルター機能は本当に便利です...

SQL Server Management StudioObject Explorerで、右クリックしてTablesまたはストアドプロシージャフォルダー、フィルターメニューを選択してからフィルター設定を選択し、Name contains行。

同様に、Remove Filterを使用して、すべてのテーブル/ストアドプロシージャを再度表示します。

1
Gordon Bell

列ヘッダーのリストを垂直形式で取得します。

グリッド結果の列名をコピーする

ツール-オプション-クエリ結果-SQL Server-グリッドへの結果「結果のコピーまたは保存時に列ヘッダーを含める」

この時点で新しい接続を作成し、クエリを実行する必要があります

グリッドから結果をコピーすると、列ヘッダーが取得されます

また、結果をExcelにコピーする場合

Colヘッダーのみをコピー

特殊貼り付け(コピー領域に重なってはいけません)

「トランスポーズ」にチェックを入れる

OK

[「、」を追加し、この時点で自動入力することもできます]

垂直形式の列のインスタントリストがあります

1
adolf garlic

これらは、私が気に入っているSQL Management Studioの非表示機能です。

私が気に入っているのは、Altキーを押しながら情報を強調表示すると、行全体だけでなく列情報を選択できることです。

SQL Management Studioには、事前定義されたキーボードショートカットがあります。

Ctrl + 1はsp_whoを実行Ctrl + 2はsp_lockを実行Alt + F1はsp_helpを実行Ctrl + F1はsp_helptextを実行

そのため、エディターでテーブル名を強調表示し、Alt + F1を押すと、テーブルの構造が表示されます。

1
Jose Chama

Osqlユーティリティを使用してコマンドラインクエリ/スクリプト/バッチを実行する

1
Kane

DB内のすべてのプロシージャを削除する場合-

SELECT  IDENTITY ( int, 1, 1 ) id, 
        [name] 
INTO    #tmp 
FROM    sys.procedures 
WHERE   [type]        = 'P' 
    AND is_ms_shipped = 0 

DECLARE @i INT 

SELECT   @i = COUNT( id ) FROM #tmp 
WHILE    @i > 0 
BEGIN 
   DECLARE @name VARCHAR( 100 ) 
   SELECT @name = name FROM #tmp WHERE id = @i 
   EXEC ( 'DROP PROCEDURE ' + @name ) 
   SET @i = @i-1 
END

DROP TABLE #tmp
1
cheeves

あなたが実際にクリックしたいときに、誤って実行ボタンをクリックしたことがありますか?
デバッグ/解析/データベースの使用/クエリタブ間の切り替え/など。

そのボタンを安全な場所に移動する方法を次に示します。

ツール->カスタマイズ。必要な場所にボタンをドラッグします

あなたもすることができます :
-一般的に使用/未使用の他のボタンを追加/削除(ファイル/編集などのメニューバー内のコマンドにも適用)
-ボタンのアイコン画像を変更します(ボタン画像の変更の下の小さなブタを参照してください。lol)

1
waeva

sys.database_principlesのDEFAULT_SCHEMA設定

  • SQL Serverは、名前解決に優れた柔軟性を提供します。ただし、名前解決にはコストがかかり、オブジェクト参照を完全に修飾しないアドホックワークロードでは、著しくコストがかかる可能性があります。 SQL Server 2005では、各データベースプリンシパル(「ユーザー」とも呼ばれます)に対してDEFEAULT_SCHEMAの新しい設定が可能になり、TSQLコードを変更せずにこのオーバーヘッドを排除できます。

リンク

1
Sklivvz

Vardecimal Storage Format

  • SQL Server 2005は、vardecimalと呼ばれる数値および10進データ型の新しいストレージ形式を追加します。 Vardecimalは、行のすべてのインスタンスで未使用のバイトを節約できる10進型の可変長表現です。最大の節約は、10進数の定義は大きい(decimal(38,6)など)が格納されている値が小さい(0.0の値など)場合、または多数の繰り返し値が存在するか、データがまばらにある場合です。

リンク

1
Sklivvz

スケーラブルな共有データベース

  • スケーラブルな共有データベースを介して、コモディティマシンに同じ物理ドライブをマウントし、SQL Server 2005の複数のインスタンスが同じデータファイルのセットを処理できるようにします。セットアップでは、SQL Serverのすべてのインスタンスに重複するストレージが必要なく、cpu、メモリ、tempdb、および潜在的に他のローカルデータベースなどの独自のローカルリソースを持つ複数のSQL Serverインスタンスを通じて処理能力を追加できます。

リンク

1
Sklivvz

無料のアドイン SSMS Tools Pack をお勧めします。

コードスニペット

もう自分でSELECT * FROMと入力する必要はありません。 SSFと入力してEnterキーを押すだけです(他のキーにカスタマイズできます。Tabを好みます)。他の便利なスニペットはほとんどありません

SSC +タブ-COUNT(*)FROMを選択

SST +タブ-トップ10を選択* FROM

S +タブ-選択

I +タブ-INSERT

U +タブ-更新

W +タブ-WHERE

OB +タブ-ORDER BY

そしてリストは続きます。 SSMSツールパックメニューを使用して、リスト全体を確認およびカスタマイズできます。

実行ログ履歴

数日前に書いたアドホッククエリを保存して、車輪を再発明する必要がないようにできると気づいたことはありますか? SSMSツールパックはすべての実行履歴を保存し、日付またはクエリ内のテキストに基づいて検索できます。

データベースデータの検索

この機能は、データベース全体で文字列の出現を検索するのに役立ち、出現の合計数とともにテーブル名と列名を表示します。この機能を使用するには、オブジェクトエクスプローラーでデータベースを右クリックし、[データベースデータの検索]を選択します。

SQLのフォーマット

すべてのキーワードを大文字または小文字に設定します。クエリウィンドウを右クリックして、[テキストの書式設定]を選択します。 SSMSツールメニューでショートカットキーを設定できます。ただし、アライメント機能はありません。

CRUD SP Generation

テーブルを右クリックし、SSMSツール-> CRUDを作成して、SPの挿入、更新、削除、選択を生成します。 SPの内容は、SSMSツールメニューを使用してカスタマイズできます。

その他

その他の機能はほとんどありません

  1. グリッドモードでの検索結果。
  2. 結果セット、テーブル、データベースから挿入スクリプトを生成します。
  3. 実行計画アナライザー。
  4. 複数のデータベースで1つのスクリプトを実行します。

詳細については、 機能 ページをご覧ください

1
Sundeep Arun

このストアドプロシージャをマスターデータベースに追加するために使用します。

改善点:

  • ホスト名でトリムするので、コピーアンドペーストはVNCで機能します。
  • 現在ロックされているプロセスを監視するためのLOCKオプションが追加されました。

使用法:

  • EXEC sp_who3 'アクティブ'
  • EXEC sp_who3 'LOCK'
  • EXEC sp_who3 spid_No

それでおしまい。

CREATE procedure sp_who3
       @loginame sysname = NULL --or 'active' or 'lock'
as

declare  @spidlow   int,
         @spidhigh  int,
         @spid      int,
         @sid       varbinary(85)

select   @spidlow   =     0
        ,@spidhigh  = 32767


if @loginame is not NULL begin
    if upper(@loginame) = 'ACTIVE' begin
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid >= @spidlow and spid <= @spidhigh AND
              upper(cmd) <> 'AWAITING COMMAND'
        return (0)
    end
    if upper(@loginame) = 'LOCK' begin
        select spid , ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid >= 0 and spid <= 32767 AND
              upper(cmd) <> 'AWAITING COMMAND'
        AND convert(char(5),blocked) > 0
        return (0)
    end

end

if (@loginame is not NULL
   AND  upper(@loginame) <> 'ACTIVE'
   )
begin
    if (@loginame like '[0-9]%')    -- is a spid.
    begin
        select @spid = convert(int, @loginame)
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid = @spid
    end
    else
    begin
        select @sid = suser_sid(@loginame)
        if (@sid is null)
        begin
            raiserror(15007,-1,-1,@loginame)
            return (1)
        end
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
               ,cmd
        from  master.dbo.sysprocesses
        where sid = @sid
    end
    return (0)
end


/* loginame arg is null */
select spid,
       ecid,
       status
       , loginame=rtrim(loginame)
       , hostname=rtrim(hostname)
       , blk=convert(char(5),blocked)
       , dbname = case
                    when dbid = 0 then null
                    when dbid <> 0 then db_name(dbid)
                end
       ,cmd
from  master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh


return (0) -- sp_who

バルクデータのインポートおよびエクスポートに最適なBCP_INおよびBCP_OUT

0
sourabh

master..spt_values (具体的にはtype = 'p')は、 string splitting および 'binning'および time Interpolation 操作に非常に役立ちました。

0
StuartLC

sp_lock:現在のロックをすべて表示します。返されたデータは、次のようにさらに照会できます。

spid-_sp_who_とともに使用して、ロックの所有者を確認します。

objid-select object_name(objid)とともに使用して、ロックされているデータベースオブジェクトを確認します。

0
viniciushana

私のお気に入りのいくつか:

Sp2に追加-tools/options/scriptingの下のスクリプトオプション

スキーマを使用した新しいセキュリティ-2つのスキーマを作成します:user_access、admin_access。次のように、ユーザープロシージャを一方に、管理プロシージャをもう一方に配置します:user_access.showList、admin_access.deleteUser。スキーマのEXECUTEをアプリのユーザー/ロールに付与します。常にEXECUTEを付与する必要はありません。

組み込みの暗号化機能、ビュー(プレゼンテーション用に復号化)、およびトリガーを使用したベーステーブル(挿入/更新時に暗号化)を使用した暗号化。

0
Sam

OK、2セントです。

http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/

私はここですべてを書き直すのが面倒なので、私の投稿をチェックしてください。それは多くの人にとって些細なことかもしれませんが、それを「隠された宝石」と感じる人もいるでしょう。

編集:

しばらくして、コードを見るためにブログにジャンプする必要がないように、ここにコードを追加することにしました。

SELECT  T.NAME AS [TABLE NAME], C.NAME AS [COLUMN NAME], P.NAME AS [DATA TYPE], P.MAX_LENGTH AS[SIZE],   CAST(P.PRECISION AS VARCHAR) +‘/’+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM ADVENTUREWORKS.SYS.OBJECTS AS T
JOIN ADVENTUREWORKS.SYS.COLUMNS AS C
ON T.OBJECT_ID=C.OBJECT_ID
JOIN ADVENTUREWORKS.SYS.TYPES AS P
ON C.SYSTEM_TYPE_ID=P.SYSTEM_TYPE_ID
WHERE T.TYPE_DESC=‘USER_TABLE’;

または、すべてのユーザーテーブルをすべて取得する場合は、次のようにCURSORを使用します。

DECLARE @tablename VARCHAR(60)

DECLARE cursor_tablenames CURSOR FOR
SELECT name FROM AdventureWorks.sys.tables

OPEN cursor_tablenames
FETCH NEXT FROM cursor_tablenames INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT  t.name AS [TABLE Name], c.name AS [COLUMN Name], p.name AS [DATA Type], p.max_length AS[SIZE],   CAST(p.PRECISION AS VARCHAR) +‘/’+ CAST(p.scale AS VARCHAR) AS [PRECISION/Scale]
FROM AdventureWorks.sys.objects AS t
JOIN AdventureWorks.sys.columns AS c
ON t.OBJECT_ID=c.OBJECT_ID
JOIN AdventureWorks.sys.types AS p
ON c.system_type_id=p.system_type_id
WHERE t.name = @tablename
AND t.type_desc=‘USER_TABLE’
ORDER BY t.name ASC

FETCH NEXT FROM cursor_tablenames INTO @tablename
END

CLOSE cursor_tablenames
DEALLOCATE cursor_tablenames

追加リファレンス(私のブログ): http://dbalink.wordpress.com/2009/01/21/how-to-create-cursor-in-tsql/

0
MarlonRibunal
use db
go 

select o.name 
, (SELECT [definition] AS [text()] 
     FROM sys.all_sql_modules 
     WHERE sys.all_sql_modules.object_id=a.object_id 
     FOR XML PATH(''), TYPE
  )  AS Statement_Text
 , a.object_id
 , o.modify_date 

 FROM sys.all_sql_modules a 
 LEFT JOIN  sys.objects o ON a.object_id=o.object_id 
 ORDER BY  4 desc

--select * from sys.objects
0
Yordan Georgiev

パイプで区切られたIDの文字列に基づく結果を1つのステートメントで取得する(XMLを渡すか、最初に区切られた文字列をテーブルに変換する代わりに)

例:

DECLARE @nvcIDs nvarchar(max)
SET @nvcIDs = '|1|2|3|'

SELECT C.*
FROM tblCompany C
WHERE @nvcIDs LIKE '%|' + CAST(C.CompanyID as nvarchar) + '|%' 
0
Sheki

CTRL-Eは、クエリアナライザーで現在選択されているテキストを実行します。

0
Chris McCall

SQL Server Management Studioのキーボードショートカット...これにより、日々の作業でより迅速かつ迅速な結果が得られます。 http://sqlserver-qa.net/blogs/tools/archive/2007/04/25/management-studio-shortcut-keys.aspx

0
Satya SKJ

サブクエリを使用してコンマ区切りリストを作成し、最後にコンマを付けないようにすることができます。これは、これが利用可能になる前に使用されていた関数よりも効率的であると言われています。 2005年以降だと思います。

SELECT 
    Project.ProjectName,
    (SELECT
        SUBSTRING(
            (SELECT ', ' + Site.SiteName
            FROM Site
            WHERE Site.ProjectKey = Project.ProjectKey
            ORDER BY Project.ProjectName
    FOR XML PATH('')),2,200000)) AS CSV 
FROM Project

また、ネストされたクエリでFOR XML PATHを使用して、有用であると判断したXMLを選択することもできます。

0
Steve

Koltenのsp_change_users_loginの代替:

ALTER USER wacom_app WITH LOGIN = wacom_app
0
Michhes

文書化されていないものはここにあります: 文書化されていないが便利なSQLサーバープロシージャとDBCCコマンド

0
SQLMenace

SQL Server 2005の場合:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests
0

強制パラメーター化

  • パラメータ化により、SQL Serverはクエリプランの再利用を活用し、同様のクエリの後続の実行でのコンパイルと最適化のオーバーヘッドを回避できます。ただし、何らかの理由でアドホッククエリコンパイルのオーバーヘッドに悩まされるアプリケーションが数多くあります。クエリのコンパイル回数が多く、ワークロードにとってCPU使用率と応答時間の低下が重要な場合、強制パラメーター化が役立ちます。

リンク

0
Sklivvz

つかいます

information_schemaから*を選択します

sQLサーバー内のすべてのデータベース、ベーステーブル、sps、ビューなどをリストします。

0
Ramesh
use db
go      
DECLARE @procName varchar(100)      
DECLARE @cursorProcNames CURSOR      
SET @cursorProcNames = CURSOR FOR      
select name from sys.procedures where modify_date > '2009-02-05 13:12:15.273' order by modify_date desc     

OPEN @cursorProcNames      
FETCH NEXT      
FROM @cursorProcNames INTO @procName      
WHILE @@FETCH_STATUS = 0      
BEGIN      
-- see the text of the last stored procedures modified on 
-- the db , hint Ctrl + T would give you the procedures test 
set nocount off;      
exec sp_HelpText @procName --- or print them      
-- print @procName      

FETCH NEXT      
FROM @cursorProcNames INTO @procName      
END      
CLOSE @cursorProcNames      

select @@error  
0
Yordan Georgiev

文書化されていません

Itzik Ben-Ganの厚意によるRowNumber http://www.sqlmag.com/article/articleid/97675/sql_server_blog_97675.html

SET XACT_ABORT ONは、トランザクションのエラー時にすべてをロールバックします

すべてのsp_は、オンラインで本を閲覧するのに役立ちます

管理スタジオで常に使用するキーボードショートカットF6-結果を切り替えて、Alt + XまたはF5-Alt + TまたはAlt + Dを実行します。

0
user31269

SSMSを使用して、OSハードドライブ上のファイル内のテキストを検索します。正規表現を非常に簡単に作成し、任意のディレクトリを選別してテキストを置換または検索できます。これは、ウィンドウを使用するよりもずっと簡単です。

0

SQL Server 2005では、 sp-blocker-pss8 ストアドプロシージャを実行する必要がなくなりました。代わりに、次のことができます。

exec sp_configure 'show advanced options', 1;
reconfigure;
go
exec sp_configure 'blocked process threshold', 30;
reconfigure; 

その後、SQLトレースを開始し、エラーおよび警告グループでブロックされたプロセスレポートイベントクラスを選択できます。そのイベントの詳細 here

0
Logicalmind

@Gatekiller-日付だけを取得する簡単な方法は確かです

CAST(CONVERT(varchar,getdate(),103) as datetime)

ロケールでDD/MM/YYYYを使用しない場合は、103とは異なる値を使用する必要があります。ロケールコードについては、SQL Books OnlineのCONVERT関数を参照してください。

0
Ollie

sp_depends便利。特定のオブジェクトに依存するオブジェクトを表示します。

exec sp_depends 'fn_myFunction' 

この関数に依存するオブジェクトを返します(オブジェクトが元々正しい順序でデータベースに実行されていなかった場合、これは誤った結果をもたらします。)

0
Dave ODonnell