215

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 ステートメントからストアド プロシージャを呼び出す
  • キーワードによる手順の検索
  • データベース内のすべてのプロシージャを削除します
  • プログラムでデータベースのトランザクション ログをクエリします。

機能

  • ハッシュバイト()
  • EncryptByKey
  • PIVOT コマンド

その他

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

84 に答える 84

91

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

PRINT 'X'
GO 10

「X」を 10 回出力します。これにより、繰り返し作業を行うときに面倒なコピー/貼り付けを行う必要がなくなります。

于 2008-09-26T18:13:54.563 に答える
70

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

どの行がINSERT、UPDATE、またはDELETEされたかを知ることは非常に便利であり、OUTPUT句を使用すると、これを非常に簡単に行うことができます。これによりinserteddeleted(トリガーのように)呼び出される「仮想」テーブルにアクセスできます。

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

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

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

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

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

多くの情報が返される場合は、OUTPUTの出力を一時テーブルまたはテーブル変数(OUTPUT INTO @myInfoTable)にリダイレクトすることもできます。

非常に便利です-そしてほとんど知られていません!

マーク

于 2009-08-07T09:03:38.943 に答える
52

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

exec sp_msforeachtable "dbcc dbreindex('?')"

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

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

また、sp_MSforeachdb

于 2008-09-23T15:10:24.867 に答える
51

接続文字列のエクストラ:

MultipleActiveResultSets = true;

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

アプリケーション名=MyProgramName

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

于 2008-09-23T15:21:30.270 に答える
33

TableDiff.exe

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

リンク

于 2008-09-23T16:09:25.333 に答える
31

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

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())
于 2008-09-23T15:13:40.990 に答える
30

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

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

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

于 2010-07-20T15:22:36.447 に答える
23

行コンストラクター

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

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')
于 2009-12-18T19:39:27.307 に答える
22

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

于 2008-09-23T14:21:35.373 に答える
22

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

sp_help 'TableName'
于 2008-09-26T14:54:03.107 に答える
20

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

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

コマンドとのリンク

select * from sys.dm_exec_query_stats 
order by execution_count desc
于 2008-09-29T17:03:14.253 に答える
16

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

于 2008-10-08T23:36:51.570 に答える
16

EXCEPT と INTERSECT

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

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

于 2008-11-25T19:36:01.380 に答える
16

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

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
于 2008-09-23T17:56:07.870 に答える
15

これが隠れた機能かどうかはわかりませんが、偶然見つけて、多くの場合に役立つことがわかりました。カーソルを使用して select ステートメントをループするのではなく、1 つの 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,
于 2009-05-21T18:10:32.420 に答える
15

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

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
于 2008-09-23T15:56:16.393 に答える
15

テーブル チェックサム

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

行チェックサム

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
于 2008-09-23T15:56:53.443 に答える
14

ストアド プロシージャのコードが必要な場合は、次のことができます。

sp_helptext 'ProcedureName'

(隠し機能かどうかはわかりませんが、いつも使っています)

于 2008-09-23T16:56:14.503 に答える
13

ストアド プロシージャの秘訣は、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
于 2008-09-26T08:58:55.500 に答える
12

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

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

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

于 2009-02-10T15:22:30.683 に答える
10

ストアド プロシージャの引数の解析に役立ちます: 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
于 2008-09-23T14:47:43.407 に答える
9

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 以降で利用可能

于 2010-08-30T15:40:59.587 に答える
9

返却日のみ

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

また

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
于 2008-09-23T15:54:23.467 に答える
7

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

于 2008-09-23T23:17:05.227 に答える
7

私が便利だと思う機能をいくつか紹介しますが、多くの人は知らないようです。

sp_tables

現在の環境で照会できるオブジェクトのリストを返します。これは、シノニム オブジェクトを除く、FROM 句に表示されるすべてのオブジェクトを意味します。

リンク

sp_stored_procedures

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

リンク

于 2008-09-23T14:18:59.937 に答える
7

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

select row_number() over (order by (select 1)), * from dbo.Table as t
于 2010-09-05T15:37:31.463 に答える
7

永続計算列

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

リンク

于 2008-09-29T17:00:54.993 に答える
7

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

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 )
于 2008-09-23T15:55:41.823 に答える
6

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

EXEC master..xp_fixeddrives

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

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

詳細はこちら

于 2008-09-23T15:09:22.047 に答える
6

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

declare @orderby varchar(10)

set @orderby = 'NAME'

select * 
    from Users
    ORDER BY 
        CASE @orderby
            WHEN 'NAME' THEN LastName
            WHEN 'EMAIL' THEN EmailAddress
        END
于 2008-11-26T15:43:39.977 に答える
6

SQLCMD

何度も実行するスクリプトがあるが、細かい部分を変更する必要がある場合は、ssms をsqlcmd モードで実行するのが最適です。sqlcmd コマンド ラインもかなり気の利いたものです。

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

  • 変数を設定できます。sp_exec フープを飛び越える必要のない適切な変数
  • 複数のスクリプトを次々に実行できます
  • これらのスクリプトは、「外部」スクリプトの変数を参照できます

Red Gate の Simpletalk は、これ以上突っ込むのではなく、sqlcmd の素晴らしいまとめを行いました - The SQLCMD Workbench。Donabel Santos にも、優れた SQLCMD の例がいくつかあります。

于 2009-06-23T09:53:23.417 に答える
6

シンプルですが便利なものを次に示します。

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

于 2009-12-07T16:01:31.277 に答える
6

EncryptByKeyによる単純な暗号化

于 2008-09-23T14:34:16.340 に答える
5

これは、すべての 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
于 2008-09-23T15:36:33.057 に答える
4

キーワードで手順を検索

特定のテキスト(テーブル名、列名、変数名、TODOなど)が含まれているプロシージャはどれですか?

SELECT OBJECT_NAME(ID) FROM SysComments 
WHERE Text LIKE '%SearchString%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
于 2008-10-01T21:26:32.390 に答える
4

バッチセパレーター

ほとんどの人はそれを知りませんが、「GO」はSQLコマンドではありません。これは、クライアントツールで使用されるデフォルトのバッチセパレータです。あなたはそれについてのより多くの情報をBooksOnlineで見つけることができます。

バッチセパレータを変更するには、ManagementStudioで[ツール]->[オプション]を選択し、[クエリの実行]セクションで[バッチセパレータオプション]を変更します。

いたずら以外にこれをやりたい理由はわかりませんが、やや興味深い雑学クイズです。

于 2009-12-18T20:12:05.133 に答える
4

わかりました、ここに私が残したいくつかがあります。残念ながら私は開始を逃しましたが、それを続けてください。ここにはいくつかのトップのものがあります!

クエリ アナライザー

  • Alt+F1sp_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 歳以上の人のセットと結合して結合結果を出力することができます。

于 2009-06-30T20:28:57.747 に答える
4

または近くの日付を計算するために使用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)
于 2011-07-14T21:21:39.107 に答える
4

この小さなスクリプトは、サーバーにデプロイされたプロシージャのテキストを表示するのに非常に便利です。

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
于 2008-09-23T16:43:33.207 に答える
4

トレースフラグ!"1204" は、SQL Server 2000 でのデッドロック デバッグに非常に役立ちました (2005 には、このためのより優れたツールがあります)。

于 2008-09-24T13:11:34.893 に答える
4

sp_who2、sp_who と同じですが、ブロックのトラブルシューティングのためのより多くの情報があります

于 2008-09-23T15:06:08.963 に答える
4
sp_executesql 

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

于 2008-10-24T16:21:10.713 に答える
3

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

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

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

于 2009-12-18T19:36:19.747 に答える
2

ストアドプロシージャ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はビットマスクを使用して、返されるものを解読します。

于 2010-07-20T14:46:19.097 に答える
2

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

于 2009-12-18T14:23:58.037 に答える
2

これは、トランザクションを検索する必要があったため、今日学んだことです。

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

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

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

于 2008-10-16T02:02:57.983 に答える
2

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

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

リンク

于 2008-09-29T17:00:24.107 に答える
2

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

于 2008-10-24T16:36:34.567 に答える
2

私のお気に入りは 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"'

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

于 2008-09-26T14:31:04.300 に答える
2

頑固なデータベース開発者によるそれに対する激しい反応のように見えるものに基づいて、CLR統合はすぐそこにランク付けされます. =)

于 2009-01-07T19:08:36.860 に答える
1

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

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

ツール-オプション-クエリ結果-SQLServer-グリッドへの結果チェックマーク「結果をコピーまたは保存するときに列ヘッダーを含める」

この時点で新しい接続を確立してから、クエリを実行する必要があります

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

また、結果をコピーしてExcelに

colヘッダーのみをコピーする

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

「転置」にチェックマークを付ける

わかった

[この時点で「、」を追加して自動入力することをお勧めします]

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

于 2009-03-31T13:41:10.770 に答える
1


Debug / Parse / Use Database / Switch between query tabs / etc.を実際にクリックしたいときに、間違って Execute ボタンをクリックしてしまったことはありませんか?

そのボタンを安全な場所に移動する方法は次のとおりです。

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

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

于 2011-05-26T00:48:49.107 に答える
1

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

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
于 2009-05-29T14:18:09.120 に答える
1

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
于 2008-09-23T16:46:28.490 に答える
1

sys.database_principles の DEFAULT_SCHEMA 設定

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

リンク

于 2008-09-29T17:01:31.653 に答える
1

次のような多くの機能を備えた無料のアドインSSMS Tools Packをお勧めします。

コード スニペット

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

SSC + タブ - SELECT COUNT(*) FROM

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

S + タブ - 選択

I + タブ - 挿入

U + タブ - 更新

W + タブ - どこでも

OB + タブ - ORDER BY

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

実行ログ履歴

数日前に作成したアドホック クエリを保存しておくことで、最初からやり直す必要がなくなったことに気付いたことはありますか? SSMS ツール パックはすべての実行履歴を保存し、日付またはクエリ内の任意のテキストに基づいて検索できます。

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

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

SQL のフォーマット

すべてのキーワードを大文字または小文字に設定します。クエリ ウィンドウを右クリックし、[テキストの書式設定] を選択します。SSMS ツール メニューでショートカット キーを設定できます。しかし、それは整列機能を欠いています。

CRUD SP生成

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

その他

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

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

詳細については、機能ページにアクセスしてください。

于 2011-12-10T15:44:41.360 に答える
1

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

于 2009-09-01T19:00:27.727 に答える
1

これらは、私が気に入っている 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 を押すと、テーブルの構造が表示されます。

于 2010-01-08T00:56:15.420 に答える
1

vardecimal ストレージ形式

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

リンク

于 2008-09-29T17:02:46.313 に答える
1

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

  • スケーラブルな共有データベースを使用すると、同じ物理ドライブを市販のマシンにマウントして、SQL Server 2005 の複数のインスタンスを同じデータ ファイル セットで動作させることができます。このセットアップでは、SQL Server のすべてのインスタンスに重複したストレージを必要とせず、CPU、メモリ、tempdb などの独自のローカル リソースと、場合によっては他のローカル データベースを持つ複数の SQL Server インスタンスを使用して、追加の処理能力を実現できます。

リンク

于 2008-09-29T17:03:32.647 に答える
1

半隠し機能であるテーブル/ストアド プロシージャ フィルター機能は非常に便利です...

SQL Server Management Studio オブジェクト エクスプローラーで、 [テーブル]または[ストアド プロシージャ] フォルダーを右クリックし、[フィルター] メニュー、[フィルター設定]の順に選択して、[次を含む名前]行に名前の一部を入力します。

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

于 2008-09-23T15:49:19.220 に答える
0

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

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

ロケールでDD/MM / YYYYを使用しない場合は、103とは異なる値を使用する必要があります。SQLBooksOnlineでロケールコードのCONVERT関数を検索します。

于 2008-09-26T17:18:55.130 に答える
0

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/

于 2008-10-24T07:44:26.603 に答える
0

BULKデータのインポートとエクスポートに最適なBCP_INとBCP_OUT

于 2010-10-07T11:01:43.600 に答える
0
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  
于 2009-02-12T19:42:08.420 に答える
0

文書化されていない

RowNumber 提供: Itzik Ben-Gan 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 - それぞれテキストまたはグリッドで結果を表示する

于 2008-10-24T18:08:37.127 に答える
0

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

spid -sp_who誰がロックを所有しているかを確認するために使用します。

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

于 2011-11-21T18:08:28.737 に答える
0

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

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

その後、SQL トレースを開始し、[エラーと警告] グループで [ブロックされたプロセス] レポート イベント クラスを選択できます。そのイベントの詳細はこちら.

于 2008-11-25T19:57:47.950 に答える
0

master..spt_values (具体的には type='p') は、文字列の分割と「ビニング」および時間補間操作に非常に役立ちました。

于 2011-10-25T13:44:40.477 に答える
0

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

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

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

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

于 2008-10-20T18:49:30.197 に答える
0

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

exec sp_depends 'fn_myFunction' 

この関数に依存するオブジェクトを返します (オブジェクトが最初に正しい順序でデータベースに実行されていない場合、誤った結果が返されることに注意してください)。

于 2008-11-04T18:36:12.233 に答える
0

CTRL-E は、Query Analyzer で現在選択されているテキストを実行します。

于 2009-07-16T21:09:07.057 に答える
0

文書化されていないものは次のとおりです。文書化されていないが便利な SQL サーバーの Procs および DBCC コマンド

于 2009-01-07T20:45:59.847 に答える
0

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

于 2011-03-24T08:32:43.590 に答える
0

使用する

select * from information_schema

SQLサーバーのすべてのデータベース、ベーステーブル、SP、ビューなどを一覧表示します。

于 2010-07-02T09:36:21.720 に答える
0

単一のステートメント内の ID のパイプ区切り文字列に基づいて結果を返す (xml を渡すか、最初に区切り文字列をテーブルに変換する代わりに)

例:

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

SELECT C.*
FROM tblCompany C
WHERE @nvcIDs LIKE '%|' + CAST(C.CompanyID as nvarchar) + '|%' 
于 2009-05-21T18:17:19.240 に答える
0
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
于 2009-02-12T20:18:12.420 に答える
0

サブクエリを使用してカンマ区切りのリストを作成し、最後の末尾のカンマを持たないようにすることができます。これは、これが利用可能になる前に使用されていた関数よりも効率的であると言われています。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 を選択することもできます。

于 2011-11-09T19:54:42.803 に答える
0

強制的なパラメータ化

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

リンク

于 2008-09-29T17:02:20.030 に答える
0

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

改良点:

  • ホスト名をトリムして、コピーと貼り付けが VNC で機能するようにします。
  • 現在ロックされているプロセスを監視するための LOCK オプションを追加しました。

使用法:

  • EXEC sp_who3 'ACTIVE'
  • EXEC sp_who3 'ロック'
  • 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
于 2009-06-30T13:26:12.290 に答える
0

Kolten の sp_change_users_login の代替:

ALTER USER wacom_app WITH LOGIN = wacom_app
于 2010-07-19T06:50:41.183 に答える
0

SSMS を使用して、OS ハードドライブ上のファイル内のテキストを検索します。これにより、正規表現を記述し、ディレクトリをふるいにかけてテキストを置換または検索することが非常に簡単になります。これは、Windowsを使用するよりも簡単だといつも思っていました。

于 2012-01-04T04:02:05.767 に答える
0

SQL Server 2005 の場合:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests
于 2008-09-23T16:05:02.427 に答える