SQLServer

2014年10月 7日 (火)

decimalで小数点以下があるとソートがおかしくなる

SQL文のORDER BY の部分
T_S.SIZE_01は文字型
ORDER BY T_S.METHOD_CD,CONVERT(DECIMAL,T_S.SIZE_01),T_S.STEEL_CD,T_S.OFFCUTS_DIV
◆結果
METHOD_CD SIZE_01 STEEL_CD OFFCUTS_DIV O_RESULTW
01        3.00   0101 B12001 2320.176666
01        2.50   0101 B12001 125.975000
01        3.00   0101 B12002 97.206666
01        3.00   0201 B12001 34.706666
01        3.00   0201 B12002 1.955000
            ・
            ・
            ・

修正
ORDER BY T_S.METHOD_CD,CONVERT(FLOAT,T_S.SIZE_01),T_S.STEEL_CD,T_S.OFFCUTS_DIV
◆結果
METHOD_CD SIZE_01 STEEL_CD OFFCUTS_DIV O_RESULTW
01        2.50 0101 B12001 125.975000
01        3.00 0101 B12001 2320.176666
01        3.00 0101 B12002 97.206666
01        3.00 0201 B12001 34.706666
01        3.00 0201 B12002 1.955000
            ・
            ・
            ・

2013年9月 4日 (水)

トリガーを無効/有効にするコマンド

--トリガーを無効にする
DISABLE TRIGGER triT_COST_afterIU ON T_COST
--トリガーを有効にする
ENABLE TRIGGER triT_COST_afterIU ON T_COST

T_COST:テーブル名
triT_COST_afterIU:トリガー名

2012年5月 7日 (月)

リンクサーバーからだとエラーになる

サーバーAからリンクサーバーBを作成し、サーバーB上のデータベースBBBのビューr_kousuを検索する。
この時、リンクサーバーは検索のみの権限があるユーザーCを使用。
ビューr_kousuの項目renbanの元のテーブルで長さvarchar(10)→(12)へ変更したところ、
12ケタフルに入っているレコードで
「プロバイダー "sqlncli10" から列 "[B].[BBB].[dbo].[r_kousu].renban" の現在行の値を取得できません。
プロバイダーで使用されるデータ型ではデータ値がオーバーフローするので、変換できませんでした。」
というエラー発生。

ユーザーCでログオンして[r_kousu].renbanを検索することが出来たので、リンクサーバーの設定に何か
あるかと思い、いろいろ設定を変えてみたが駄目だった。
結果として、
・ビュー削除
・ビュー作成
・ユーザーCへの権限付与
を、やり直したら上手くいった。

所有者でないユーザーからアクセスする際、変更が反映されない。
何か方法があると思うが、今のところ分からない。

バージョン:SQLServer2008R2

2008年4月 4日 (金)

「オブジェクトが閉じている場合は、操作は許可されません。」回避

ADO利用しているプログラムで、それまで上手くいっていたのに突然
If Not rstXXX.EOF Then  で
「オブジェクトが閉じている場合は、操作は許可されません。」エラーが起こるようになった。
ネットで探して以下のことをやったら解消できた。
ストアドプロシージャの1行目(ASの後)に
SET NOCOUNT ON
を追加。
(ストアドプロシージャでSELECT文を作成してレコードセットで読んでいる)。
 
何故解消できるかは不明(ネットで参照したページにも書いてなかった)。
 

2007年12月11日 (火)

データベース 'xxxxxx' の開始中。

何でもない時に「データベース 'xxxxxx' の開始中。」がSQLServerのエラーログに何度も書き込まれ、
ずっと不審に思っていた(バージョン:SQL Server2000)。
ネットで調べてもマイクロソフトのサイトを調べても全く分からなかった。
あたりをつけてテストしたところ、以下のことが分かった。
 
データ量が増え、使用可能領域が一度でも0.00MBになったデータベースにアクセスがあるとこのログが書き込まれるようだ。
自動拡張して使用可能領域が出来ても一旦0.00MBになったことがあるデータベースだと出る。
EnterPriseManagerやInterDeveで見ただけでも出る。
 

2007年9月13日 (木)

SQLServerのデータベースのデータ保存先を変更する方法

SQL Server 2000
EnterpriseManagerManager使用
1.念のためバックアップ採取
2.データベースのデタッチを行う
  デタッチしたいデータベースを右クリック→すべてのタスク→データベースのデタッチ
3.データファイル(データベース名_Data.MDF)とログファイル(データベース名_Log.LDF)を移動
4.データベースのアタッチを行う
  「データベース」右クリック→すべてのタスク→データベースのアタッチ
 
※DBバックアップ作成→DB削除→保存先を指定してDB作成→DBの復元
 では元の場所にデータファイルができてしまい上手く行かない。
  
 

2005年6月30日 (木)

SQLServerのトレース採取方法

プロファイラを使うと、SQL Serverのトレースを採取できることが分かった。
使い方の詳細は
(出先でも必要になるかもしれないのでここにも記す。)
 
もっと早く知っていれば、便利だったのに・・・・・

2005年6月17日 (金)

バックアップログの切捨て方法

Microsoft SQL Server Ver7および8

頂いたメールより抜粋。
----------------------------------------------------------
トランザクションログのバックアップ方法は以下の通りです。

備忘録として以下に記述。
1.      Working等アプリケーションの停止を確認。
2.      念のためDBのフルバックアップ。
3.      クエリアナライザから以下のSQLを発行。
        backup log DB名 with No_log
4.      対象DBの「すべてのタスク」-「データベースの圧縮」を実行。
---------------------------------------------------------

3は
BACKUP LOG DB名 WITH TRUNCATE_ONLY
でも可。

ヘルプより抜粋
-----------------------------------------------------
NO_LOG | TRUNCATE_ONLY

ログのアクティブではない部分をバックアップ コピーをとらずに削除し、ログを切り捨てます。このオプションを使って領域を解放できます。ログ バックアップは保存されないため、バックアップ デバイスを指定する必要はありません。NO_LOG と TRUNCATE_ONLY はシノニムです。
-----------------------------------------------------

ヘルプより抜粋
-----------------------------------------------------
BACKUP LOG DB名 WITH TRUNCATE_ONLY
この命令は、トランザクションログの切捨てと呼ばれる命令です。この命令を実行しても、トランザクションログファイルの物理的なサイズは、小さくなりません。

トランザクションログファイルのサイズが 2 GBのときに、この命令を実行
しても、切捨てした後の物理サイズは、命令の実行前と同じで変わりません。

しかし切捨てしたことによって、そのトランザクションログファイルの中身がすべて捨てられたので、2 GBの大きさすべてを、新しいログレコードの記録に使う事ができるようになったので、しばらくの間はトランザクションログファイルのサイズは 2 GBのままでしょう。当分の間は自動拡張しません。
-----------------------------------------------------

別サーバー上のDBのテーブルを同時更新したい

トリガもリンクサーバーも初めてだった。テスト経過を書く。
Windows2003Server、SQL Server2000
リンクサーバーはWindowsNT、SQL Server7.0

1.リンクサーバーの追加
EXEC sp_addlinkedserver 'サーバー名', N'SQL Server'
EXEC sp_addlinkedsrvlogin 'サーバー名', 'false', NULL, 'User', 'Password'

2.リンクサーバー上のテーブルを更新してみる→OK

3.トリガを使って同一サーバー上で別DBのテーブルを更新してみる→OK

4.トリガを使ってリンクサーバー上のテーブルを更新してみる
下記エラー発生
サーバー : メッセージ 7391、レベル 16、状態 1、行 2
OLE DB プロバイダ 'SQLOLEDB' は分散トランザクションを開始できなかったので、要求した操作は実行されませんでした。[OLE/DB provider returned message: 指定されたトランザクション コーディネータに、新規トランザクションを参加できませんでした。]
<対応>
http://support.microsoft.com/kb/329332/JA
次に別の下記エラー発生
[OLE/DB provider returned message: このセッションでは、これ以上のトランザクションを開始できません。]
[OLE/DB provider returned message: このセッションでは、これ以上のトランザクションを開始できません。]
OLE DB エラー トレース [OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013:  ISOLEVEL=4096]。
OLE DB プロバイダ 'SQLOLEDB' でネストしたトランザクションを開始できません。 XACT_ABORT オプションが OFF に設定されているので、ネストしたトランザクションが必要です。
スクリプト C:\work\MUCSDATA\Connection1\リンクサーバー接続テスト.sql の実行を完了しました。
<参考>
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/acdata/ac_8_md_06_8tf7.asp

SET XACT_ABORT  ON をクエリアナライザで実行してみる→ダメ
これはトランザクションの実行のように更新前にしないといけないらしい。

トリガーを起動するテーブルを更新する更新文の前にSET XACT_ABORT  ON を記述して
実行してみる。
SET XACT_ABORT ON
INSERT INTO オーダー ([品目コード],オーダー番号) VALUES ('TEST_HIN_CD','T0521_3')
→OK

でもいちいち更新文の前にSET XACT_ABORT ON を追加する修正はできないので
トリガー内にSET XACT_ABORT ON を入れてやってみる。

CREATE TRIGGER triOrderInsert ON [dbo].[オーダー]
FOR INSERT
AS

SET XACT_ABORT ON

INSERT INTO サーバー名.kaneko.dbo.orderf
(oroode,orodno)

SELECT [品目コード],[オーダー番号] from inserted
 
→OK

やりたいことが可能なことが分かった。
でもこの調査に二日かかったな。