SQL Server の隠された機能は何ですか?
たとえば、文書化されていないシステムストアドプロシージャ、非常に有用であるが十分に文書化されていないことを行うためのトリックはありますか?
すべてのすばらしい答えをみんなに感謝!
ストアドプロシージャ
スニペット
関数
その他
GO
がバッチを繰り返した後の数Management Studioでは、GOバッチ終了マーカーの後に数字を入力して、その回数だけバッチを繰り返すことができます。
PRINT 'X'
GO 10
「X」を10回印刷します。これにより、繰り返しの作業を行うときに面倒なコピー/貼り付けからあなたを救うことができます。
多くの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
)。
非常に便利-ほとんど知られていない!
マーク
sp_msforeachtable
:「?」でコマンドを実行します各テーブル名に置き換えられます。例えば.
exec sp_msforeachtable "dbcc dbreindex('?')"
テーブルごとに最大3つのコマンドを発行できます
exec sp_msforeachtable
@Command1 = 'print ''reindexing table ?''',
@Command2 = 'dbcc dbreindex(''?'')',
@Command3 = 'select count (*) [?] from ?'
また、sp_MSforeachdb
接続文字列の追加:
MultipleActiveResultSets = true;
これにより、単一のデータベース接続でADO.Net 2.0以上が複数の転送専用、読み取り専用の結果セットを読み取り、多くの読み取りを行う場合のパフォーマンスを向上させることができます。クエリの種類が混在している場合でも、有効にすることができます。
アプリケーション名= MyProgramName
Sysprocessesテーブルを照会してアクティブな接続のリストを表示したい場合、プログラムの名前は「.Net SqlClient Data Provider」ではなく、program_name列に表示されます。
TableDiff.exe
ランダムな順序で行を返すためのあまり知られていないTSQLテクニック:
-- Return rows in a random order
SELECT
SomeColumn
FROM
SomeTable
ORDER BY
CHECKSUM(NEWID())
Management Studioでは、次の方法でテーブルの列のカンマ区切りリストをすばやく取得できます。
これは、テーブルを右クリックして[スクリプトテーブル...]を選択し、次に[挿入...]を選択することで返される凶悪な形式を使用したくない場合に便利です。フォルダー内に含まれる名前のコンマ区切りリスト。
行コンストラクタ
単一の挿入ステートメントで複数行のデータを挿入できます。
INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
(2, 'Blue'),
(3, 'Green'),
(4, 'Yellow')
HashBytes() は、入力のMD2、MD4、MD5、SHA、またはSHA1ハッシュを返します。
テーブル構造、インデックス、および制約を知りたい場合:
sp_help 'TableName'
最も人気のあるクエリを把握する
リンク コマンドで
select * from sys.dm_exec_query_stats
order by execution_count desc
正確に隠されていないことは知っていますが、 [〜#〜] pivot [〜#〜] コマンドについて知っている人はあまり多くありません。カーソルを使用するストアドプロシージャを変更し、2分の時間をかけて、1/10の行数である高速の6秒のコードを実行することができました。
精巧な結合とサブクエリを記述する代わりに、これらの2つのキーワードは、2つのクエリ結果を比較するときにクエリの意図を表現する、はるかに簡潔で読みやすい方法です。 SQL Server 2005の新機能は、長年TSQL言語にすでに存在していたUNIONを強力に補完します。
EXCEPT、INTERSECT、およびUNIONの概念は、すべての最新のRDBMSで使用されるリレーショナルモデリングの基礎および基盤となる集合論の基本です。これで、TSQLを使用して、ベン図の結果をより直感的かつ簡単に生成できるようになりました。
テスト目的などのためにデータベースを復元するときに便利です。ログインIDを正しく再マップします。
EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
データベースへのすべての接続をドロップします。
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
これが隠された機能であるかどうかはわかりませんが、私はこれにつまずいて、多くの機会に役立つことがわかりました。カーソルを使用して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,
テーブルチェックサム
Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)
行チェックサム
Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
ストアドプロシージャのコードが必要な場合:
sp_helptext 'ProcedureName'
(隠された機能かどうかはわかりませんが、私は常にそれを使用しています)
ストアドプロシージャの秘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
SQL Server 2005/2008でSELECTクエリ結果に行番号を表示するには:
SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
GrandTotal, CustomerId, PurchaseDate
FROM Orders
ORDER BYは強制条項です。 OVER()句は、指定された列(この場合はOrderId)でデータを並べ替え、並べ替えの結果に従って番号を割り当てるようにSQLエンジンに指示します。
ストアドプロシージャの引数の解析に便利: 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
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以降で利用可能
返却日のみ
Select Cast(Floor(Cast(Getdate() As Float))As Datetime)
または
Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
日付が現在の週のどこかにあるレコードを検索します。
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 )
隠された機能ではなく、Management StudioのTools\Options\Keyboardでキーマッピングを設定します。Alt+ F1のデフォルトはsp_help "selected text"ですが、sp_helptext "selected text"にCtrl + F1を追加しないと生きられません。
並べ替えるのに適した列がない場合や、テーブルのデフォルトの並べ替え順序が必要で、各行を列挙したい場合があります。そのためには、「order by」句に「(select 1)」を入力すると、必要なものが得られます。きちんとした、え?
select row_number() over (order by (select 1)), * from dbo.Table as t
永続計算列
/ *最大の空き容量を持つ固定ドライブを見つけます。ファイルをコピーして、どのディスクが最も速いかを推定することもできます* /
EXEC master..xp_fixeddrives
/ *使用または参照の前にファイルに関する仮定を確認* /
EXEC master..xp_fileexist 'C:\file_you_want_to_check'
EncryptByKey を使用した単純な暗号化
これはシンプルですが便利なものです:
テーブルの内容を手動で編集している場合、Control-と入力して列にNULLを挿入を実行できます。
今週学んだ最も驚くべきことは、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
何度も実行するスクリプトを持っているが、わずかな詳細を変更する必要がある場合、 sqlcmd mode でssmsを実行するのは素晴らしいです。 sqlcmdコマンドライン も非常に洗練されています。
私のお気に入りの機能は次のとおりです。
Red GateによるSimpletalkは、これ以上のことを言うのではなく、sqlcmdのすばらしいまとめを行いました- The SQLCMD Workbench 。 Donabel Santosには素晴らしい SQLCMDの例 もあります。
これは、最終更新日ごとにすべての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
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)
トレースフラグ ! 「1204」は、SQL Server 2000でのデッドロックデバッグに非常に貴重でした(2005にはこれに適したツールがあります)。
キーワードによる手順の検索
特定のテキスト(テーブル名、列名、変数名、TODOなど)を含むプロシージャは何ですか?
SELECT OBJECT_NAME(ID) FROM SysComments
WHERE Text LIKE '%SearchString%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
この小さなスクリプトは、サーバーに展開された手順のテキストを見るのに非常に便利です。
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
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人以上の同じ人々のセットと結合し、結合された結果を出力できます。
バッチセパレーター
ほとんどの人はそれを知りませんが、「GO」はSQLコマンドではありません。これは、クライアントツールで使用されるデフォルトのバッチ区切り文字です。詳細については Books Online をご覧ください。
Management Studioで[ツール]-> [オプション]を選択し、[クエリ実行]セクションで[バッチセパレーター]オプションを変更して、バッチセパレーターを変更できます。
なぜいたずら以外でこれをしたいのかはわかりませんが、ちょっと面白いトリビアです。
sp_executesql
文字列内のステートメントを実行します。 実行と同じですが、パラメータを返すことができます
sp_who2、sp_whoと同じですが、トラブルシューティングブロックの詳細情報が含まれています
SQL Server Management Studio(SSMS)では、オブジェクトエクスプローラーでオブジェクト名を強調表示し、Ctrl-Cを押して名前をクリップボードにコピーできます。
F2キーを押すか、右クリックしてオブジェクトの名前を変更して名前をコピーする必要はありません。
オブジェクトをオブジェクトエクスプローラーからクエリウィンドウにドラッグアンドドロップすることもできます。
SQL 2000+ DBCC DROPCLEANBUFFERS
:バッファをクリアします。バッファがクリーンなときにクエリの速度をテストするのに役立ちます。
ストアドプロシージャ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は、ビットマスクを使用して、返されるものを解読します。
私はDBAではなくプログラマーなので、私のお気に入りの隠し機能は SMOライブラリ です。データベース/テーブル/列の作成と削除から、スクリプト作成からバックアップと復元まで、SQL Serverのほとんどすべてを自動化できます。 SQL Server Management Studioで実行できる場合は、SMOで自動化できます。
取引を検索する必要があったため、今日私が学んだものを紹介します。
:: fn_dblog
これにより、データベースのトランザクションログを照会できます。
USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)
私のお気に入りはmaster..xp_cmdshellです。サーバーのコマンドプロンプトからコマンドを実行し、出力を確認できます。サーバーにログインできない場合は非常に便利ですが、情報を取得するか、何らかの方法で制御する必要があります。
たとえば、SQL Serverが実行されているサーバーのC:ドライブのフォルダーを一覧表示するには。
サービスを開始および停止することもできます。
master..xp_cmdshell 'sc query "My Service"'
master..xp_cmdshell 'sc stop "My Service"'
master..xp_cmdshell 'sc start "My Service"'
非常に強力ですが、セキュリティ上のリスクもあります。簡単に使用できてサーバー上で悪いことをする可能性があるため、多くの人が無効にします。ただし、アクセスできる場合は、非常に便利です。
ログオンイベントのトリガー
強化されたデータベース開発者によるそれに対する激しい反応と思われるものに基づいて、CLR統合はすぐそこにランクされます。 =)
ストアドプロシージャを実行し、さらに処理するために(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
隠された機能であるテーブル/ストアドプロシージャフィルター機能は本当に便利です...
SQL Server Management StudioObject Explorerで、右クリックしてTablesまたはストアドプロシージャフォルダー、フィルターメニューを選択してからフィルター設定を選択し、Name contains行。
同様に、Remove Filterを使用して、すべてのテーブル/ストアドプロシージャを再度表示します。
列ヘッダーのリストを垂直形式で取得します。
グリッド結果の列名をコピーする
ツール-オプション-クエリ結果-SQL Server-グリッドへの結果「結果のコピーまたは保存時に列ヘッダーを含める」
この時点で新しい接続を作成し、クエリを実行する必要があります
グリッドから結果をコピーすると、列ヘッダーが取得されます
また、結果をExcelにコピーする場合
Colヘッダーのみをコピー
特殊貼り付け(コピー領域に重なってはいけません)
「トランスポーズ」にチェックを入れる
OK
[「、」を追加し、この時点で自動入力することもできます]
垂直形式の列のインスタントリストがあります
これらは、私が気に入っている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を押すと、テーブルの構造が表示されます。
Osqlユーティリティを使用してコマンドラインクエリ/スクリプト/バッチを実行する
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
あなたが実際にクリックしたいときに、誤って実行ボタンをクリックしたことがありますか?
デバッグ/解析/データベースの使用/クエリタブ間の切り替え/など。
そのボタンを安全な場所に移動する方法を次に示します。
ツール->カスタマイズ。必要な場所にボタンをドラッグします
あなたもすることができます :
-一般的に使用/未使用の他のボタンを追加/削除(ファイル/編集などのメニューバー内のコマンドにも適用)
-ボタンのアイコン画像を変更します(ボタン画像の変更の下の小さなブタを参照してください。lol)
sys.database_principlesのDEFAULT_SCHEMA設定
Vardecimal Storage Format
スケーラブルな共有データベース
無料のアドイン 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ツールパックはすべての実行履歴を保存し、日付またはクエリ内のテキストに基づいて検索できます。
この機能は、データベース全体で文字列の出現を検索するのに役立ち、出現の合計数とともにテーブル名と列名を表示します。この機能を使用するには、オブジェクトエクスプローラーでデータベースを右クリックし、[データベースデータの検索]を選択します。
すべてのキーワードを大文字または小文字に設定します。クエリウィンドウを右クリックして、[テキストの書式設定]を選択します。 SSMSツールメニューでショートカットキーを設定できます。ただし、アライメント機能はありません。
テーブルを右クリックし、SSMSツール-> CRUDを作成して、SPの挿入、更新、削除、選択を生成します。 SPの内容は、SSMSツールメニューを使用してカスタマイズできます。
その他の機能はほとんどありません
詳細については、 機能 ページをご覧ください
このストアドプロシージャをマスターデータベースに追加するために使用します。
改善点:
使用法:
それでおしまい。
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
master..spt_values (具体的にはtype = 'p')は、 string splitting および 'binning'および time Interpolation 操作に非常に役立ちました。
sp_lock:現在のロックをすべて表示します。返されたデータは、次のようにさらに照会できます。
spid-_sp_who
_とともに使用して、ロックの所有者を確認します。
objid-select object_name(objid)
とともに使用して、ロックされているデータベースオブジェクトを確認します。
私のお気に入りのいくつか:
Sp2に追加-tools/options/scriptingの下のスクリプトオプション
スキーマを使用した新しいセキュリティ-2つのスキーマを作成します:user_access、admin_access。次のように、ユーザープロシージャを一方に、管理プロシージャをもう一方に配置します:user_access.showList、admin_access.deleteUser。スキーマのEXECUTEをアプリのユーザー/ロールに付与します。常にEXECUTEを付与する必要はありません。
組み込みの暗号化機能、ビュー(プレゼンテーション用に復号化)、およびトリガーを使用したベーステーブル(挿入/更新時に暗号化)を使用した暗号化。
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/
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
パイプで区切られた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) + '|%'
CTRL-Eは、クエリアナライザーで現在選択されているテキストを実行します。
SQL Server Management Studioのキーボードショートカット...これにより、日々の作業でより迅速かつ迅速な結果が得られます。 http://sqlserver-qa.net/blogs/tools/archive/2007/04/25/management-studio-shortcut-keys.aspx
サブクエリを使用してコンマ区切りリストを作成し、最後にコンマを付けないようにすることができます。これは、これが利用可能になる前に使用されていた関数よりも効率的であると言われています。 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を選択することもできます。
Koltenのsp_change_users_loginの代替:
ALTER USER wacom_app WITH LOGIN = wacom_app
文書化されていないものはここにあります: 文書化されていないが便利なSQLサーバープロシージャとDBCCコマンド
SQL Server 2005の場合:
select * from sys.dm_os_performance_counters
select * from sys.dm_exec_requests
強制パラメーター化
つかいます
information_schemaから*を選択します
sQLサーバー内のすべてのデータベース、ベーステーブル、sps、ビューなどをリストします。
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
文書化されていません
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を実行します。
SSMSを使用して、OSハードドライブ上のファイル内のテキストを検索します。正規表現を非常に簡単に作成し、任意のディレクトリを選別してテキストを置換または検索できます。これは、ウィンドウを使用するよりもずっと簡単です。
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 。
@Gatekiller-日付だけを取得する簡単な方法は確かです
CAST(CONVERT(varchar,getdate(),103) as datetime)
ロケールでDD/MM/YYYYを使用しない場合は、103とは異なる値を使用する必要があります。ロケールコードについては、SQL Books OnlineのCONVERT関数を参照してください。
sp_depends
便利。特定のオブジェクトに依存するオブジェクトを表示します。
exec sp_depends 'fn_myFunction'
この関数に依存するオブジェクトを返します(オブジェクトが元々正しい順序でデータベースに実行されていなかった場合、これは誤った結果をもたらします。)