ラベル SQLServer の投稿を表示しています。 すべての投稿を表示
ラベル SQLServer の投稿を表示しています。 すべての投稿を表示

2013/04/05

SSMS IntelliSenseが言うことを聞かない時の対処


DBのオブジェクト構造を変更したとき、新しいオブジェクトでインテリセンスが効かなかったりする。
何かをきっかけに効くようになるため、放置していたが、ちょこちょこストアドやらビューやらを作ったり消したりしていると結構わけわからなくなるので調べてみた。

http://msdn.microsoft.com/ja-jp/library/ms173434.aspx

どうやら、ローカルキャッシュを持っているようで、これを更新することで最新の状態でインテリセンスを効かすことができるようだ。

方法としては以下の2パターン

1.[編集] → [IntelliSense] → [ローカルキャッシュの更新]
2.Shift + Ctrl + R

どちらも、クエリエディタが開いているときに操作可能な様。

まぁ、メニュー漁れよの一言だとは思うが。。。忘れそうなので記載する。

2012/05/24

SQLServerのすごいやつ2

本日教えてもらった便利なやつは以下の通り!

・sys.database_filesテーブル
これをみると、データベースの物理ファイルに関する情報がわかる!

・dbcc shrinkfile (データベース物理ファイル名, 0)
物理ファイルの圧縮を行う。

また、物理ファイルの圧縮を行う際に、データベースの「復旧モデル」によって圧縮具合が違う。
「完全」の場合、バックアップがなされていないと、DB物理ファイルに持ち続けるため容量が減らない。
 「単純」とかにしていると、一発で大分へるっぽい。

いつもこれで困るから、覚えておこうと思う。

2012/05/12

SQLServerのすごいやつ(隠しストアド編)

職場のDBマスターに教えてもらったSQLServerの隠しストアド

exec sp_MSforeachtable @command1 = "select '?'"

ヘルプに乗ってないやつらしく、かつ便利なやつなので覚えとくといいよ、とアドバイスいただいた。

 何ができるかというと。。。

sp_MSForeachtableで返されるのが、「スキーマ.テーブル名」の一覧

使い方としては、@command1で指定した文内の「?」に上記の「スキーマ.テーブル名」がはめ込まれる。

だから、全テーブルに一括でSQL文をブン投げたい場合に便利 らしい!!

たとえば、これ

CREATE TABLE #temp (
TABLE_NAME sysname,
rows sysname,
reserved sysname,
data varchar(32),
index_size varchar(254),
unused varchar(100)
)

 INSERT INTO #temp EXEC sp_MSforeachtable @command1 = "sp_spaceused '?'"

SELECT * FROM #temp order by table_name

sp_spaceusedで引数に渡したテーブルの使用容量をとれるストアドだが、
これに、sp_MSforeachtableを挟むと、各テーブルのテーブル使用容量を取り出せる。

SQL文がsp_MSforeachtableで取得したテーブル分繰り返されるので、いったん仮想テーブルに詰めて抽出すると、実行したDBのすべてのテーブルの使用容量一覧が取得できる。

べんりー!

2012/02/28

SQLServerでFKの一覧を取得したい

SQLServerでFKの一覧をずばっ!と取得するためには以下のようにINFORMATION_SCHEMAを用いる。

SELECT
    REF.CONSTRAINT_CATALOG AS [DB_NAME]
,    REF.CONSTRAINT_SCHEMA AS [SCHEMA]
,    REF.CONSTRAINT_NAME AS [FK_NAME]
,    COL_FK.TABLE_NAME AS [FK_TABLE_NAME]
,    COL_FK.COLUMN_NAME AS [FK_COLUMN_NAME]
,    COL_PK.TABLE_NAME AS [PK_TABLE_NAME]
,    COL_PK.COLUMN_NAME AS [PK_COLUMN_NAME]
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS REF
INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS COL_FK
        ON (REF.CONSTRAINT_NAME = COL_FK.CONSTRAINT_NAME)
INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS COL_PK
        ON (REF.UNIQUE_CONSTRAINT_NAME = COL_PK.CONSTRAINT_NAME)
ORDER BY
    COL_PK.TABLE_NAME
,    COL_PK.COLUMN_NAME

これで、FKの元と先を合わせて取得できちゃったりする。

べんりべんり

いじょ

2012/02/15

DB内のテーブルをすべて削除する

あまりにテーブル数があるDBのテストデータ作成で、いったんすべてのテーブルをクリアしたいという要望が出てきた。

で、すべてのテーブルをテーブル情報からとってきてがっ!と消すストアドを作ってみた。

さらに、ただ消すだけだと、外部キー制約に引っかかるので、いったん外部キー制約を無効にするためのストアドを拾った。


が、しかし。

外部キー制約を無効にしたままエラーで落ちてしまったら恐ろしいため、この案は却下。

もしかして、今後使えるかもしれないので残すことにする。

以下、一括ですべてのテーブルをクリアするストアド

    DECLARE @tableName NVARCHAR(255)
    DECLARE @schemaName NVARCHAR(255)
    DECLARE TABLE_LIST CURSOR FOR
        SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES

    SET NOCOUNT ON

    OPEN TABLE_LIST

    FETCH NEXT FROM TABLE_LIST
    INTO @tableName, @schemaName

    WHILE @@FETCH_STATUS = 0
    BEGIN

        EXECUTE ('TRUNCATE TABLE ' + @schemaName + '.' + @tableName)

        FETCH NEXT FROM TABLE_LIST
        INTO @tableName, @schemaName
    END

    CLOSE TABLE_LIST
    DEALLOCATE TABLE_LIST

すべてのスキーマを対象にしているので、最初のテーブル一覧を取得するところで適当に絞ってね!

次に、外部キーをがっとオンオフ

CREATE PROCEDURE pr_Disable_Triggers_v2
    @disable BIT = 1
AS
    DECLARE
        @sql VARCHAR(500),
        @tableName VARCHAR(128),
        @tableSchema VARCHAR(128)

    -- List of all tables
    DECLARE triggerCursor CURSOR
        FOR
    SELECT
        t.TABLE_NAME AS TableName,
        t.TABLE_SCHEMA AS TableSchema
    FROM
        INFORMATION_SCHEMA.TABLES t
    ORDER BY
        t.TABLE_NAME,
        t.TABLE_SCHEMA

    OPEN triggerCursor

    FETCH NEXT FROM triggerCursor
    INTO @tableName, @tableSchema

    WHILE ( @@FETCH_STATUS = 0 )
        BEGIN
            IF @disable = 1
                SET @sql = 'ALTER TABLE ' + @tableSchema
                    + '.[' + @tableName + '] DISABLE TRIGGER ALL'
            ELSE
                SET @sql = 'ALTER TABLE ' + @tableSchema
                    + '.[' + @tableName + '] ENABLE TRIGGER ALL'

            PRINT 'Executing Statement - ' + @sql

            EXECUTE ( @sql )
            FETCH NEXT FROM triggerCursor
            INTO @tableName, @tableSchema
        END

    CLOSE triggerCursor
    DEALLOCATE triggerCursor

これ、実は、拾ったやつそのまま。

一応拾った場所のアドレスは以下
http://msdn.microsoft.com/ja-jp/magazine/cc163442.aspx

テーブルが大量にあるDBを使うプロジェクトでテストのときに使えそうだね。確かに。

以上!!

2011/07/11

SQL Server 2005の表データをコピペしてExcelに貼り付けるときは

イラッとした。
絶対同じことやると思うので調べた結果をメモ

SQL Server 2005の表データをコピペしてExcelに貼り付けるときは
SQL Server Management Studioで、オブジェクトエクスプローラから「テーブルを開く」で、表示されたテーブルデータで左上見出し行の行番号列の交差する灰色文字なしの部分をクリック→コピー→Excelで貼り付けとすると日本語が文字化けする。

SQLのselect文の結果をコピペすると文字化けしないのに。。。

で、文字化けする場合は、形式を選択して貼り付け→Unicode テキスト で貼り付ければいいらしい。
http://remindbook.blogspot.com/2009/11/sql-server-2005excel.html