Microsoft SQL Server 総合スレ3【MS SQL】
1 :
NAME IS NULL :
2005/08/14(日) 10:05:39 ID:diJAGCwi
淡々と1000にいってしまってたのでたてました。 即死回避にご協力ください。
スレタイ、「MS SQL」だけだとMySQLとみまちがえるので一応変えました。 (検索用に一応残してあります)
m9(^Д^)プギャー
乙!
ヾ(*´∀`*)ノキャッキャ
8 :
前スレ992 :2005/08/15(月) 00:47:45 ID:???
結局ソースを書き直したらよく分らないうちにDBにアクセスできるようになりました 答えてくれた人ありがとう そしてSAK万歳
9 :
NAME IS NULL :2005/08/15(月) 11:16:44 ID:yAMXf9cW
SQL-Server2000で、DBのバックアップを取りたいんですけど、 ABC-DEF って名前のDBなので、 '-' の近くに無効な構文があります。 とクエリアナライザでエラーになります。 Backup DataBase ABC-DEF TO DISK='C:\WORK\aaa.bak' どうすればよいでしょうか? すいません、素人質問ですが宜しくお願いします。
>>9 >Backup DataBase ABC-DEF TO DISK='C:\WORK\aaa.bak'
"ABC-DEF"か
[ABC-DEF]
Books Online
区切られた識別子
を参照のこと
SQL Server 2000 を使用しています。 getdate()で取得した日付をテーブルに更新しているのですが、このとき時間情報を 切り落とす方法がないでしょうか? つまり、#2005/8/19 10:11:12# を #2005/8/19 00:00:00# としたいのです。 一応、convert()を使って切り落とすことができたのですが、一度文字列に変換して いるため効率が悪そうな感じがします。 他によい方法がありましたら教えてください。 ちなみにORACLEだとround()でできるようなのですが、SQL Server はダメでした。
>>11 GETDATE() と CONVERT(VARCHAR, GETDATE(), 111) の違いで問題になるほどの効率低下があったのか?
また仮に SQL Server に ROUND に相当する関数があったとして、CONVERT よりその関数の方が
効率が良いと思えるのはなぜ?
妄想だけで何もしていないお前の頭の方がよっぽど効率が悪いだろ。
そろそろANSI SQLの date と interval にあたる年月日のみと時間差を扱うデータ型が欲しいよ。
ユーザ定義関数に関する質問です。 SUM()関数のような集約関数を作りたいのですが、HELPをみても作り方がわかりません でした。そもそも作れるのでしょうか?作るとしたらどのようにするのでしょうか? ヒントでもうろ覚えでもいいので、お願いしますm(。_。)m
2005
SQL ServerのCALについて質問です。 後からCALを追加購入するとします。すると、媒体(CD-ROM)か何かが 付いてくるのですか?インストール的な作業は発生するのでしょうか? クライアントPC側に、何か設定するのでしょうか? サーバ側に何か設定するのでしょうか? それとも、サーバにもクライアント側にも、何か追加設定が必要なのでしょうか? MSのWebを見る限り、的を得た記事がなく、イメージがぜんぜん沸いてきません。
17 :
NAME IS NULL :2005/08/29(月) 12:30:28 ID:b6IMjBrb
18 :
NAME IS NULL :2005/08/29(月) 20:34:35 ID:5h1QjMxz
CALを買うと、何が送られてくるのでしょう?どこに何を設定するのでしょう?サーバ側に設定するのでしょうか、クライアントに何かインストールするのでしょうか? MSDNやTECHNET、リソースキットにも、詳しい説明がまったく見当たらない。
>>18 CD KEYが送られてくるわけではない。CALは何ライセンス持ってますという証明書に過ぎない。
システム的なチェックは何もかけていないので、サーバーにもクライアントにも特に設定することは無い。
>19 ライセンスマネージャが無かったか? まぁ、あれはイベントログに警告が出るだけだが。 後、カウント方法が間抜けで正しくライセンスに準拠している使い方でも 警告が出るんだよな。
>>20 あれは起動手動にして使わないようにしています。
22 :
NAME IS NULL :2005/08/30(火) 10:19:05 ID:EQtVBQof
>17,19,20殿 とても分かりやすい説明、ありがとうございます。 ほとんど「ザル」状態で、アクセスできるのですね・・。 ところで、SQL Serverは何をもって1アクセスとしているのでしょうか。 例えば、VB.NET上で、DBへのコネクション(SqlClientConnection)を 複数定義して、例えば、100接続 同時にOPENした場合、 クライアントは1台にもかかわらず、100アクセス相当とみなされる・・?? こういう事が原因で、20殿のおっしゃるような「カウントが間抜け」状態が 発生しているのかなと、勝手に推測しているところですが。
23 :
NAME IS NULL :2005/08/30(火) 12:37:28 ID:DYQfLzMM
Disk I/Oエラーなどの原因でSQLサーバ自身が勝手にサーバをリブートさせるなんてことあるでしょうか?
>>22 半端なプロテクトをかけるとプロテクトをはずしさえすればコピーし放題と思ってるやからが多いから、
ライセンスだけで縛って大口の不正ユーザーを時々見せしめにしたほうが効率がいいのだろう。
1PCだけの運用ならMSDEで無料提供だし、開発用途ならMSDNや開発版が使えるから、
個人レベルの不正ユーザーは計算に入れなくていい。
ディバイスCALなら実際のクライアント装置の数、ユーザーCALなら実際のオペレータの人数で、
同時接続数のCALは既に廃止になってる。ユーザー数不定の場合やユーザー数が多い場合は
プロセッサライセンスにすればCALは不要。ただしWindowsのCALは必要だったりするが(笑)
あとは、この辺をじっくり読んでね。
ttp://www.microsoft.com/japan/sql/evaluation/license/
>>23 SQLサーバ自身がというよりWindows自身がそうすることはありえる。
OS自身やスワップがあるドライブがI/Oエラーの場合はそうなる可能性が高い。
26 :
NAME IS NULL :2005/08/30(火) 17:37:01 ID:DYQfLzMM
>>25 コメントありがとうございます。
わたしもSQLサーバー自身がOSに対してリブートコマンドを発行するなんて
聞いたこと無いので考えられないと思っているのですが。。
データ領域やトランザクション領域にアクセスできなくなったとしてもサービ
スが止まるだけで勝手にリブートはしないですよねぇ。たぶん。
27 :
NAME IS NULL :2005/09/01(木) 01:26:38 ID:s7BVaerI
トランザクションをしていない状態で ストアドでselect @@trancountすると2と返ってくるのはなんでですか?
>>27 クエリアナライザで試してみたが普通に0がかえってきた。
create procedure sp_test1 as select @@trancount
>>23 そりゃハードウエアERR検地してOSがリブートしてるだけだよ。
だいたいSQLにそんなコントロールする命令句は無いだろ。
SQL Server 2000 のストアドで Accessのクロス集計クエリみたいなことって実現できますか?
>>30 できるよ
create table tbl (
month decimal(2, 0),
price decimal(10, 2)
)
insert into tbl 1, 110
insert into tbl 1, 200
insert into tbl 2, 100
insert into tbl 3, 200
select
sum(case month when 1 then price else null end) 1月,
sum(case month when 2 then price else null end) 2月,
sum(case month when 3 then price else null end) 3月
from tbl
>>30 SELECT ... WITH COBE や WITH ROLLUP がつかえる。
ビボットテーブルのようなUIが必要ならSQLServerのオプションのOLAP Serviceをあたってくれ。
>>30 Accessのクエリウィザードで作成したクエリをデザインビューで
SQL表示してちょっといじればいいんではないか?
34 :
NAME IS NULL :2005/09/02(金) 00:57:38 ID:KMuTh19M
データベースのリカバリをバッチで行おうと思っているのですが、 ALTER DATABASE tmpdatabase SET SINGLE_USER RESTORE DATABASE tmpdatabase FROM DISK='tmpdatabaseのバックアップファイル' WITH REPLACE GO を実行すると、 サーバー : メッセージ 3101、レベル 16、状態 1、行 2 データベースは使用中なので、排他アクセスを獲得できませんでした。 サーバー : メッセージ 3013、レベル 16、状態 1、行 2 RESTORE DATABASE が異常終了しました。 と出てきます。 ALTER DATABASE tmpdatabase SET SINGLE_USER で一応排他制御しているつもりなんですけど... もう意味が分かりません。 どなたか助けてください。
>>34 データベースに接続時にtmpdatabaseに接続してない?
代わりにmsdeに接続するか、バッチの先頭に
use msde
go
を入れてみるとか
36 :
35 :2005/09/02(金) 06:21:46 ID:???
>>35 いけね。間違えた。
msde → msdb
Enterprise Manager から、あるデータベースのビューに 表示されるビューのうち、種類がユーザーになっているものを全て選択し、 SQL スクリプトを生成すると、Enterprise Manger では表示されていない ビューが作成されています(CREATE VIEW) EnterpriseManager に表示されないのに、スクリプト生成をすると CREATE VIEW が作られるビューはどうして enterprise manger に 表示されないのかわかりません。アドバイス頂けないでしょうか?
38 :
NAME IS NULL :2005/09/02(金) 14:52:40 ID:w/IkuQ5S
34です。
>>35 さん。
ありがとうございます。
思いっきりtmpdatabaseで接続してました。
そりゃ使用中ですね。
おかげさまでリカバリすることができました。
ありがとうございます!
39 :
NAME IS NULL :2005/09/02(金) 15:23:06 ID:l3RchLMD
MS SQL Server 7を使ってます。 ストアドプロシージャ内でVBA関数のRecordset. RecordCountや、Recordset.EOFのようなプロパティで 条件を判別したいのですが、それに近いような関数ってありますか? ストアドプロシージャで使える関数の一覧があれば 何とかできそうなんですが…
>>39 RecordCountならSELECT @@ROWCOUNTで取得できるけど。
別に
DECLARE @count
SELECT @count = COUNT(*) FROM xxxx
でもいいが。
関数の一覧はSQL Server Books Onlineに載っているよ。
>>39 100%同じものは無いから、素直にカーソルの使い方を覚えることをすすめる。
42 :
30 :2005/09/02(金) 18:13:41 ID:???
>>31 >>32 >>33 ありがとございます。
当初
>>33 みたいなことを考えてたんですが、Pivotが使用できなかったので、
>>31 のような方法でやりました。
OLAP Serviceはやったことがないのでまた調べてやってみます。
ID,Interval,Date 1, 'm', '2005/01/01' 2, 'd', '2005/01/02' 3, 'y', '2005/01/03' というデータが入っている3つのフィールドからなるテーブルがあるとします。 SQLServer2000のviewでDateadd関数を使おうとする時、第一引数を 上記テーブルの2つ目のフィールドから取得して(つまりは動的に) 実行しようとすると “ADOエラー 'Interval'はdateaddオプションとして認識されません(w” となります。 具体的にSQL文を挙げると、 SELECT ID,Interval,Date,Dateadd(Interval,Date) AS Date2 FROM Table1 てな感じです。 何か良い方法はありますでしょうか?
>>43 DateAddの最初のパラメータは特種なのね。CASEをつかったらどうでしょう。
case Interval when 'm' then Dateadd(m, 2, Date)
when 'd' then Dateadd(d, 2, Date)
when 'y' then Dateadd(y, 2, Date)
end
45 :
NAME IS NULL :2005/09/03(土) 03:56:00 ID:chDzSeee
SQL Serverで、Oracleでいうところのfor updateをするのにはどうしたら良いんでしょうか? 処理を開始する前に、特定の範囲のデータをロックしたいのですが・・・。
46 :
NAME IS NULL :2005/09/03(土) 07:44:26 ID:leiODTIC
|ω゜)先生質問 全部の列にインデックス張りまくるとハッシング出来て検索効率アプと聞きましたがマジすか
>>45 カーソルと組み合わせて使います。
マニュアルのSELECTではなくDECLARE CURSORのところを参照してください。
DECLARE CURSOR select ... FOR UPDATE
ORACLEの使い方と近いのはREAD COMMITEDのトランザクションを開始させてロックヒントを指定する使い方。
BEGIN TRANSACTION
SELECT ... WITH UPDLOCK (HLDLOCK)
COMMIT WORK
>>46 どっからそんなガセを仕入れたか知らないが、ディスクの容量と挿入時のオーバーヘッドが馬鹿にならない。
よく使うキーと関数従属のフィールドがあった場合にそのペアをまとめて索引に指定すると検索の効率が
上がるとこがあるからそいつの勘違いじゃないかな。MSSQLの場合はそのキーがクラスタ化インデックスなら
すでにそれに近い状態になっているから効果は薄い。
49 :
46 :2005/09/03(土) 15:54:20 ID:???
>>48 |ω゜)ノ 回答どうも
やはり無意味っぽいですのう
50 :
45 :2005/09/05(月) 03:40:02 ID:???
51 :
43 :2005/09/05(月) 09:12:03 ID:???
>>44 レスありがとございます。
caseはviewでは使用できないですよね・・・
viewで取得したデータをもとにストアドで加工したかったんですけど。
やっぱり全部ストアドで書かないといけないのかなぁ・・・
>>51 漏れはVIEWでCASE式使いまくっているが、何か?
CASEの使い方間違ってんじゃないの?
連投スマソ つーか、ストアドを最終的に使うんなら、VIEW使わず、全部ストアドでしたほうがよくないか。 やり方にもよるだろうが。
54 :
43 :2005/09/05(月) 09:37:44 ID:???
>>52 あ、Access2000のadpプロジェクトでviewを作成してました。
そこでは“case式はサポートされていません。”て出ます。
現在、全部ストアドで行う方法を検討中です。
>>54 たしかデザイナで作成するときはCASEは使えなかった覚えがある。
でもVIEW作成クエリを直接発行すれば使える。
CREATE VIEW view1
AS
SELECT id, interval, date,
CASE interval
WHEN 'm' THEN Dateadd(m, 2, Date)
WHEN 'd' THEN Dateadd(d, 2, Date)
WHEN 'y' THEN Dateadd(yy, 2, Date)
END AS date2
FROM TABLE1
後はdateadd部分だけをユーザー定義関数するとかの方法もあるけど、
>>53 が言うとおり
ストアドから呼び出すのなら、全部ストアド内で処理した方がいいと思う。
56 :
43 :2005/09/05(月) 10:42:17 ID:???
>>55 結局、全てストアドで処理することにしました。
なぜViewを使いたかったかというと、そのストアドにはパラメータを複数使用し、そのパラメータにより動的にSQL文を生成し、生成されたSQL文をシステムのストアドsp_executesqlに投げてデータを取得する・・・てなことをやりたかったのです。
ただ、階層が深くなってしまうので分かりやすいようにViewにできる箇所はViewにしようかと思っていたのですが。
複雑なSQL文をsp_executesqlに投げる手法は、投げるSQL文がバグっているときにその場所を探しにくいですよね。
ありがとうございました。
>56 は 一時テーブル について調べるがヨロシ 下手にネストが深いクエリ作るよりかは、一時テーブルを利用すると激早ということもあり。
一時テーブルは、多くの場合メインメモリ上に作られるから、めちゃ速いよ!
59 :
43 :2005/09/05(月) 19:21:57 ID:???
>>57 >>58 アドヴァイスありがとございます。
ちょっと調べてやってみます。
でも、メインメモリ上に作られるということは確かに速そうだけど、
その分サーバに負荷がかかるよね??
まぁ、そんなにアクセスが集中するシステムでもないし、知っておいたほうが良いと思うので調べます。
>>59 >その分サーバに負荷がかかるよね??
どっちが速いかとか負荷がかかるかなどはケースによる。
複雑な問い合わせをすると内部的に一時テーブルを作るから同じこと。
おすすめなのはストアド内のローカル一時テーブル。ストアドが完了すると
その時点で削除されるから、コネクションが切れるまでゴミが残ることはない。
ストアドの最後に select * from #一時テーブル名 を指定して結果セットとして返せばよい。
実テーブルをワークに使うのは最悪の選択だが一時テーブルはよい選択肢であることが多い。
61 :
43 :2005/09/06(火) 08:44:18 ID:???
>>60 あ、この手法は既に実際にやっていました(汗
なんかもっと全然違うことを勝手に想像してた!
失礼致しました。
現在SQL Server2000 SEをWindows2000serverで動かしています。 確か、SQL Serverは物理メモリを限界まで使うと聞いた事があるのですが フル活動している状態でタスクマネージャを見ても600〜700Mくらいの 物理メモリが利用可能となっています。 ちなみに物理メモリ2.5G、SQL Serverの使用量は1.7Gになっています。 メモリの動的設定の最大は2.5Gになっています。 最近パフォーマンスに不満が出てきたので、メモリの増設を考えていましたが この状態で、メモリを増設してもパフォーマンスは変わらないでしょうか? まとめきれないで長文になってしまいましたが、お教え頂けないでしょうか?
>>62 OSとSQLServerのEditionで使用可能な最大物理メモリは異なります。
Standard Editionだとサポートする最大物理メモリは2Gまで。/3G や /AWEはサポートしていないはず。
それ以上のメモリはディスクキャッシュかOSや別のアプリケーション向けに使われるから無駄ではないが、
既に2.5Gメモリを積んでるなら増設しても効果は薄いかもしれないですね。
64 :
62 :2005/09/06(火) 18:10:19 ID:???
>>63 お答え有難う御座います。
Standard Editionは2Gまででしたか。どうも勘違いしていたようです。
そうなるとメモリの増設は意味無いですね。
他の方法を考えたいと思います。有難う御座いました。
>>64 何も考えずに update statistics と sp_recompile をするといきなり軽くなることもある。
それでも重けりゃプロファイラで duration が長いクエリを探して
そいつを重点的にチューニングしてみるといい。
>>65 この一覧はわかりにくいな。
そのデータアクセスの表はReportingServiceの機能。
Workgroup Edition に ReportingService が入ってないからN/Aになってるだけのこと。
データベースエンジンへの接続は普通にできる。
67 :
65 :2005/09/07(水) 08:12:58 ID:???
>>66 成程、上にあったのか... 情報感謝です。
68 :
NAME IS NULL :2005/09/08(木) 18:39:01 ID:d+uVCPrO
SQLserverとperlでプログラムを作っているんですが、 テーブルaに日付Aの項目、テーブルbに日付Bの項目があり、 データベース上で両方の日付の比較を行い、 ダウンロード日と更新日を比較して、 ダウンロード日が新しければperlで処理1をする ダウンロード日と更新日を比較して ダウンロード日が古ければperlで処理2をする とかいった処理はSQLではどうやったらうまくデータがプログラムに渡せるでしょうか?? 何をどうしていいやら見当がつきません。
>>68 aとbにはキー項目くらいはあるんだろ?だったら
ダウンロード日が新しいもの一覧のaとbのキーのペアをまず引いて、
それを読みつつ該当するデータに対して処理1を行う
次にダウンロード日が古いもの一覧のaとbのキーのペアを引いて
それを読みつつ該当するデータに対して処理2を行う
とでもしてはいかがか。
どうせperlに引いてきて処理をするんなら
キーのペアを出す手間を増やしたところで
パフォーマンス的には大して変わらんでしょ
71 :
NAME IS NULL :2005/09/09(金) 09:48:11 ID:PwVPEYxj
windows2000serverでデータベース?の構築をしたいのですが、 インストール後Enterprise Managerで、データベースの新規作成を したいのですが、コンソールルートの中のSQLserverグループの下の ところで新規作成しようとしてもデータベースのところが反転してい ないのでクリックできません。少ない情報ですいませんがご教授お願 いします。データベースの知識はAccessを少しつついた事がある程度です。
72 :
NAME IS NULL :2005/09/09(金) 09:53:54 ID:ON4510Nu
? データベースの新規作成をEMでやるにはインスタンス名のところで右栗じゃなくて そのさらに下のデータベースというところで右栗っ区をするんだよ
>>69 先にSQLServerグループの下でSQL Serverの新規登録をしなくちゃいけないと思われ。
74 :
71 :2005/09/09(金) 10:07:00 ID:PwVPEYxj
規定のコンピューター名が入ったSQLServerが出来るはず(画面上では出来てる) なんですが、それを開こうとすると接続できません。と出てしまいます。参考 サイトを見るとそれで新規作成もしくは出来てるのがあるみたいな事書いてあった んですが・・・。ちなみにインストールしたのが、windows2000serverパーソナル 版でした。スタンダードはインストールできなかったんですが、そちらのほうの、 問題でしょうか?
75 :
71 :2005/09/09(金) 10:19:18 ID:PwVPEYxj
あとOSは、windowsXPで、今マニュアル読んでるんですが、これだとスタンダードは インストール出来ないみたいですね。うーん・・・。
SQL関連のサービスは立ち上がっているか?
77 :
71 :2005/09/09(金) 10:28:38 ID:PwVPEYxj
タスクバーでは、SQLserver実行中になっています。
接続できませんというエラーメッセージが表示されることはない。 xxxへの接続を確立できませんでした。 理由:xxxxx のようなエラーメッセージが表示されるはず。 バカは勝手に意訳せずにエラーメッセージをありのまま書けよ。
79 :
71 :2005/09/09(金) 10:34:01 ID:PwVPEYxj
新規でSQLserverを作成しようとしても、aaa(コンピューター名)-SQLserver が存在しないか、アクセス拒否されました。と出ます。
80 :
NAME IS NULL :2005/09/09(金) 10:37:56 ID:ON4510Nu
認証に失敗してるっぽいな
81 :
NAME IS NULL :2005/09/09(金) 10:39:45 ID:ON4510Nu
途中で送ってしまった パーソナル版って使ったこと無いけど、クライアントネットワークユーティリティのAliasタブに なんか変なのとか無いか?
82 :
71 :2005/09/09(金) 10:43:55 ID:PwVPEYxj
変なのとうとどういう風なのでしょうか? 見てみると全般タブに、 無効なプロトコル マルチプロトコル、NWLink IPX/SPX、AppleTalk、BanyanVINES、VIA 有効なプロトコル TCP/IP、名前月パイプ で、共有メモリプロトコルを有効にする。
83 :
71 :2005/09/09(金) 10:45:46 ID:PwVPEYxj
が、チェック入ってました。僕も途中で送ってしまいました。すいません。
84 :
NAME IS NULL :2005/09/09(金) 10:45:58 ID:ON4510Nu
ちなみにローカルAdmiん権限を持つユーザでXpにログインしてる?
85 :
71 :2005/09/09(金) 11:06:26 ID:PwVPEYxj
なんか設定を変更してないのに解決しました。多分ログオンスクリプトがはたらいて たからかなー?と思うのですがよくわかりません。 ありがとうございました。
>>71 Accessプロジェクトで作業した方が良さそうだな
稼動サーバー:OS-NT SQL7.0 テストローカル:OS-2K SQL8.0 稼動サーバーからテーブルを移行しようとしてエクスポート時にエクセル形式を 選択して実行、テストローカル機にインポートしてテーブル確認すると 各項目が設定値ではなくMaxの値になってしまいます。 コレはデフォルトでこうなるのでしょうか?
>>87 「Maxの値」というのが意味不明だけど、
データの移行をしたいならDTS, bcp, accessの順で検討するべし。
Excelはそういう目的に使うのは不適当。
>>87 説明不足でスマソ
例えばchraの10で設定したのが256になっている。
(最大ではなかった勘違いです・・・)
稼動サーバーのMOドライブあぼーんで一番軽い形式でフロッピー。。
という安易な考えてテーブル取得しようとした為。
mdbだと思い様な気がしたので・・
その順で試してみまする。dクスでつ。
90 :
NAME IS NULL :2005/09/19(月) 23:10:21 ID:ZtaDUzUW
64bitのサーバではWorkgroupは動作しますか?
質問です。 SQL Server 2000で クエリアナライザを使ってプロシージャを作成しました。 そのプロシージャのデバックを行いたいんですが、 デバッガでブレークポイントを設定しても ブレークポイントが無視され、全て実行されてしまいます。 ブレークポイントを有効にするには、どのようにすればいいのでしょうか?
デバックはデバッガじゃなくデバッカでやれ。
94 :
91 :2005/09/20(火) 15:06:02 ID:???
>>92 デバッガには、クエリアナライザを使いました。
また、VS.net2003での接続も試して見ました。
どちらも結果は同じでした。
また、あの後色々調べましたが、
SQL Server 2000をインストールしたサーバ上で
クエリアナライザを使用した場合、
正常に動作しました。
サーバ、クライアント端末ともに同じユーザで接続しています。
クライアント側でクエリアナライザを使った場合は、
ブレークポイント等は使用できないのでしょうか?
>>94 T-SQL debugger(変なのがわいてるから英文で表記)は一部にDCOMを使っているからその辺が
影響してるんじゃないかな。DCOMが有効になってなかったり、SQL Server認証を使っていても
WindowsのアカウントがDCOMの権限を持ってなかったりするとうまく接続できない。
96 :
NAME IS NULL :2005/09/20(火) 16:55:24 ID:C5euvxwm
すれ違いかもしれませんが Windows Application Compatibility Toolkit をインストールしました 個人用途でアプリケーション、ドライバの互換性をチェックしたかったからです。 というのもXPSP2だとXP無印の時についてくる互換性チェックツールは 使えなかったからです。(バージョンが古いとしてはねられる) そこで上記の4.1を入れたんですがSQL server nameというのが要求されます 適当に入れてみたけどだめ・・・・・・・・・・・・・・・・ どうやったら互換性チェックができますか
97 :
91 :2005/09/21(水) 11:25:47 ID:???
突然だけど aaa bbb ccc という三行の結果セットから "aaa bbb ccc"という文字列を取得したいんだけど どうするのが一番スマートでしょうか
>>98 【帰ってきた】SQL質疑応答スレ
http://pc8.2ch.net/test/read.cgi/db/1124178925/47-48 47 名前:NAME IS NULL[] 投稿日:2005/09/22(木) 17:49:46 ID:BHXwIJyW
JET(Access2000) で、
親テーブル(主キー: id)
id | 名前
--+-----
1 | hoge
2 | foo
子テーブル(主キー: id, 好物 外部キー:id -> 親テーブル.id)
id | 好物
--+-----
1 | パン
1 | ハム
1 | 目玉焼き
2 | ごはん
2 | ハム
2 | 目玉焼き
2 | 黒酢
といった表から
id | 名前 | 好物
--+----+--------------------------
1 | hoge | パン,ハム,目玉焼き
2 | foo | ごはん,ハム,目玉焼き,黒酢
という仮想表を作りたいのですが、これを SQL のみで作ることは可能でしょうか。
好物の値の種類は今後増える可能性があります。好物のオーダーは通常の昇順です。
クロス集計クエリの結果を JOIN する方法をはじめに思いついたのですが、
これだと一列にカンマ区切りなどでまとめられないことと、項目を動的に
増やすのに * を使うため id 列が2列になってしまうのがよくありませんでした。
48 名前:NAME IS NULL[sage] 投稿日:2005/09/22(木) 18:40:42 ID:???
>>47 文字列を結合するような集合関数はない。あったら便利だとは思うが、
第一正規系を崩してしまうことになるからあえて実装を避けてるのかもしれない。
idで単純に結合してプログラムでid順に読み込みながら最終の形にするのが単純で効率もいい。
それ以外では問合せ結果を結合するストアドファンクションを自作する。Access2000ならVBAで作れる。
ただこの場合idの数だけ繰り返し子テーブルにクエリが発生するので実行効率はよくない。
100 :
NAME IS NULL :2005/09/22(木) 23:55:33 ID:GKpTb96/
select 'aaa bbb ccc'
103 :
NAME IS NULL :2005/09/23(金) 16:24:52 ID:u9vIwdWl
拡張ストアドに登録するDLLをVBで作ったのですが、SPから呼び出しても 「関数が見つかりません」 っとうまくいきません。 VBではだめでしょうか。 (Win2K Server + MS SQL2K + VS6.0)
>>103 マニュアルにはVC++を使った方法しか書いてないがどうやったんだ?
105 :
NAME IS NULL :2005/09/25(日) 11:37:28 ID:yi0j+eTM
SQLのデータベースをバックアップとる方法を教えてください。
マニュアル読め
107 :
ポスタル :2005/09/25(日) 15:23:45 ID:cXqyiylo
皆さん初めましてポスタルと言います。突然ですが皆さんに質問、何 ですが、WINNYというゲームや海賊版の映画などをダウンロード できる、公式のサイトのURL知りませんか?
マニュアル読め
109 :
NAME IS NULL :2005/09/25(日) 20:09:53 ID:DP0VW027
クライアント数と推奨エディションのページってMSのサイトにもないよね? 何を基準に選択すればいいんだろう?
>109 クライアント数よりも、エディション毎の使える機能に注目した方が 良いですよ。 基本になっているデータベースエンジン部分は共通ですからね。 使えるCPU数とか、メモリ量から始まって、クラスタリングが必要か どうか(そこまでの費用を掛けるほど重要かどうか)など等、考慮する 要素は多いですよ。 ちなみにハードウェア構成やクラスタリングソフトもエディションの 選び方に影響しますし。(逆か?) クライアント数は多いがデータ量は少なくて、それほど重要でもないなら WorkGroup Editionでも良いし、クライアント数が10かそこらでも、 重要度が高くて停止したときの影響が大きければEnterpriseEditionで クラスタリング構成組んだ方が良いですし。 (後者の場合、他のRDBMS使えって声も出ると思いますが)
111 :
NAME IS NULL :2005/09/25(日) 22:32:11 ID:DP0VW027
>>110 レスありがとうございます。
MSDEで開発してから製品版アップしようと考えていたのですが、
EnterprizeManagerがないと開発効率が悪いので急遽購入を検討してます。
WorkGroupとStandardが大して価格が変わらないので迷っています。
上記2つのエディションですと2005だと性能面で64bit対応とかで大きな差が
ありそうですが、当面は2000を検討してます。
>>111 開発用ならDeveloperEditionでいいじゃん
BULK INSERTで使用するフォーマットファイルについて教えてください。 データファイルが "aaa","bbb","ccc" となっている場合、フォーマットファイルで 8.0 3 1SQLCHAR02048"\",\""1col1Japanese_CS_AS 2SQLCHAR02048"\",\""2col2Japanese_CS_AS 3SQLCHAR02048"\"\r\n"3col3Japanese_CS_AS と指定しているのですが col1には「"aaa」というように頭のダブルコーテイションがついてしまいます。 これを外して取得するにはどうしたらよいでしょうか? よろしくお願いいたします。
>>113 8.0
4
1 SQLCHAR 0 1 "" 0 dummy Japanese_CS_AS
2 SQLCHAR 0 2048 "\",\"" 1 col1 Japanese_CS_AS
3 SQLCHAR 0 2048 "\",\"" 2 col2 Japanese_CS_AS
4 SQLCHAR 0 2048 "\"\r\n" 3 col3 Japanese_CS_AS
char(1)の列を頭に追加し、区切り文字なしとすれば最初の一文字が切り離せる
6番目の列順序を0とすればテーブルの列には割り当てられないのでこれでOK
>>114 なるほど。
すばらしい技です。いただきます。ありがとうございました。
なんで、ここの人たちはID:???なんだ・・・ 自分のIPを偽装しているのか?
118 :
NAME IS NULL :2005/09/26(月) 22:48:33 ID:qBq8UyI7
>111 本番環境なら、状況が許せば上位エディションの方が何かと 便利ですが、費用対効果の問題もありますしね。 個人的には、64bitになったからと言って劇的に処理能力が 上がるとは思えませんが、使えるメモリサイズの上限が上がる面は 非常に良いと思います。 (そこまでメモリ量を要求されるかどうかと言う問題がありますが) ただ・・・本番環境と考えてのレスだったんですよ。 開発環境でしたら、112さんの仰る通りでしょう。 低コストで入手できますし、Enterprise Edition相当の機能まで 使えますし。
121 :
NAME IS NULL :2005/09/26(月) 23:55:13 ID:ocUN6sbM
>>120 前の会社はSIerだったので開発ツールには惜しげもなく金を使えましたが、
今は中小の社内SEに移ったので、なかなか開発ツールに予算が取れません。
124 :
NAME IS NULL :2005/09/27(火) 00:04:57 ID:UiQabrHe
>>122 ご親切にありがとうございます。
よく分からなくなってきたのですが、こうなるとMSDEとWORKGROUPの
差ってのは、CALの必要性の有無以外に何になるのですか?
最大DBサイズだけとかなんでしょうか?
125 :
NAME IS NULL :2005/09/27(火) 00:06:54 ID:UiQabrHe
>>123 この有料のMSDEはMSサイトからDLできるものと違うのですか?
そりゃ略せばMSDEだけどさあ…
ワロスw
すいません。質問です。 サーバー OS:Win Server2003 DB:SQL Server2000(SP4) クライアント:WinXp Pro クライアントでTransact-SQLを作成しているのですが、デバッグを行いたいので クエリアナライザにて、オブジェクトブラウザウィンドウから対象のストアドプロシージャを右クリックし デバッグを選択し、「デバッグプロシージャ」なるウィンドウが出てきます。 そのウインドウで引数などを設定し「実行」ボタンを押すとT-SQLデバッガウインドウが表示されるんですが、 ここでブレークポイントを設定し実行を押してもうんともすんとも言いません。 どうすればデバッグできるようになるのでしょうか? まったくの初心者な質問で申し訳ありませんが、お分かりの方教えてください。
129 :
128 :2005/09/27(火) 13:17:47 ID:???
自己解決しました。 アナライザ用のSP4のパッチをあてたらうごきました。 スレ汚し失礼しました。
質問です。 OS windows2000server DB SQLServer2000(SP4) 上記環境で複数のDTSを作成し、SQLServer内に保存しているのですが、 今度別のサーバーに移動させる必要が出てきました。 DTS自体はmsdbというシステムデータベースに保持されているようですが、 DTSのみを一括で移行する手段はありますでしょうか? ご教授お願いします。
2005はバグだらけ
>>132 まだそうだろうね。
SP1くらいが出るまでは内部でテストはするけど
顧客に納入はしないな。
134 :
NAME IS NULL :2005/10/01(土) 23:21:37 ID:OC8ljYWy
DeveloperEdition で開発したものを本番稼動時にMSDEに移行って 手間かかりますかね? あと、DeveloperEditionって1つに開発者1ライセンスなんですかね?
>134 はぁ。 また >109 >111 >121 >124 >125 のあんさんかいな。 頼むから、もう少し勉強してくれ。 後、製品の説明に書いてあるような事も聞くなよ。 しかも、>131のリンク内に説明あるぞ。
厨房が紛れ込んでるな。うざいから消えろ。
今までPL/SQLをやってきたのですが、 PL/SQLの%rowtypeや%typeのようなものを、 なんとかしてT-SQLでやることは出来ないのでしょうか? カラム数が非常に多いテーブルなどで、 全てのカラムに対応する変数を作って intoで各々の変数に入れるのが大変なのです。 何か効率のいい方法があれば教えてください。
140 :
98 :2005/10/04(火) 22:40:50 ID:???
>>98 自己解決。
declare @tmp varchar(1000)
set @tmp = ''
select @tmp = @tmp + COL1 + ' ' from TABLE1
select rtrim(@tmp)
こんなんで出来るとは思わんかった。ちと感動。
141 :
NAME IS NULL :2005/10/05(水) 18:13:26 ID:V1dEt9RB
DQNな質問ですみません。 現在SQLサーバを使ったシステムの管理を行っているの ですが、今後2、3年でユーザ数が5〜40倍に増えそうです。 そのためSQLサーバでクラスター化を行ってアプリに手を いれずに、容量を増やしたい(負荷分散)のですが、ハード とライセンスを追加購入すれば簡単にできるのでしょうか? クラスタ化できるとか、4台まで可能とか、できないとかベンダー によって言ってる事が違っており、だまされそうなので、助けて ください。 SQL Server 2000のEnterprise Editionを使ってます。
現在のベンダーの提案でまともそうなのは複数台のSQLサーバを クラスタリングして、一つのNASに書き込むってものだけれでも、 本当にDB10台もクラスタリングできるのか烈しく不安なのです。。。
>>141 「今後2,3年で5〜40倍に増えそう」っていうのが
どういうシチュエーションなのか、そこが気になる…
144 :
141 :2005/10/05(水) 21:36:58 ID:V1dEt9RB
業種は訳ありでいえませんが、たくさん売れればそれだけ ユーザが増えるという意味です。
今、会員が2人しかいないんだよ。80人を目指してるのさ。
147 :
NAME IS NULL :2005/10/05(水) 21:40:04 ID:V1dEt9RB
それと開発する会社にスキルがないのでオラクルに 乗り換えってのは予算的に無理です。 クラスタリングできないのであれば同じ構成のシステム をいくつか作って効率が悪くても人海戦術で対応する 予定です。
148 :
141 :2005/10/05(水) 21:43:50 ID:???
>>146 両方ともアクセスできません。゚・(ノД`)・゚・
ここからだとアクセス制限があるのかな。。。
MSのHPが見えなくなること多いんですよ。
>>148 ちゃんとIE系のブラウザでアクセスしているか?
MSのサイトはGekko系ではちゃんと表示してくれないページが多い
>>141 SQL2000のクラスタリンクはフェイルオーバーのみで負荷分散はない。
Win2003Enterprise上であれば8ノードまでサポートされてる。
参照主体か更新主体かで対策は少し変わってくるが
基本的には1台のサーバを増強していくしかないだろうな
レプリケーションでサーバを増やすという手も無くはないが、できるかどうかはアプリ次第。
>>146 それは窓口違いだろ...
151 :
141 :2005/10/05(水) 21:52:48 ID:???
IEなんですが、場所が場所だけ(アジアの僻地)IPがやばいです。
152 :
NAME IS NULL :2005/10/05(水) 21:58:03 ID:V1dEt9RB
そうですか。 やはりクラスタリング無理そうですか。 採用する前に分かってよかったです。 更新6割 参照4割くらいです。 更新が多いとやぱーりレプリケーションは無理ですよね?
更新が多いかどうかよりも、データが他のサーバにレプリケーションされるまでの タイムラグをアプリケーションが許容できるかどうかとか、 またサーバ間で更新データの競合が発生しないかとか、 競合が発生した場合にそれを解決できる手段があるかどうかが問題。
う、レプリケーションされるまでの、じゃなくてレプリケートされるまでの、だ。
155 :
NAME IS NULL :2005/10/05(水) 22:33:39 ID:8DPXYx5T
素人な質問ですみません。容量とかは適当ですが OSのファイルA(50GB)とファイルB(50GB)に分かれたデータベース(100GB)があり その中にテーブルZ(20GB)、テーブルY(80GB)あるとします。 テーブルZのデータを大量に削除しテーブルZが1GB程度になった場合、 テーブルZを狙い撃ちで最適化とか出来るのでしょうか。 やりたいのがテーブルZで20GB使っていたので断片化した容量を整理し、 テーブルY用に連続空き領域を確保したいのです。 (見かけ上は空いていても連続空き容量が無さそうなので) DBCC SHRINKDATABASEでデータベースを指定するか DBCC SHRINKFILEでファイルを指定すれば出来そうな気はするのですが データベースやファイルを指定すると莫大な時間がかかるため、 テーブルを指定して行なう方法がないか知りたいのです。
>>155 もいっこHD用意してオブジェクトのコピーでまるっとコピーするとかが
一番楽かも
つるっとねっ☆
158 :
NAME IS NULL :2005/10/06(木) 22:13:06 ID:rEEHAcjK
>>156 本番環境なんであまり簡単にいじれないんですよね。
データベースを指定して最適化しようとするとオフライン時間内に終わらないみたいだし。
SQL Server って断片化したテーブルだけを狙って最適化する方法ってないですか?
もしやデフラグしろとか(´・ω・`)
>158 そもそも、そのテーブルだけ最適化できたとして、狙っている通りに 小さくなるとは限らないしね。 非稼働日にシステムを停止してデータベース丸ごと最適化した方が 良さそうな。
>>159 やっぱりデータベース丸ごとしかないですか。
ありがとうございました検討してみます(´・ω・`)
SQL Server ってalter table でカラムの名前変えられない?
Dropして作り直しちゃったw
かなり、初心者な質問なのですが、 サービスマネージャーから開始できなくなってしまったのですが、 なにが原因なのでしょうか?
最低限、OSとエラーメッセージを正確に書かなきゃわからん。 それと、イベントログとSQLServerのログに何かエラーが出てないか?
>>165 失礼致しました。
OSはXPProを使用しております。イベントログを見てみると
SQL Server evaluation period has expired
とありました。今、評価版を使用しているのですが、期限が切れたということで
もう使えないということなのでしょうか?
>>166 メッセージの通り評価版の期限切れ。
製品版を上書きインストールすれば今の環境を壊さずに使えるはず。
テスト用ならDeveloperEditionでいいんじゃないか。大体5000〜6000円くらい。
まさか評価版で本番環境を作ったとか言わないよな?w
169 :
166 :2005/10/11(火) 21:47:23 ID:???
>>167 ありがとうございます。
早速、ウィルスチェックしてみます。
>>168 DeveloperEditionはテスト用でなく、開発用だよ!>アフォ
169はテスト用にわざわざEnterpriseEditionを買ってしまったんだろw
172 :
NAME IS NULL :2005/10/12(水) 16:15:50 ID:XLxwdkpo
セグメントの違うサーバの認識ってどうやってやるの?
173 :
168 :2005/10/12(水) 19:44:04 ID:???
>>169 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
169=173
>>172 セグメントってネットワークセグメント?
普通にIPで接続すればよかべ
176 :
175 :2005/10/12(水) 21:48:39 ID:???
>>172 そうそう、IPの前には、”\”をみっつ入れなきゃだめだべ
>>172 何を使ってやってるのか分からんが
2005βだと初期状態ではTCP/IPでの接続は出来なかったりするな。
そこを確認してみた方がいいかも。
SQLServerのDateTime型って時分秒まで持ってますが、 日付の部分だけ取り出したいのです。 一度、文字列に変換してから切り取るしか方法がないのですかね?
datetime型は300分の1秒まで持ってるけどエンタープライズマネージャやクエリアナライザでは 見えないけどどうやったら見えるようになるのさ?
エンタープライズマネージャは知らんがクエリアナライザならconvert つか聞く前にBooksOnline見れ
>>180 内部的にはデータとして管理されていますが、見ることは出来ません。
更新時間など、時間の比較を行うために用意されています。
183 :
180 :2005/10/14(金) 23:45:00 ID:???
>>182 ありがとうございます。
やはり目視は無理なんですね。
>>181 BooksOnline探すよりこっちで聞いた方が早いから聞いてるんだよ!>アフォ
この板も全部ID出るようにならんかな
185 :
181 :2005/10/15(土) 02:23:29 ID:???
>>183 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
同じパターンかよ ガイドライン化でも狙ってんのか?
規定のインスタンスでインストしたSQL2000ですが、コンピュータのホスト名を変更した場合って SQLは再インストールすることになりますか?それともインスタンス名も自動的に変わりますか?
>>188 @@SERVERNAMEについてBooksOnlineで調べてみるがよろし
>>188 基本的には再インストールしなくても普通に使っていける
だけどマスタテーブルをupdateしないと
レプリケーションの設定とかするときにうまく行かない
191 :
NAME IS NULL :2005/10/20(木) 21:51:54 ID:IMQmSs9w
commandプロンプトの実行ってプロシージャから呼び出せないの?
>191 つ xp_cmdshell
193 :
NAME IS NULL :2005/10/20(木) 22:15:01 ID:IMQmSs9w
おおっ!!動いた(゚∀゚) すぺしあるトンクス
この時期に始める開発だと、2000と2005のどっち使うか迷うですね
2000の方が安心感はあるけどねぇ 2005のパッチが出るのを待てるかどーかじゃないか?w
196 :
NAME IS NULL :2005/10/21(金) 12:21:46 ID:Yq+kopBy
>>194 俺だったら
客先納品なら2000
社内で管理可能なら2005
って基準だな。
それいいな
うむ 少なくともSP1くらいまで出てくれないと 客先には入れらんないよなー
>>194 即、2005を採用すべき!
技術者としてそのくらいのプライドは持ちましょう。
200 :
194 :2005/10/21(金) 23:37:35 ID:???
>>199 ありがとうございます。
そうですね、時代遅れの2000を今更って感じですね。
>>195 はぁ?何時出るのかも分からないパッチなんて待ってられるかよ!>アフォ
201 :
195 :2005/10/21(金) 23:38:23 ID:???
>>200 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
俺が195だけど、まぁいいかw
ある程度長期の案件でかつMSのサポートを受けられる(=hotfixをもらえる) 環境なら今から2005でもいいかもな
入力日付をチェックするってどーやんの??? 文字列で6桁('YYMMDD')を直接変換する関数ってあんの?
>>199-201 それうざい
マジレスだけど以前は「バックアップが戻せない」とか
そういうレベルの不具合があった訳で、
それ考えると十分に製品版の人柱を見てからじゃないとな。
>>204 format関数とdatechk関数を組み合わせれば可能だよん
207 :
204 :2005/10/22(土) 13:48:08 ID:???
>>206 ありがとうございます。
早速試してみますね。
>>205 はぁ?オマエの方が余程ウザイんだけど???
オマエ、C社の奴だろ!パッケージ売れないからって八つ当たりするな!>アフォ
208 :
205 :2005/10/22(土) 13:49:11 ID:???
>>207 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
210 :
NAME IS NULL :2005/10/24(月) 09:36:52 ID:mG/V1qwW
varchar型で6桁の日付を datetime型で8桁にする方法教えてください yymmdd → yyyymmdd
datetime型に桁という概念はありません。
214 :
210 :2005/10/24(月) 20:45:56 ID:???
>>213 おぉ、出来ました!!(^_^)v
大変ありがとうございました。
>>212 はぁ?桁のないデータなんて存在しねぇーんだよ!
それとも何か?日付型が可変長とでも言いたいのか??>アフォ
215 :
212 :2005/10/24(月) 20:46:34 ID:???
>>214 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
Transact-SQLにDateSerialは無い。
とりあえず「>アフォ」と「なぐるぞ」をあぼーんするのが良さげだな。
>>210 が
>>213-215 の腐れ荒らしじゃない事を祈りつつマジレスすると
yymmddをDatetime型に変換するなら
select cast('051024' as datetime)
で十分。
それをyyyymmddにするなら
select convert(char(8),cast('051024' as datetime),112)
でok
SQL Server が動いている PC-A からデータベースのファイル(実体)を PC-B へなんらかの方法でコピーなどし、PC-B の SQL Server に sa でログイン できれば、PC-A の sa のパスワードがわからなくても PC-B に データベースが復元できてしまうと思います。 ここで PC-A の sa 以外にはデータベースの(特にテーブルのデータ) 中身を見せたくない場合、何か方法はありますでしょうか? (PC-A からデータベースファイルの実体をコピーされないようにする、 という方法以外で)
データファイルを暗号化してしまえば?
219 :
217 :2005/10/24(月) 22:57:38 ID:???
ビューとかストアドは暗号化できると思うのですが、 テーブルのデータも暗号化できるのですか? できるんであれば方法を教えて頂けるとうれしいです。
220 :
218 :2005/10/24(月) 23:05:33 ID:???
出来る訳ねーだろ!>ヴォケ
223 :
217 :2005/10/24(月) 23:24:03 ID:???
>>220 ...
>>222 うーん、SQL Server だけではなんともならない、という事でしょうか?
SQL Server のテーブルなどに入った個人情報等を保護するには、
SQL Server だけではなんともできない?
224 :
217 :2005/10/24(月) 23:33:10 ID:???
DeveloperEdition で開発したものを本番稼動時にMSDEに移行って 手間かかりますかね? あと、DeveloperEditionって1つに開発者1ライセンスなんですかね?
225 :
217 :2005/10/24(月) 23:34:35 ID:???
>>224 ねー、俺 217 なんだけど、なんであなた 217 を名乗っているの?
もうわけわかんない。
226 :
217 :2005/10/24(月) 23:41:08 ID:???
SQL-Server2000で、DBのバックアップを取りたいんですけど、 ABC-DEF って名前のDBなので、 '-' の近くに無効な構文があります。 とクエリアナライザでエラーになります。 Backup DataBase ABC-DEF TO DISK='C:\WORK\aaa.bak' どうすればよいでしょうか? すいません、素人質問ですが宜しくお願いします。
227 :
217 :2005/10/24(月) 23:43:06 ID:???
>>226 ねー、俺 217 なんだけど、なんであなた 217 を名乗っているの?
もうわけわかんない。
228 :
217 :2005/10/24(月) 23:45:09 ID:???
なんでもいいからおまえら
>>217 に答えろよw
229 :
217 :2005/10/24(月) 23:55:30 ID:???
風呂入る前にウンコする? 風呂入ってからウンコする?
230 :
217 :2005/10/24(月) 23:56:20 ID:???
Windows2000ServerでSQLServer6.5を稼動させてる人いますか? なおかつ最新スペックのサーバー機で。 当方、ポンコツサーバーテスト機にて、とりあえず動作確認はできてるんだけど 本番環境で安定稼動するかどうか不安です。 現行のNT4.0サーバー機が最近不安定になってきて、しょっちゅうダウンするので サーバー機自体を変えたいなと思っています。
>>226 [ABC-DEF] か QUOTENAME('ABC-DEF') かな
ハイフン使わない方が良いけど。
>>217 そもそもDBサーバのWindowsへのログインを容易に出来ないようにして
ファイル共有とかも絞っておけばコピー自体出来なくすることが可能
そういった外堀に気をつければ十分保護と言える
MDFファイルのドライブを暗号化や圧縮ドライブなんかにしてしまうと
その分パフォーマンスが落ちるわけでお利口な判断ではないな
>>224 楽
>>229 入る前
235 :
厨房13年 ◆Zs1YdH77Oc :2005/10/26(水) 17:52:42 ID:FL2OErqJ
誰か知恵を貸してください。 今、SQL SERVER2台(本番用とテスト用)で比較してるんですが、テスト用だと10秒位で終るのに、 本番用だと約100秒と10倍時間が掛かってしまいます。 原因が解らないです。。。 ・環境(本番、テスト共通) OS Windows 2000 DB SQL Server 2000 データ量は、本番のデータをそのまま持ってきているので同じです。 ・本番とテストの違い 本番はVPN経由で接続されています。 (ファイルを転送した感じでは、10Mは出ている様です) 運用も厨房なので、恐らく、なんか設定をいじっている様な気がしますが。。。 何かピンと来るものがあれば、レス下さい。
236 :
厨房13年 ◆Zs1YdH77Oc :2005/10/26(水) 17:55:06 ID:FL2OErqJ
>>235 の補足
SQLは「SELECT」のみです。
ハード構成は、テスト、本番とも同じです。
超基本的にインデックス張り忘れとかだったりせんか
VPN経由で10Mなら100BaseのLANと比較して当然の結果じゃない?
本番サーバーにLAN接続して、VPNの問題かどうか切り分けた方が早いんでない?
ネットワーク云々の前に、普通はまずローカルで試さないか 現地にいけないのならリモートデスクトップとか使えよ
どんなデータ何件とってきてるんだよ
242 :
厨房13年 ◆Zs1YdH77Oc :2005/10/27(木) 00:08:10 ID:ZugCF9qj
>>237 その可能性大です。
>>238 10Mでも同じでした。
>>239 こっち東京で、SERVERが大阪です。
>>240 コンソール使えれば一番良いんだけど。。。
実を言うとテストも私の手元には無いんです。
細かい話をすると、
私=>元請(東京)でテスト=>End User(大阪)
なんで。。。
電話でやってもダメそうなので、明日、元請のところに乗り込みます。。。
皆様ありがとうございますた。
>>242 乙。
大阪はタイガースが無様に負けて暴動が起きているから装備に注意を。
ACCESSのODBCリンクテーブルでSELECTしてるとか? ローカルのJetにデータを引っ張ってくるのに時間がかかってるんだったりして。
245 :
NAME IS NULL :2005/10/27(木) 12:48:14 ID:hz34cpjJ
Verchar型項目の数値チェックの方法教えて下さい spl条件に加えたいんです
>>245 乱暴な質問だなぁ。
もしかするとisnumeric関数が使えるかもしれんが…
求めている物と違うのなら、もう少し質問方法を考えてみたらどうだ?
247 :
NAME IS NULL :2005/10/27(木) 13:24:25 ID:g0iURUV0
質問です。 ACCESSのDBにある、オートナンバー型を、SQLserverへ移行するには、 どうすればよろしいですか?
249 :
247 :2005/10/27(木) 13:29:42 ID:g0iURUV0
>>248 すいません。質問の悪かったです。
AテーブルのIDという項目が、オートナンバーで、Bテーブルにリンクを張っているんですが、
SQLserverへ、アップサイジングすると、Bテーブルのデータがまったく作成されません。
どうしたらよろしいですか??
250 :
247 :2005/10/27(木) 14:48:25 ID:g0iURUV0
補足です。 Aテーブルと、Bテーブルは、1対多の関係で、Aテーブルを開くと左側に、+印があり それを、開くとそのレコードと繋がっているBテーブルのレコードがのぞける状態です。 説明下手で、申し訳ありません。
>>247 Accessは知らんけどSQLServerでは
AへのinsertのトリガでBにもinsertする、としないとだめじゃないかな
Bの内容はどこからくるんだ Accessでテーブル開いても+が出ないってことか?
253 :
厨房13年 ◆Zs1YdH77Oc :2005/10/28(金) 01:51:51 ID:btINETKh
遅い原因は、回線ですた。 スピードテスト位しろ。
254 :
NAME IS NULL :2005/10/28(金) 16:33:48 ID:XeXfGGVc
表ロックをしたいのですが、どうすればいいのでしょうか?
255 :
254 :2005/10/28(金) 16:43:00 ID:XeXfGGVc
SELECT * FROM table_name WITH (TABLOCKX) で出来ました。
誰か mixi に SQL Server コミュつくれ。 PASSJ は、なんか内輪ノリだし 2005 コミュは管理者不在で書き込み止められてるし あとは「某MS から表彰」とか言ってる 自意識過剰な人たちの、閉鎖的なコミュだし。
今このタイミングでmixiにSQL鯖コミュ作っちまったら… 想像するだに恐ろしいwww 作りたいのは山々なのだが、作るに作れない事情wがあるので、他の方よろしく
SNSのアカウントひとつも持ってない ショボーン
>256 ここでの議論じゃ不足? mixiは技術系はあらかた駄目っていう印象があるけど。
SQLServer2000のデータバックアップについて質問です。 バックアップ手順と復元方法で、 A:バックアップ)いったんSQLServerのサービスを止めてから.mdfファイルと.ldfファイルをコピーバックアップ 復元)これらのファイルをアタッチ B:バックアップ)EnterpriseManagerでDBを右クリック→データベースのバックアップ 復元)EnterpriseManagerでDBの復元で上記ファイルを指定 このABによる違いってあります?
サービスをとめる必要があるかないかとか、 バックアップ・リストアにかかる時間がそれぞれ違うとか
デタッチしてコピーだとファイル内の空き領域分もコピーされちゃうから ファイルサイズはもちろんでかくなりますわな でもその分操作自体が簡単というメリットはある
263 :
260 :2005/11/01(火) 12:23:37 ID:gFFOGiiW
>261 >262 サンクス なるほど。 その程度の違いくらいなもんですか。 個人的にはBの手法が好ましいと思っていたんですけどね。 Bを薦めてもかたくなにAの手法でバックアップしたがる香具師が社内にいるので どうしたものかと小一時間・・・。 とくに問題ないのであれば香具師は放置します。
俺の会社にはバックアップと称して 「全オブジェクトのスクリプト生成とbcp」って奴がいるぞ…。 それよかましだろ
>264 すげーwwww つわものだwwwwwww
標準のバックアップがSQLLiteSpeed並みに早かったらいいのにな
>>264 まぁ、それが結局最強だったりするんだがな
最強が二つもあるのはイヤですねえ…
270 :
NAME IS NULL :2005/11/02(水) 14:37:52 ID:19dYxfhq
集計してる値にNULLが混じってるとか… そんな事は無いかw
272 :
270 :2005/11/03(木) 00:04:59 ID:DvGnfRpZ
自己レス(&
>>271 )
GROUP BY + ORDER BY + 集計関数
という形式をSQLCEが正しく処理できないようです。
この他、FROM句にサブクエリで作成したテーブル
を利用できないなど、やはり「仕様」のようです・・・
274 :
NAME IS NULL :2005/11/03(木) 06:14:28 ID:SWAlpZJs
SQLServer2005 でOracleでいうところのINTERSECTのような構文は サポートされるんでしょうか
>>274 INTERSECTとEXCEPT が追加されています。
>>276 Thx
Sybaseの管理やっているし、DBスペも合格しているから、
あんまり入門書は無いとは思っているけど
「いってみよう」のほうがようさげですね。、
教えてください。 no_1.aspより値を取得し、値付きでno_2.aspを開きます。 no_2.aspでは、その値を、MS_SQL_svr に登録します。 SQL_svrは、ODBC経由で開きます。 下記の設定ですと、なぜか、2回値を登録してしまいます。 SQL_svr上で、「ID」はPRIMARY KEYに設定しているので当然エラーが出ます。 どこが、間違っているのか教えてください。 no_1.asp ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ <script language="Javascript"> <!-- function btn_click() { if(document.form2.name.value == ""){ alert("お名前が入力されていません"); return false; } if(document.form2.e_net.value == ""){ alert("E-NET番号がが入力されていません"); return false; } window.close(); url="no_2.asp?ID="+ document.form2.ID.value; url=url + "&name=" + document.form2.name.value; url=url + "&e_net=" + document.form2.k_net.value; window.open(url,""," height=100,width=200,top =180,left = 400,status=no,toolbar=no,menubar=no,location=no"); return true; } --> </script> ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ no_2.asp ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ <% Dim strSQL SET db=SERVER.CREATEOBJECT("ADODB.CONNECTION") db.OPEN "xxx","yyy","zzz" ID=(Request.QueryString("ID")) name = (Request.QueryString("name")) k_net_no = (Request.QueryString("E_net")) NOW1=NOW() strSQL = "INSERT INTO ID_NAME (ID,name,E_net_no,into_time) VALUES ('" & ID & "','" & name & "','"& E_net_no &"','"& NOW1 &"')" db.Execute(strSQL) db.Close %> ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
>>278 スレ違いだけど…
btn_click() が2回呼ばれているんぢゃね?
こんな感じになっているとか。
<form ... onsubmit="btn_click();">
〜略〜
<input type="submit" ... onclick="btn_click();">
btn_click() の先頭に alert() でも入れて確認してみたら?
>>279 ありがとうございます。
やってみます。
281 :
NAME IS NULL :2005/11/04(金) 12:21:35 ID:AtAjXaBZ
文字列を全部ntext型で定義しましたけど、 クエリでLIKEが使えないのですが、どうしたら 検索ができますでしょうか
nvarcharにすれ
使えるだろ?
284 :
NAME IS NULL :2005/11/04(金) 13:03:43 ID:obnTC5Pr
ご質問します。 複数クライアントで、同一テーブルを使用する場合、 レコードロックされているのを、判断するにはどうしたらいいですか? そのレコードが、使用中というメッセージを出したいのですが・・・
285 :
NAME IS NULL :2005/11/04(金) 18:14:51 ID:7ewyKrwI
>>284 普通はデットロックで無い限りロックが解除されるまで無限に待つ設定になっているので、
セッションに対してSET LOCK_TIMEOUTでタイムアウト時間を設定する。
あとは排他ロックをかけてみて「1222 :ロック要求がタイムアウトしました」が帰ってきたらロック中。
ちょっと老婆心だが、もし修正画面を開きっぱなしにしてその間ずっとロックをかけっぱなしに
しようとしているならそれは間違いだから再考するべし。
>>284 そのようなメッセージを出力する必要があるぐらい長時間ロックするしているの?
>>284 テーブルにロックフラグを追加してロジックで行うのが簡単
289 :
284 :2005/11/04(金) 23:03:42 ID:???
>>288 やはり、それが妥当ですかね。
ありがとうございました。
>>285 おいおい、質問の意味理解出来ないのか?(w
>>286 はぁ?修正画面で修正中にロックかけて何が間違いなんだよ??>アフォ
>>287 日本語不自由なチョソは黙ってろ!
290 :
285 :2005/11/04(金) 23:04:41 ID:???
>>289 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
291 :
286 :2005/11/04(金) 23:05:44 ID:???
>>289 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
292 :
287 :2005/11/04(金) 23:06:17 ID:???
>>289 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
>>289 場面にもよるが、
>>288 の方法が妥当とは思えんのだが…
データの修正画面ぐらいなら、ロックやロックフラグを使わなくても
更新日時をカラムに設けておいて、更新時に更新日時が変化しているかどうかのチェックで充分だろ。
バッチ処理でデータを更新するのに、パフォーマンスUPとか言って 対象データを削除→登録なんてことを毎日やってたらだめだよな! あっという間にフラグメントが発生して検索が激遅になるよな 検索用SQLばっか直してないで早く気付いてくれ
どの方法もダメダメじゃん。
297 :
NAME IS NULL :2005/11/04(金) 23:27:36 ID:Ym7j0F/8
ストアドプロシージャの参考書を買いたいけど、なかなかみつからず、ネットで探してみると、あることはありますが、2001年発売とかで… ふるめだと、内容ちがったりするかな なんせ進歩がはやい業界ですし
289-292 に楽しいのがわいてるがスルーで
>>293 ロックフィールドをアプリで制御する場合はタイムアウトやらロックしたままアプリが落ちたときの仕掛けを
考慮しなきゃいかんからちょと面倒だね。
>>297 T−SQLの本で十分だろ。
SPで特別なことといえば、変数、戻り値くらいじゃないか?
2005が発売開始されたら、また同じような内容の本が出まくるのかな?
>>288 フラグへのアクセスが衝突して楽しいことになりそうだな
>>294 通常の運用をとめてバッチ処理用の時間を取れるなら
ついでに DBCC DBREINDEX を実行する。
便乗質問
>>288 ,
>>293 ,
>>298 timesptampでやる方法だと、更新しようとしてはじめて更新できないって感じだよね?
それって作業者からすると「ふざけんなゴルァ!」って感じだと思うんだが。
かといって行ロックはWebアプリでは難しい。なんか名案はないもんですかね?
ロックフラグは、アプリを強制終了させられると、 フラグが立ったままで、大騒ぎ。
305 :
293 :2005/11/05(土) 09:37:18 ID:???
>>303 そういった衝突は、ほとんど起きないでしょ?という前提だから「楽観的ロック」なわけで
仕様です!でいいと思うけど。
頻繁に衝突するのであれば、楽観的ロックの採用が失敗だろうし…
多少、ユーザーの利便を考えるのであれば
・新旧レコードの各項目を比較して異なる部分をガイダンス表示、再入力してもらう
・場面にもよるけど、許されるのであれば別途新規登録に切り替える
ぐらいの作り込みでいいんじゃない?
>>303 他のセッションからの操作で書き換わっていた場合は、今入力したのと書き換わっていた内容を並べて表示して
上書き、キャンセル、再修正あたりを選ばせるのが面倒だけど丁寧かもしれないですね。
ADO.NETがこういう仕掛けのフレームワークなんだけど正直使いづらい。
売上システムの伝票入力などは操作がぶつかることはまずないので楽観排他が適当で、 予約システムなどは操作がぶつかるのでタイムアウト処理つきのロックフラグを使うことになりますね。 どっちにしろユーザー操作が途中に介在する以上データベースレベルのロック機構はそのまま使えません。
308 :
NAME IS NULL :2005/11/05(土) 10:11:27 ID:dKysNCOJ
ロックは楽観と悲観の2つに分かれるわけで、 後はUIでどうカバーするか・・・って事でしかない。 Webは「いきなりブラウザを閉じる」なんてのが容易 だから、更新時にUIでカバーするしかない。
309 :
308 :2005/11/05(土) 10:15:00 ID:???
>>308 訂正:
UIだけじゃなく、ビジネスロジックでもカバーできるなわ。
ロックしているユーザーの名前と電話番号を表示して ユーザー同士で直接話し合いして解決すればいい。
>>310 事務のおばちゃん一人に帳簿を管理させれば競合はない。
>>311 おばちゃんの前に長い行列ができそうだ・・
そもそもSELECT文しか投げてないのに排他制御のようなボトルネックが あることが理解できなかった。パソコンサーバには8Gバイトのメモリを 積んであるのだがSQLServer2000の SQLServer:Memory Manager\Maximum Workspace Memory(KB) をパフォーマンスビュウワーで観測すると約1.2Gバイトしかないのだ。 このメモリ領域はソートに使われるのだが問題なのはソートするためには 一度に必要領域を確保する必要があることだ。100万行の100バイトの行を ソートとするのには単純な掛け算で100Mバイトのメモリ領域を必要とする。 同時に実行されるSQLで使われてしまうとすぐにパンクするのでSQLServer 2000の内部にキュー(memory- grant queue)がありWorkspaceMemoryへの割 り振りを順番に調整している。これがボトルネックにな る。 java.sql.SQLException: [IBM][SQLServer JDBC Driver][SQLServer] クエリ実行のためのメモリリソースを待機中にタイムアウトが発生しました。 クエリを再実行してください。
>>313 大きいサイズのソートはディスクも使ったマージソートになるはずなのだが、なんか別の原因じゃね?
>>312 そこでマルチプロセッサなマルチタスクおばちゃんお登場ですよ。
>>315 で、競合が発生するのでロックが必要になって最初に戻ると
317 :
303 :2005/11/05(土) 14:10:42 ID:???
>>304 それも悩みなんだよね・・・
>>305 漏れも楽観的ロックで行きたいんだけど、そういう要求なんだよね・・・
>>306 上書き禁止なので、楽観的ロックだと入力がまるまる無駄になる。
ってことでなんとかならないかってのが今の状況です。
>>307 今のところはタイムアウトつきのロックフラグが最有力かなあ。
>>308 悲観的ロックってWebサービスで使える?
>>317 そういう欲張り顧客の要望を叶える方法がただ一つ。
ajaxでkeep-alive。これ正解。
修正中画面上のjavascriptからXMLHTTPで
定期的に「更新中時刻」を更新するwebロジックにアクセスして
修正画面が開いている間は更新中時刻を常に進める。
それをロックフラグとして使えばいい。
アクセスは増大するがな。
webアプリで何とかするならそうでもするしかない。
319 :
318 :2005/11/05(土) 21:29:43 ID:???
書いたはいいがスレ違いじゃねーか コンサル料取んぞゴルァ
320 :
NAME IS NULL :2005/11/05(土) 21:32:48 ID:usWzqxrL
Javaアプレットってどうよ? 無理? 俺はぜんぜん詳しくないが。
321 :
317 :2005/11/05(土) 21:55:17 ID:???
322 :
303 :2005/11/06(日) 01:58:22 ID:???
>>321 おまいは誰だ!
>>318 Webアプリでもその設計はかなりイヤだなあ。
負荷は増大するわ、ロックが確実かどうかもわからんし。
Windowsファイヤーウォール穴を開けるのはどうしたらいい?
>>322 いや、
>>318 はイントラネット等でネットワークが十分保証されている環境で
UIの質を向上させたい場合には十分有効だと思う。
というか、ロックをガチガチにしたいような業務アプリにおいて
ネットワークが保証されていないのは前提としてダメだろうし。
大体10秒おきに更新中時刻を更新してて30秒以上経ってればOKとか
時間にマージンとればロックは十分確実でしょ。
まあもちろん水際防御として
更新時に他人によって更新されていないかのチェックは必須。
>更新しようとしてはじめて更新できないって感じだよね?
>それって作業者からすると「ふざけんなゴルァ!」って感じだと思うんだが。
>負荷は増大するわ、ロックが確実かどうかもわからんし。
欲張るなよ。そこは明らかにトレードオフだろ。
326 :
303 :2005/11/06(日) 13:46:04 ID:???
>>325 > 大体10秒おきに更新中時刻を更新してて30秒以上経ってればOKとか
> 時間にマージンとればロックは十分確実でしょ。
トレードオフは理解できるけど、常に更新時間を進める必要はあるのか?
ロックフラグ+更新開始時間を持っといて、一定時間以内なら更新可能、
で十分だと思うんだが。さすがに10分以上放置してるやつはしらないよって感じで。
漏れが前作ったのは、 リクエスト受付テーブルを作って、クライアントはそこにリクエストを入れるだけで、 別のプロセスがリクエストテーブルに入っているデータを順次処理していく、 結果を結果テーブルに書き込む。 クライアントは結果テーブルを参照してそれを表示する。 これやったおかげで多いときには1分間に千件くらいの処理でロックしまくりだったのが皆無になったよ。
こんなんでコンサル料取れると思ってる
>>318 カコイイ
>>326 >さすがに10分以上放置してるやつはしらないよって感じで。
「最長10分間しか更新する権利が保証されない」は
客がそれで納得するんであれば問題はない。
(俺の経験としては大抵期待出来ないがな)
問題なのは例えば更新画面でブラウザを閉じられた場合に
「最悪10分間更新する権利が無駄に独占される」危険性があるところだ。
俺の目には「10分じゃ短い!伸ばせ!」って言われて30分に伸ばした挙句
「誰もいじってないのに何でずっと更新中なんだ!」と怒鳴られる…
そんな筋書きが見えるわけよ。
タイムアウト時間を打算的に決めるというのはリスクが高いんだ。
アプリの設計も大事だが、顧客を黙らせる方法も勉強しよう。
331 :
284 :2005/11/07(月) 10:59:06 ID:uPqWgWc6
遅レス申し訳ありません。 レコード毎にロックフラグを持たせるようにしようと思います。 どこかに、フラグを解除する機能も持たせます。(クライアント数が少ないので、今回はこれでいいかと・・・) みなさん、ご返事ありがとうございました。 289は私ではありません。気分を害された方々、申し訳ございませんでした。 それでは、失礼いたします。
つ バールのようなもの
333 :
332 :2005/11/07(月) 13:08:50 ID:???
...orz
249 名前:<丶`∀´>(´・ω・`)(`ハ´ )さん[sage] 投稿日:2005/11/07(月) 12:08:57 ID:wvP3PvsM つ バールのような物… (・∀・)ニヤニヤ
335 :
NAME IS NULL :2005/11/07(月) 13:22:52 ID:gk8Vftz2
SQLServer 2005もVS2005と同じく11/17なのかな?
Alter database KnowledgeMarket set single_user with Rollback immediate は、シングルユーザーになるので、処理がうまくいかなかった場合は 通常ユーザーが使用できなくなります。 非常に危険なコマンドなので、やめにしましょう。 って言われたんだけどどして? なにか呪いがかかってるのか?
>>336 一緒。今日は、海の向こうでローンチイベントか・・・。
339 :
288 :2005/11/07(月) 22:34:09 ID:???
質問があります。 ストアドプロシージャで、 print 'A' print 'B' のようにした時、 クエリアナライザのデバッグで、 A B と続けて表示されず、 A行とB行の間に数行の空白行が入ってしまいます。 この空白行を出力しないように出来ないのでしょうか?
うちはそんなことにはならんが
>>340 クエリアナライザの環境設定で行間の値を設定しる
343 :
340 :2005/11/08(火) 23:19:12 ID:???
>>342 なんだ、そんな簡単なことだったんですね(^_^;)
早速試してみます。
ありがとうございました。
>>341 おまえんとこでどうなろが、どうでもいいんだよ!>知障
344 :
341 :2005/11/08(火) 23:19:43 ID:???
>>343 なんだ???コノヤローーーーーーーー!!!!!
テメェ人が親切に教えてやってるのに!!!!!!
ざけんなーーーーーーーーーーーーーーーーーーーーーー!
なぐるぞ!!!!
ゴルァ!!!!!!!!!!!!!
345 :
340 :2005/11/09(水) 11:08:05 ID:???
すみません。具体的にはどのようにすればいいのでしょか?
クエリアナライザのツールやオプションから設定するのではなく、
コマンドを打ってサーバの環境設定を変更するのでしょうか?
>>343 誰だ
>>345 T-SQLデバッガの仕様じゃない?。普通にクエリで実行すれば空白は入らない。
システムを作る時に、どんなに沢山テーブルがあっても 1つのDBの中にテーブルをまとめるのが普通なのでしょうか? リレーションシップの作成も同じDB内でしか出来ないみたいだし ADO.NETとかで別DBのテーブルがうまく結合できなかったりするみたいだし。
1つのDBの中にテーブルをまとめることで何か不都合でもあるの?
>>348 うちのシステムはやたら沢山のDBに分かれてるもんで・・・(自分が開発したわけじゃないけど)
一から設計するならまとめるもんなんでしょうか
業務上、相互に参照する可能性のないテーブルは別々のDBでもいいとおもうけど。 でも全テーブル数が少なければ(20〜30程度など)、1つのDBにまとめちゃうよ。
351 :
347 :2005/11/09(水) 20:55:15 ID:???
>>350 テーブルは数えてないけど数百(1000よりはずっと下)です。相互参照は必要なんだけど(´・ω・`)
やっぱ1つのDBにまとめたほうがいいんですね。なんでこうなってんだろ。
逆に参照が必要なテーブル同士を別のDBに分離するのって、バックアップが楽になるぐらいで、
それ以外にはなんかメリットあるのかな?
>>351 数百もテーブルがあると、グループ分けできるテーブルごとにDBを分けたくなるかも。
まとめた方がいいと思いますが。
>>351 それって迷うよね
今は○○システム(販売だとか会計だとか)単位に分けるようにしてるけど
相互参照は他のDB見るビュー作ってるから、PGは基本的に1つのDBに
しか接続してない形
あとサーバでわける、インスタンスで分ける、DBで分けると選べるけど
インスタンスで分ける意味って全然わからない...
パッケージ導入する場合とか使うのかな?
(パッケージだけ別領域にしたいということで)
354 :
347 :2005/11/09(水) 23:07:45 ID:???
一つのDBの中で所有者で分けるというのもあるでよ。 微妙だけどね。 MDFファイルを分けるというのもあるがこれはパフォーマンス向上のためなので あまり関係ないか。
SQLServer Express は結構前からβ出てるよ 平たく言っちゃえばMSDE+クエリアナライザ の2005版
>>357 そうか
もうアメリカじゃ正式版落せるんだ
2005Expressは4GBまでDB拡張できるから簡単な用途に使うには嬉しい
DTS無いのはあとあと響いてきそうだけど
DTS無いのかァ ('・c_・` )
362 :
NAME IS NULL :2005/11/10(木) 11:03:03 ID:6bUbvO8W
http://63.88.172.58/SQLServer/Article/ArticleID/44557/44557.html 32ビットのSQLServer2000の仮想記憶は/3GBをboot.iniにつけた状態で
3Gバイト、つけてない状態で2Gバイトに限られる。
AWEを使えば仮想記憶の限界を越えてメモリーを使うことができる。
重要な点はAWEのメモリーはデータベースのページキャッシュにしか
使われないことだ。プランキャッシュ、ワークスペースメモリー、
ロック、ユーザコネクション、カーソル、バックアップとリストアで
使用するメモリーは仮想記憶でしか使うことができない。
このような理由で32ビットのシステムに3Gバイトを越えるメモリーを
積むメリットは少ないのだ。
363 :
NAME IS NULL :2005/11/10(木) 11:13:21 ID:6bUbvO8W
列をあとからID列にすることは出来ないのかしら
ストアドっての今日はぢめて使ったんですが次がうまくいきません CREATE PROCEDURE hogehoge @p int AS SELECT TOP @p * FROM hoge 解決策を教えてください
declare @sql nvarchar(4000) set @sql='select top '+convert(varchar(10), @p)+' * from hoge' sp_executesql @sql
367 :
365 :2005/11/11(金) 15:05:34 ID:???
>>366 最後にEXEC付けたらできました!
sp_executesqlを入れりゃヨカタんですね
ありがとうございます
入れりゃよいっていうか、変数で指定できない部分に変数使いたいときは こうするしかないってことね。 うちで作ってるのはフィールド名からテーブル名、DB名に至るまで変動的だから こんなプロシージャばっかだよ。
で、まだまだ2000で、2005は手をつけるべきではないですかね?
付けたきゃ付けろよ
とりあえず開発PCにExpress入れよう
でも
>>366 のやり方だとクエリオプティマイザが全然役に立たなくなるんだよなー
しかしなんでTOPに変数使えないんだろうね。
オプティマイザ使いたいんだったら、一時テーブル使えばいいじゃん
table変数か何かにcursorで必要な列数だけぐるぐる回してinsertするか identity付きで全体を突っ込んでから必要な列数以上をdeleteか、だな どっちにしてもあんまり格好良くはないが…
376 :
NAME IS NULL :2005/11/12(土) 14:52:10 ID:7r4jIEe9
お世話になります。 DateTime型について質問なんですが、 例えば「2006/01/01 00:00:00」という値を入れても 勝手に「2006/01/01」になってしまうんですが、 これは仕様なんでしょうか? 他の時分秒ならちゃんと値が入るんですが・・・
>>376 表示上の問題でDateTimeの中に時分秒は必ず入ってる。
00:00:00 のとき時分秒を表示しないクライアントソフトはわりとみかける。
ソフトによって方法は違うが、表示したいなら書式を指定すればできることが多い。
378 :
NAME IS NULL :2005/11/12(土) 16:27:28 ID:nb8xqWrU
こんなこと質問すると叩かれることはわかってるんだが・・・ テーブルdatetimeで格納してる日付データを範囲で取り出すのだけど 2000/01/01から2005/012/01までってパターンなら簡単に書ける。 しかし 01/01から12/01までのデータ抽出をしたいんです。 複数行のストアドなら同じく書けますが これを一行のクエリに収めたいのですができるのでしょうか?? 偉い人教えてください!!
>>378 検索条件に関数を使うのはよいことではないがこんなところで。
where MONTH(日付) * 100 + DAY(日付) <= 1201
380 :
378 :2005/11/12(土) 19:36:49 ID:???
>>379 おお〜!!
その方法がありましたね!!
すっかり忘れておりました・・・orz
ありがとうございます!
381 :
376 :2005/11/12(土) 21:56:28 ID:7r4jIEe9
>>377 どうもありがとうございます。
表示上だけの問題なんですか?
現在ASPで開発を行っているのですが、
そこで値を取得しようとしても00:00:00に関しては取得できないのですが・・・
>381 フォーマットを指定して文字列に変換汁
既存のテーブルのカラム名の命名規則が腐ってて別名をつける方法でもあれば助かるんだけど・・・ 違う名前でアクセスするってViewを作るしか無い? ついでに質問ですが、仮に SELECT * FROM originaltable なんていうViewを作ってデータを取り出すと 元のテーブルに直接にアクセスするのと比べてオーバーヘッドはあるんでしょうか? クエリアナライザで実行プランをみると変わらないような感じですが
>>376 select replace(CONVERT(char(19),getDate(),120),'-','/')
このサンプルでどうかね
>>383 ほとんど変わらんよ
さらにSELECT *のクエリだったらそのviewに対して
UPDATEとかも出来た…はず(うろ覚えw)
DTSなかったらどうやってデータをインポートすればいいんだ?
386 :
NAME IS NULL :2005/11/13(日) 15:37:03 ID:p3B2sPUP
SQL Server BrowserとかいうのでAccessみたいにデータを簡単にいじれると聞いたのですが、 そのサービスを立ち上げてlocalhost:1433に接続すればいいのでしょうか?
>>379 >検索条件に関数を使うのはよいことではない
詳しく
388 :
376 :2005/11/13(日) 17:17:36 ID:???
>>382 >>384 どうもありがとうございます。
今は実行環境がありませんので、
明日試してみたいと思います。
>>387 検索対象のフィールドに関数や演算をすると索引が使われないってことじゃないかな。
他の条件で十分絞り込めるならその限りではないが。
>>385 BCP
>>386 まず何を使ってるのか明らかにしろ。
自分がサトラレだとでも思ってるのか?
mdfやldfファイルをSQL Server Management Studio で編集できますか?
392 :
NAME IS NULL :2005/11/13(日) 23:35:11 ID:RgU4r/VF
教えて下さい。 select * from X with(rowlock updlock) で、他の行のupdateクエリとデッドロックになる可能性はありますか? updlockの場合、対象行以外もロックするのでしょうか? よろしく、お願いします。
393 :
NAME IS NULL :2005/11/13(日) 23:44:08 ID:HWl+tCyj
>>392 デッドロックします。
対象行以外をロックするかは分離レベルに依存します。
スキャンがインデックスを使っているか表を頭からなめてるかでも
違うでしょうね。
SQLServer2005のSI分離レベルを使えば解決するかもしれません。
2005の新機能ってどこかにまとめてない? OracleでいうMERGEが使えるとか、INTERSECTが使えるとか。
395 :
NAME IS NULL :2005/11/14(月) 13:16:17 ID:67rhr+ds
仮想SQLServerへの接続
Article Q273673,
“SQL Virtual Server Client Connections Must Be Controlled by Clients,”
in the Microsoft Knowledge Base at
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q273673 クラスターのadminによってSQLServerがフェイルオーバされたときは
TCPのリセットパケットは送信されないが、kill.exeなどによってOSにSQLServerプロセスが
強制終了された場合はTCPのリセットパケットは送信される。
この仕様はquery timeoutパラメータを設定してない場合やquery timeoutパラメータを0に
セットしているアプリに影響する。
アプリがquery timeoutを設定してないとき、フェイルオーバが発生したあと
使用中のコネクションはESTABLISHED状態で残り続ける。
使用中のコネクションがcloseされないで、以降TCPパケットが送られてこないと
コネクションは完全なアイドル状態になってしまう。
フェイルオーバはクライアントアプリにTCPのリセットパケットを送らないので
コネクションは照会結果を無限に待ち続けてしまう(query timeoutを無限に設定したとき)。
そしてコネクションが応答しなくなる(ハングアップする)原因になる。
この問題をアプリの視点から解決するためにquery timeoutのパラメータを有限な値に設定すべきである。
396 :
NAME IS NULL :2005/11/14(月) 17:22:55 ID:67rhr+ds
サーバマシンの障害時はコネクション喪失の検知のされかたで動作がことなります。 クライアントが情報を読んでいる途中ならデータが来ないのでコネクションの喪失はすぐに検出されます。 クライアントが検索結果を待っている場合は少し違います。 このときの動作はクライアントのコンピュータのKeep Aliveの設定に依存します。 Windows2000ではKeep Aliveはクライアントのコネクション単位にコーディングできます。 デフォルトは2時間で、死んだソケットは2時間以内に検知されてクライアントはエラーメッセージを受け取ります。 キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\KeepAliveTime 値の型: REG_DWORD - ミリ秒 設定可能な値の範囲: 1 - 0xFFFFFFFF 規定値: 7,200,000 (2時間) 説明: The parameter controls how often TCP attempts to verify that an idle connection is still intact by sending a keep alive packet. どれくらいの頻度でTCPがキープアライブパケットを送信し、 アイドル状態のコネクションが生きているかどうか確認するかを設定します。 リモートのシステムが到達可能で機能しているならキープアライブの応答を受信確認します。 キープアライブパケットはデフォルトでは送信されません。 この機能はアプリがコネクション単位に有効にすることもできます。
明日はバルマーが吼えるのか?
なにこのつるっぱげ
400 :
NAME IS NULL :2005/11/17(木) 18:34:08 ID:/hXyVfhy
バルマーって人格障害者じゃないか。 これじゃ業績悪化するわな。
今日の午後一のBのセミナーは無様だったなw
404 :
NAME IS NULL :2005/11/19(土) 01:56:26 ID:WVGMvt0Y
質問でつ。 トランザクションの頭で制約を無効にして、 最後にコミットする前に有効に戻す方法とかストアドってあります? ADO.Netから、データアダプタのUpdateメソッド使うと、INSERTとDELETEが 分離できないので外部キー制約をシンプルにかわす方法がわかりません。 INSERT時には被参照側から、DELETE時には参照側からテーブルを更新 すればもちろんかわせるのだけど。 よろしくお願いします。
>>404 トランザクションやセッション単位でそういう機能はみたことない。
あるのはALTER TABLEを使う方法だから、メンテナンスなどでまとめてデータを流し込むとき用だな。
ALTER TABLE xxx NOCHECK CONSTRAINT ALL
ALTER TABLE xxx CHECK CONSTRAINT ALL
ALTER TABLE xxx DISABLE TRIGGER ALL
ALTER TABLE xxx ENABLE TRIGGER ALL
テーブル名を指定するときに select * from オーナー名.テーブル名 のように書きますが、オーナー名を省略できるように することは可能でしょうか。
>>406 ルールあるよ。同じテーブル名が存在した場合、オーナー名を省略すると
自ユーザ>dbo>他人のユーザ
で優先される。
>>407 ということは、自ユーザのテーブルしかない場合は
省略可能ということですよね。
それがどうもそうならなくて・・・
デフォルトは現在のログインに結びついてるユーザだよ Windows認証とかやってたりしてない?その場合はdboになるのだが。
>>408 そのユーザーにdb_ownerのロールが付いてればdbo扱いになるから、
自ユーザーのスキーマより、dboの方が優先するんじゃないかな。
>>409-410 お2人のご回答をヒントになんとか解決できました。
ありがとうございました。
どのデータベースを使っているときでも使える プロシージャって作れますか?
>>412 DBエンジンのことか?
Ora,MS,Syb,myでもってことか?
415 :
NAME IS NULL :2005/11/21(月) 00:24:00 ID:x+mH3hY9
LinuxからSQLServerにODBCでつなぎたいと思っているのですが 調べたらiODBC,FreeODBC,unixODBC,OpenLinkODBCなどたくさん出てきました。 無難で安定しているものを選びたいのですが、どのドライバがよいのでしょう。 もしお薦めのものとかありましたらよかったら教えてください。 環境はちょっと古いRedHat7.2を使っています。
初歩的な質問だと思うのですが、(local)を接続文字列で指定して接続ができないというのは何が問題なのでしょうか? サーバー名を指定した場合には接続できます。
>>415 DataDirect社の製品も採用実績が多いから候補に入れてみたら。
>>416 "."とか"(local)"を指定した場合は接続プロトコルは
Shared Memoryのはず。
それが使えるようになってるか確認してみては。
>>418 みたらSharedMemoryだけ有効になってますた。
TCPとNETBeui有効にしてもつながりません・・・orz
プロバイダには何つかってんの? SQLネイティブクライアント?
Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=(local) 漏れのは↑でつながるけど。
422 :
416 :2005/11/22(火) 17:01:34 ID:???
server=マシン名\\SQLEXPRESS;Integrated security=true ;でやると接続できてます。 Sqlネイティブクライアントと使ってます。
>>422 インスタンス名が付いてるならそれは省略できない。
.\SQLEXPRESS でいける。
もしかしたら (local)\SQLEXPRESS ともかけるかもしれないからやってみて。
SQLEXPRESSインスタンスって、勝手にインストールされちゃうあれか。 設定なしでDB使えるのはいいけど、もっとましな方法なかったんだろうか。
425 :
416 :2005/11/22(火) 20:04:13 ID:???
>>423 つながりますたーーーーーー!
インスタンスとかよくわかってません。勉強してきます。
Sql2005Express使ってるんですが、ManagementStudioのインストール時に例外が発生する。何回か起動していたらまったく起動しなくなったなどバグ多数です(´・ω・`)
全アンインストール後再インストールで何とか動くようになりますた。
SQLServer 2000 or 2005 で制約をコピーする方法ってある? SELECT INTO でテーブル定義はコピーできるけど、 これだとNOT NULL制約しかコピーされないんだよね・・・
>>427 何をしようとしてるの?
プログラムロジック中に動的にテーブルを生成しようとかしてるのかな?
429 :
427 :2005/11/23(水) 23:39:25 ID:???
DBを使ったテストを簡単にできないかと試行錯誤中なのでつよ。 テスト開始時にどんなデータがはいってるか分からんから、 コピーしたテーブルを使ってテスト開始時の状態を特定したいわけ。
それってデータだけあればいいんでネーノ
最後にロールバックかければいいんでねーの?
そういえば、select intoではdefaultもコピーされねんだよな。
433 :
427 :2005/11/24(木) 22:38:26 ID:???
>>430 いや主キーの重複とか外部制約とかないと、
制約があることに依存してるテストができないじゃん
>>431 今その方法で実験中。うまくいってるっぽい。
最初にデータ全削除、初期データINSERTってやってるから
パフォーマンスは良くないけどね・・・
>433 DBのファイルをコピーして、別DBにアタッチしたほうがはやいんジャマイカ。 それで同じ環境できるよ?
DB名を変えてRESTORE DATABASEでもいいな
漏れも
>>434-435 の方がいいと思うけど。。。
最後にロールバックをかけない手順で上手くいっているのかもしれんが、
実際の動作とは異なる状態でテストをするのはチト怖い。
437 :
436 :2005/11/24(木) 23:30:44 ID:???
漏れは何を書いてんだ。。。 orz 最後にロールバックをかけない ↓ 最後にロールバックをかける
438 :
427 :2005/11/24(木) 23:58:51 ID:???
>>434 ,
>>435 それだとテスト開始時にDBの状態が不定じゃない?
>>436 > 実際の動作とは異なる状態でテストをするのはチト怖い。
これがよくわからない。
今の手順は↓感じ。要はDBUnitを.NETでやろうとしてるわけね。
実際の動作とどこが違うの?
1.トランザクション開始
2.DBのデータ全削除
3.初期データのINSERT
4.テストコード実行
5.DBの状態をチェック
6.ロールバック
>>438 >それだとテスト開始時にDBの状態が不定じゃない?
自分が望む状態でバックアップを取っておけばいいんじゃないの?
万が一テストで壊してしまったらバックアップから戻せばいいんだから確実だと思う。
440 :
436 :2005/11/25(金) 01:55:15 ID:???
>>438 テストのフェーズ次第だから、あまり真剣になられると困ってしまふ。
ユニットテストならそれでいいのかもね。
結合テストとか負荷テストのフェーズで正常時はデータ書き込み、コミットの流れなのに
データ書き込み、常にロールバックだと実際の動作とは異なるし…という程度の意味。
んで、皆も書いているけど、DBの全データ削除、初期データをINSERTをした状態のDBを
保管しておいて、アタッチした方が楽なのでは?ということデス。
DTSが使えるならそれでコピーが一番確実、dtsrun というコマンドベースのi/fもある。 使えないで、バックアップ・リストアなどデータベース全体にかかわる操作をしたくないなら、 テスト前に select into や bcp でデータを退避しておいて テスト後にテーブルを truncate してから退避したデータをinsert selectやbcpで戻す。 プログラムが動的にテーブルの構造を変えてしまうようなものだと駄目ですけどね。
443 :
NAME IS NULL :2005/11/25(金) 16:42:47 ID:euFM0n56
444 :
427 :2005/11/25(金) 22:17:21 ID:???
いろいろな方法があるものでつな。 まあ今やろうとしてるのは単体テストで、肝はDBの初期状態の特定と状態チェックなんだよね。 結合とか総合の時に教えてもらったアイデアを検討してみまふ。 ところでDBの状態チェックは自動化してないの? 漏れはO/Rマッピング使ってそこも自動化しようと目論んでまつが。
445 :
NAME IS NULL :2005/11/25(金) 22:57:11 ID:nfczkiDK
T-SQLで、カーソル定義するときに、条件をつけて、Aならこっちのカーソルを、Bならこっちのカーソルを実行 というようにはできないだろうか…
ストアドにC#が使えてしまう罠。
カーソル使わないで一時テーブルで何とかしようと思う
SQLServer2005のエンタープライズマネージャの変わりになるやつは ↓をGUIでできるようになってるかなぁ? −−−− Update 更新テーブル名 set 項目名1 = 参照テーブル名.項目名1, 項目名2 = 参照テーブル名.項目名2, : 項目名n = 参照テーブル名.項目名n from 更新テーブル名 INNER JOIN 参照テーブル名 ON 更新テーブル名.結合項目名 = 参照テーブル名.結合項目名 where 抽出条件式 −−− なんでGUIでUPDATEで他のテーブル参照することができないのだろうか AccessのADPでもできないし 利用頻度多いと思うんだが手抜きなのかしら
確かにホスト時代の老害が書いたシステムとかで
ストアドが片っ端から全部何をするにもカーソル使って
where無しの結果から一行ずつ処理するように書いてあったりすると
>>448 って感じだな
>>450 使いやすいようにGUIで表現するのが難しいからじゃない?
ちょっと考えても画面からテーブルのカラムをぽちぽち関連付けたりするんなら
いい編集機能があるエディタでがーっと書いた方が手っ取り早い気がする。
つーかクエリアナライザのエディタ機能のクソッぷりは
Express Managerでも大して変わってなかったなorz
>>452 AccessのMDBだと昔から実現できてるんだよね
だからGUIで表現できないってことはないと思うんだよ
他にもGUIだとサポートされていない機能いろいろあるけど
UPDATEに限って言えば問題ないような気がするんだけどなぁ
SQLServer2005ぐらいになったらインテリセンスが導入される
ぐらい成長して欲しかったんだけどw
>>452 SQLライターはストイックなんだよ。
あれでストアド書くのが骨頂なんだ。
SQLは例外も飛ばさないしね。 良くも悪くも…
人生をロールバックできませんか?
つまんねーカキコすんな
ntext型のフィールドを持つテーブル変数に対してUPDATETXTってできないのでしょうか? UPDATETEXT @test.doc @pointer NULL @insertText に対して 「'@test'の近くに無効な構文があります。」 と怒られるのであります。 @testはテーブル変数でdocというntext型のフィールドを定義してあります
460 :
NAME IS NULL :2005/11/28(月) 19:43:26 ID:Mysz4w2G
教えてください。 SQLServer2000で id a1 b1 c1 a2 b2 c2 a3 b3 c3 ・・・・abcが数十組ある ------------------------------------------- n01 null null null null null null ・・・ n02 あ い う null null null ・・・ n03 え お か き く け null ・・・ n04 null null null null null null ・・・ n05 こ さ し null null null ・・・ のようなテーブルを id a b c ---------------- n01 null null null n02 あ い う n03 え お か n03 き く け n04 null null null n05 こ さ し のようにするにはどのようにしたらよろしいですか?
テーブルを設計しなおす
>>461 もとのテーブルはいじれない状態なんです。
こういうパッケージソフトなんです。
>>462 一組単位(a,b,c)で全部がNULL or 全部が非NULLになるという前提で、
こんなビューまたはストアドを作成する
select id,a1,b1,c1 from t
union
select id,a2,b2,c2 from t where coalesce(a2, b2, c2) is not null
union
select id,a3,b3,c3 from t where coalesce(a3, b3, c3) is not null
...
order by id;
>>463 ありがとうございます。
実際はもうすこし複雑な構造なので、これを基に
試行錯誤してみます。
ビュー作って、ユニオンして、ディスティンクトかな。
>>463 全部がNULL or 全部が非NULLになるという前提 が覆ったとしたら
ちょっと手間になるけど
select id,a1,b1,c1 from t
union
select id,a2,b2,c2 from t
union
select id,a3,b3,c3 from t
:
の結果からa is null and b is null and c is nullの行を削除、
その後元テーブルのidと外部結合、とかが一番直感的かなあ。
結果セットを2つ返すSP呼んだ場合 どうやって2つの結果セットを取得できるのでしょうか? 1つだけなら取得できるのですが…
>>467 ADOならRecordset#NextRecordset
469 :
467 :2005/11/30(水) 10:51:16 ID:???
>>468 説明足らずですみません。
あるSPの中で2つの結果セット返すSPを呼んでイジリたいのです。
>>469 あまりいい方法は無いと思う。
二つの結果セットが同じ数で同じ並び順で互換のある型を返すなら、
insert into #tmp exec sp_xxx
で2つのセットがunion allされた感じで取得できる。なぜか#tmpのところにtable型は使用できない。
呼び出されるほうのストアドをいじれるならカーソルを2つ返すように変更するのが無難かな。
472 :
NAME IS NULL :2005/12/02(金) 17:13:49 ID:2VDowwy3
PHPからMSSQLを使用しているのですが、 TEXT型にマルチバイト10,000文字を突っ込んでも4096バイト分しか保存されないんです。 何か制約があるのでしょうか? ちなみに使用しているエディションはDeveloperでPHPは4.4.0です。
473 :
sage :2005/12/02(金) 17:41:04 ID:2VDowwy3
>472 自己レスです。 SET TEXTSIZEで解決しました。
>473 詳しく
>>474 PHPはよく知らないけどDB-Library を直接操作してるってことね。
SET ANSI_NULLS もOFFのままなのかな。
デフォルトは4Kらしい。MSDNより・・
>SQL Server ODBC ドライバと SQL Server 用 OLE DB プロバイダは、
>接続時に自動的に TEXTSIZE を 2147483647 に設定します。
MS的にはODBC接続はもう時代遅れ扱いだね
477 :
NAME IS NULL :2005/12/06(火) 17:49:07 ID:SOr+Ue5p
毎度どうも。 テーブルを色々整理して、ストアドのSQL文を今必死こいてやっているのですが、素朴な質問いいでしょうか? INNER JOINを使ってテーブルを結合し値を拾っているのですが、ものすごくINNER JOINの数があります。 とりあえず11個あるのですが、よくないでしょうか? INNER JOINを増やすよりもストアドを増やしたほうがいいのでしょうか?
>>477 >INNER JOINを増やすよりもストアドを増やしたほうがいいのでしょうか?
ここのところの意味がちょっとよく分からない。
しかし必要な結果セットを得るために11の結合が要る、というのは
なんか設計が微妙な気がするな…。
479 :
NAME IS NULL :2005/12/06(火) 18:14:19 ID:tEQ2Ls8f
Access2000からSQLServer2000に移行中なのですが、 Accessではパラメータクエリをネストして使ってました。 例 <クエリ1> SELECT * FROM テーブル1 WHERE 項目1 = [パラメータ1] <クエリ2> SELECT * FROM クエリ1 WHERE 項目2 = [パラメータ2] これをSQLServerに移植しようとしたとき、 クエリ1に相当するプロシージャ1は作れたのですが、 <プロシージャ1> CREATE PROCEDURE プロシージャ1(@パラメータ1 int) AS SELECT * FROM テーブル1 WHERE 項目1 = @パラメータ1 GO クエリ2に相当するプロシージャ2が作れません。 どうすれば同等の処理を行えるか、教えて貰えませんか?
480 :
478 :2005/12/06(火) 18:16:00 ID:???
>>478 誠申し訳ない
SQL文は全てストアドを使っているのですが
@INNER JOINを一杯使う
AINNER JOINを減らしてID(キー)を取得してクッキーかどっかにとりあえず置いといて10個のストアドを行うか
っていうことです。
ちなみにテーブル構成は、大元のテーブルがAとBとあり、テーブルAが親でテーブルBが子の関係となっている。
さらに、テーブルABのフィールド内部にはリレーション関係にあるテーブルが20個ほどあるのです。
イメージつきますか?
まぁ早い話が車の変動する情報と諸元といったほぼ固定の情報とメーカーなどといった情報をリンクさせて一発で
ごっそりデータを抜き取るか、1個ずつちまちまデータを抜き取るかの違いです。
どっちがいいのだろうか・・・
>>480 外部結合や1:nやn:nの内部結合は計画的に使わないとアレですが、
コードのデコードのように1:1のものはいくつあっても平気だと思います。
この手の結合なら結合自体のサーバーへの負荷は小さく、
サーバークライアント間の通信回数を減らせるのでパフォーマンスは上がるはずです。
レコード数が少なくてほとんど変更が無くデータに鮮度が求められないものは
先読みでクライアントプログラムの連想配列にぶち込んどくのも手ですけどね。
レコードに更新が入った時に自動的に更新時刻を更新するトリガを 書きたいのですが、プライマリキーがあれば UPDATE table SET updtime = getdate() FROM inserted WHERE table.code = inserted.code のように書けると思うのですが、プライマリキーが指定されて いないテーブルのレコードの特定はどのように行なえば よいでしょうか?
>>482 プライマリキーというかユニークなキーが全く無いテーブルじゃレコードの特定は無理
484 :
478 :2005/12/06(火) 20:16:20 ID:???
連想配列・・初めて聞くものだ・・・ ちょっと調べてみましたが、いまいちよく分かりません(涙 要するにクライアント(閲覧ユーザー)にメーカーならメーカーの値を先に突っ込んどいて、 ページが変わった時等は突っ込まれたメーカーの値を読み取る。 メーカーの値に限定するならば、サーバーへのやりとりは最初だけで、あとはクライアント内でのやりとりってことでしょうか?
やはりそうですか。テーブル設計を考えます。 ありがとうございました。
>>484 マップタイプのコレクションともいう。要は全データキャッシュしてしまえっていう使い方ですよ。
要するに・・以下はどこをどう読めばそんな結論になるんでしょうか(笑)
>>478 >>480 読んで思ったけど、
固定の情報の部分については結合された状態の情報を
前もって表示時に用いる冗長なテーブルとして用意しておいて、
表示時にはそれに変動する情報だけ結合する、
という感じにするというのがいいのではなかろうか。
固定の情報が更新されたらそのテーブルも同期させて更新する。
>>482 AFTERトリガだとちょっと手の打ちようがないけどINSTEAD OFトリガなら
そのタイミングで日付のカラムの値を補完できないかな?
2005 でも date 型と time 型分けられない?
>>480 INNER JOINの代わりに副問い合わせや相関サブクエリを使うといいよ。
INNER JOINの数は減らせる。
SELECT 受注.受注No, 受注.ID, 品名.名称
FROM 受注
INNER JOIN 品名 ON 受注.ID = 品名.ID
↓
SELECT 受注No, ID, (SELECT 名称 FROM 品名 WHERE ID = 受注.ID)
FROM 受注
>>487 みたいにするならビューにした方がいいと思う。
小さいビューを複数作って、最終的に結合してもいい。
>>479 ストアドプロシージャはそのような使い方はできません。
クエリ1をビューにするか、テーブルを返すユーザー定義関数を使うといいです。
おっと、パラメータが必要ならユーザー定義関数だな。
>>491 ユーザー定義関数ですか。調べてみます。ありがとうございました。
493 :
478 :2005/12/07(水) 11:23:02 ID:???
おはようございます。複数のレスありがとうございます。 早速マップタイプコレクションでぐぐってみたら大戦略がでました。3990円だそうです。何か違う・・・ 全データキャッシュですか・・マスター部分だから有といえば有かと思っています。 同期を取るというものいいなと思ってます。 ビューに関しては初めて聞くものです(涙 ストアドみたいな物みたいですが、SELECT専用と考えた方がいいのかな? ユーザーが閲覧するトキDataGridの表示する時にも使えそうですね・・ っていうか今までストアドにSELECTかけていたのをビューにごっそり移動させればいいのかな? 一介の車屋には荷が重そうですが、がんばってみます。
>>493 やり方はひとつじゃないうえ、ケースによって最良解は違ってくる。
記述のしやすさや、パフォーマンス、見通しのよさなど少しずつトレードオフがあったりするから
いろいろ試してみて頂戴。
結合がきれいにスター型になっているなら11個のJOINでも問題は無いと思うが、
そうなってない場合は複雑になりがち。
table型を返すユーザー定義関数は内部的に一時表を作るから使い方によってパフォーマンスが上下する。
相関サブクエリも使い方でずいぶん見易さやパフォーマンスが上下する。
連想配列の話は混乱させただけのようだからとりあえず忘れてくれ。
SQLだけですべて解決しようとしないでプログラム側で少し処理を
してやればよいケースもあることをいいたかったのだ。
AccessからSQLServerに移行でなやんでいます どなたかテーブルの設計のヒントを下さい><; 商品マスタに使用頻度が高いレコードと、廃止したレコードを識別するために bit型で2のフィールドを作りました 1.良く使用フラグ(True:良く使う(1割)/False:良く使わない(9割)) 2.廃止フラグ (True:廃止(2割)/False:廃止じゃない(8割)) ほとんどの場合で「良く使用フラグ」はTrue、「廃止フラグ」はFalseで抽出します ので、インデックスをつけようと思ったのですがBit型ではインデックスを 付けられないとエラーになりました(Accessではできたのに) 調べたらbit型では男と女を例に取って、インデックスを使用する意味が無い から付けられないというようなことが書かれていました 確かに男と女の様に5:5の割合になるようなものはそうでしょうけど、1割 しかない場合はインデックスが有効に使えると思うのですが、そういう ものではないのでしょうか? 仕方がないので、bit型をやめてtinyint型かchar(1)型にしようと思っています もしこういう場合の定石みたいなものがあれば教えて下さると助かります。
>>495 そのフラグだけで問合せたりすることは頻繁にあるの?
498 :
478 :2005/12/07(水) 17:23:06 ID:???
>>494 丁寧なレスありがとうございます。
実際分からないことだらけなので、勉強しながらジワジワと進めて生きたいと思います。
でもDropDownに値を2つ入れることが出来ればサクッと終わるのですけどね・・
IDとTEXTを入れる事ができたらなぁ・・・
>>496-497 レスありがとうございます
このフラグでの問い合わせは頻繁にあります
この2つのフラグに加えて商品を分類する区分や商品名を部分一致
で検索したりします
商品マスタは現在は全部で5000件ぐらいです
>>495 インデックスは、ある程度値がばらけるものにつけないと意味がない。
意味がないというのは、つまり検索の高速化に寄与しない。
一方インデックスをはると、更新の際インデックスを再構築するために
余分な時間がかかるので、必要でない限りはるべきではない。
要するに、tinyintにしようがcharにしようが、項目数がわずかのものに
インデックスをはるのは宜しくないということ。
ただ、インデックス云々とは別に、1.と2.をまとめるのはありかも。
使用頻度レベル
0 : 使用しない(論理削除状態)
1 : 使用頻度低
2 : 使用頻度高
みたいな感じで。
Object Browserのように、 スプリクト出力時にデータも一緒に Insert文で出力したいのですが、 どうすればいいのでしょうか?
>>500 >ある程度値がばらけるものにつけないと
1〜2割と言う数字がその「ある程度」に当てはまるかどうかがポイントですね。
一般的には3〜5%?とか言われていますね。
>>501 標準のツールにはないけどその程度のものなら市販かネット上に転がってるような気もするな。
>>499 商品分類区分や商品名の方が分布が広そうだから索引を作るとすると
第一キーはこの二つになるだろうし、それで十分絞り込めそうだから、
その後ろにそのフラグを第二キーとして続けるかどうかはお好みだね。
ちなみに、フラグと商品分類区分に別々の索引を作って、
フラグと商品分類区分の両方を条件で検索した場合は、
分布が広いほうが使われてもう一方は使われない。
504 :
495 :2005/12/07(水) 21:08:33 ID:???
皆様ありがとうございます 参考になりました >フラグと商品分類区分の両方を条件で検索した場合は、 >分布が広いほうが使われてもう一方は使われない なるほどそういうものですか Accessでは検索条件が全部インデックスになっていると とても高速で検索できる機能(名前忘れましたが)があった のでその感覚で考えてしまっていました
ビットマップインデックスという言葉を聞いたことがある
自動カバリングインデックスはB-Treeの最終リーフを共通にするもので、 create index index1 on tableA (key1) create index index2 on tableA (key2) とすると select key1 from tableA where key2 = xx select key2 from tableA where key1 = yy の問い合わせの高速化が図れる。 select * from tableA where key1 = xx and key2 = yy key1+key2で索引があるわけではないのでkey1だけでB-Treeは使われでkey2は レンジスキャンとなる。またはその逆。多少は早くなるかもしれないが create index index3 on tableA (key1, key2) の索引には及ばない。
自動カバリングインデックスはMSSQL 7.0で話題になった機能で、 同時代のMS Accessにも採用されてましたが、 MSSQL2000では影も形もない。どなたか消息をご存知ですか?
509 :
NAME IS NULL :2005/12/08(木) 23:25:17 ID:uwYEkJlP
ビューに関する質問の窓口はここですか?
>>509 もちろんMicrosoft SQL Serverの範囲のことなら
初心者名質問なんですが、 テーブル数がひとつ。ユニークキーを持つ ユニークキーを元に検索・更新をほぼ随時繰り返す。 そのほかにユーザーのリクエストによりユニークキーを含む任意の条件で検索を行う。 レコード数は30万件ぐらい。 このような条件でメモリ使用量が250Mぐらい逝ってるんですが、これって普通なんでしょうか? CPU負荷も結構高い・・・
512 :
NAME IS NULL :2005/12/09(金) 11:22:12 ID:sKa3VoEz
ASP.NETのSQL SERVERを使っています。ビューについて質問ですが ビューってストアド内部のみ呼び出しが加納なのでしょうか? それ以外の部分(ASP.NET上のソース)で使いたいと思っても ストアドを呼び出す感じに何かソースを組めば使えるのでしょうか?
>>512 読み取り操作に関してはTableとまったく同等に扱える。
結合や関数や演算の無い単純なVIEWならば更新も可能。
VIEWはSQL Server側のオブジェクトだからどこからでも利用可能。
ちなみにSystem.Data.DataViewはSQL ServerのVIEWじゃないから間違わないように。
>>511 多い気もするがレコード長や「随時」の頻度がわからないからなんともいえない。
「ユニークキーを含む任意の条件」というのはユニークキーを必ず含むということか、
それとも含むこともあるが含まない検索もやってるということか?
515 :
511 :2005/12/09(金) 14:36:58 ID:???
>>514 厳密ではないのですが、
レコード長:varchar(255)*3 DateTime*3 long*3
頻度:主にユニークキーを含む検索を秒間8-10件
です。
SQLServerはメモリあまってるときには多めに確保して、システム全体で少なくなっていった場合はそれなりのメモリ確保を行うと考えていいのでしょうか?
EnterpriseManager でデータベースのバックアップを取る際に、 指定できるディレクトリが SQL Server の動いているPCのローカルドライブ のみでネットワークドライブが表示されないのですが、 バックアップをネットワーク上の共有ディスクなどに取るには どうしたらよいのでしょうか?
>>516 \\servername\…
で直接指定できないかな
518 :
516 :2005/12/10(土) 10:18:34 ID:???
>>517 そんな単純な問題じゃないんだよ!>アフォ
m9(^Д^)プギャー
>>518 そんな単純な問題なんだが。SQLServer7だとネットーワークへは無理だけどな。
2000威光を使え。
>>520 そうなの?
うちのSQLServer2000もEnterpriseManagerだと
ローカルドライブしか選択でないよ
そういう仕様なんだと思ってたから諦めたけど
ウチは2000だけど、以下のようにしてネットワーク共有先にバックアップ取っている。 ご参考まで。 ・サービスのMSSQLServer、SQLServerAgentのログオンを共有先に書き込めるユーザー、パスワードに変更 ・バックアップ先は一覧には表示されないので "\\サーバー名\共有名\バックアップファイル名" で指定
>>521 選択は出来ないが手で直接打ち込んだら桶。
>>523 直前の522が正解を書いてるのにまだこういう回答をする奴がいるんだぁ。感心した。
>>524 おいおい523だが、テメェー俺に喧嘩売ってるのか?
>>525 あたま悪そう。「メェー」って、お前はヤギか?
>>522 >サービスのMSSQLServer、SQLServerAgentのログオン
>を共有先に書き込めるユーザー、パスワードに変更
これのせいでした
どうもありがとうございました
AccessではUNION ALLで結合したビューを集計かけると、 テーブル表示までに60秒以上と異常に重くなってたんですけど、 例: <view3> SELECT 1, ID, 値 FROM view1 UNION ALL SELECT 2, ID, 値 FROM view2 ※view1・view2ともに約1万行 view1・view2内にはサブクエリはあるがUNIONや集計関数はない <view4> SELECT ID, SUM(値) FROM view3 GROUP BY ID 同じビューをSQLServerで作るとテーブル表示まで3秒ぐらいになりました。 これはやっぱりSQLServerの恩恵と見ていいのでしょうか。 また、これはもっとチューニングの余地があるでしょうか?
Access なら sum やつを union して sum するとか
SQL Server 2000でストアドを作っています。 単純なループなのですが fetchが何故か失敗してしまいます。 whileの前のfetchは成功するのですが、 while内部のfetchは@@FETCH_STATUSが-1となってしまいます。 テーブルのカラムの型もintで正しいと思うのですが、 原因がまったくわかりません。 どこが悪いのでしょうか declare tmpA int declare curManager cursor for SELECT A FROM TableA open curManager fetch curManager into @tmpA while @@FETCH_STATUS = 0 begin fetch curManager into @tmpA end close curManager deallocate curManager
533 :
532 :2005/12/13(火) 20:26:49 ID:???
@@FETCH_STATUSの値の意味を勘違いしていたようです。 すみませんでした。
在庫管理システムをAccess+SQL Serverで開発するのですが、 何かいい本と、排他制御のテクニックを教えてください。
Viva!楽観的ロック♪
SNMPでカウンタ取得したいんだけどうまくいかない。 SQL serverインストールするときにsnmpサービスが入っていたらSQl serverのsnmpも有効になるってオンラインヘルプ には書いてあるんだがダメだった。 誰かSQL serverでsnmp使っている人いる?。
Commit するまで UPDATEした行を 他のセッションから SELECT できないんですが、、、
538 :
NAME IS NULL :2005/12/14(水) 16:31:11 ID:5gWaPRnG
>>537 がっつり排他ロックしすぎなだけなんじゃネーノ
オラ並な読み取り一貫性になるだっけ?
read commited snapshot というのがOracleのそれ互換のようだが、 データベース単位の切り替えのようだからどっち使うか迷うな。
542 :
NAME IS NULL :2005/12/15(木) 16:51:16 ID:Dks4wFVL
ストアドでテーブルの全レコードけしてもうた・・・orz バックアップはとってない・・ 復元する方法はありますか?
>>542 ロールバックは?
コミットまでしちまったのならあやまるか逃げるか辞表が一番早いよ
コミット済みだよ・・まじっすか・・・orz 。・゚・(ノД`) ワーン
HD復旧ツール試して見れ。まず無理だけど。
>>542 Server 2003 使ってて VSS が走ってればある時点までの復旧ができるよ。
547 :
NAME IS NULL :2005/12/15(木) 22:25:09 ID:zlh9weUc
2005日本語版完成age 2/1発売なのにもう2000は旧バージョン扱いか。
このページを見るとこんな事が書いてある。
http://www.microsoft.com/japan/presspass/detail.aspx?newsid=2531 > マイクロソフト株式会社(本社:東京都渋谷区)は、エンタープライズ データ マネジメント・分析プラットフォーム
>「Microsoft SQL Server(TM) 2005 日本語版」(以下、SQL Server 2005)、および統合開発環境「Microsoft Visual
>Studio(R) 2005 日本語版」(以下、Visual Studio 2005)の開発が12月15日(木)に完了し、2月1日(水)にボリューム
>ライセンス製品、2月3日(金)にパッケージ製品を、それぞれ発売します。
> また、両ソフトウェアの簡易版であるSQL Server 2005 Express EditionおよびVisual Studio 2005 Express Edition
>の一般向け無償ダウンロード提供も、本日より実施します。
ということでSQL Server 2005 Express Editionのダウンロードページを探しているのだがどこにも見あたらない。
どこにあるんだいったい?
>>544 SQLServerのログからは復旧できないのか?
>>548 Express Edition って17日からって前にアナウンスあったよね?
551 :
NAME IS NULL :2005/12/15(木) 23:38:34 ID:c9PjXoaC
MSDEで十分ですよ
英語版のところからすぐだけど
>>555 釣りか?
日本のSQLServerのサイトからリンクがないってことだつーの
Win2003 Server WebEditionをMUIで日本語にして SQLServer2000のDevelopersEditionをインストールしようとしています。 「インストール」をクリックするといきなりインストールウィンドウが 消えてアプリが終了しているようです。 このバージョンってインストール出来なかったでしょうか? 色んなキーワードでググって見ましたが事例が見つからない・・・。
>>557 そーそー。クライアントツールはインストールできるんだけどね。
なので、Web Edition の制限じゃないかと思われ。
559 :
557 :2005/12/16(金) 19:33:10 ID:???
>>558 やっぱり無理なのか。勉強不足を反省。
OS変えるとか別の手段を考えてみます。
>>559 一個言い忘れ。2005 をインストールしようとすると、この OS には対応してない、
みたいな明示的なエラーメッセージが出る。
2000 が対応してるかしてないか、俺も資料をあたったわけではないけど、↑から
そうなんだろうと推測してる
SQL Server Management Studio Express ってまだ正式版ないのかorz
会社でsqlserver2000を使用した開発を行っているのですが、 開発する上でなにか便利なツールはないでしょうか?フリーでもシェアソフトでもけっこうです。 皆さんが使用しているものでお勧めがあればご紹介頂けないでしょうか? よろしくお願いいたします。
クエリアナライザ
>>561 正式版じゃないけど俺は普通に使えてるよ
便利便利。
しかしBooks Online 2005入れると起動しなくなる罠orz
レジストリいじらんといかんのよね
osql.exe以外有り得ねえ
SQL文をVBに貼り付けるときに自動的に””でくくってくれたり 逆にVBの文中のSQLから改行や””を削除してクエリアナライザ で通るようなSQLに直してくれる便利ツールってないですか?
>>566 ここは一つ発想を転換して、ソースからSQLを追い出す方向で考えてみては?
>>567 ストアドってことですよね?
ソート順位とか動的SQLどうしても作ること多いのでなんとかならないかなと
VB扱えるのなら、そんなツールすぐ作れるだろ
>>568 まあパフォーマンスなんかも含めてTSQLがベストでしょうね。
どうしても動的SQLが減らせないのであれば、570の言うようにO/Rマッピングがよいかも。
私はiBatisしか使ったことがないですが、SQL外出し以外にもいろいろ便利です。
ソート順であれば、ソート列や昇順降順のところだけ置換したりできます。
VB.NETならiBatis.NETが使えるのかな。素のVBなら知らない。
>>570-571 O/R マッピング とか考えたこともなかったです
調べてチャレンジしてみたいと思います
探したらcseってソフトがありました これも使ってみようと思います
>>566 VB6なら
> VBの文中のSQLから改行や””を削除して
イミディエイトウィンドウでさくっと。
ソースからSQL追い出すならData Environmentデザイナを使うといいかも。
以前はソースからSQLを追い出す派だったんですが 人のソース(外注のソース)を現地でデバッグすることが 多くなってからは埋め込み派です。
以下の仕様のcsvファイル ・文字列は「"」(ダブルクォート)で括る。 ・文字列データ中に「"」が存在する場合は「"」でエスケープする。 をbcpで取り込む場合、どのような ファーマットファイルを作成すれば取り込み可能ですか? 例えば、データが abc",efg(文字列)と123(数値)がレコードデータだとすると、 csvには "abc"",efg",123 という形式で作成されます。 このようなデータを取り込む場合の ファーマットファイルの記述の仕方が分かる方は ご教示ください。
>575 俺も俺も
>>575 今は外注でなく協力会社と呼ばなければならない
まぁ別にどーでもいいけどね
581 :
NAME IS NULL :2005/12/20(火) 12:15:29 ID:QDC+WqEN
>>575 激しく同意。
VS2002だった頃はコンポーネントクラスに、
DataAdapterとかD&Dしてたけど、
後々見るとSQL文が見づらいので、やめた。
ん、ORMを使ってそもそもSQLをほとんど書かない(Hibernate)とか、XMLファイルに 外出しする(iBatis)のが最近の流れではないのかな。
その流れのメリットがいまいち分からないな、、
584 :
582 :2005/12/20(火) 19:39:23 ID:???
>>583 .NETだと、型指定データセットとかそれを取り巻くツールが充実しているから
それほどメリットがないのかもしれませんね(.NET向けORMもあるようですが)
ADOのRecordsetしかない状況で、接続→Query→Recordsetからデータ移し変え
のようなことをやることを考えると相当楽になります。
移し変えずにRecordsetをPresentationまで持っていくような場合は知らない。
Object Spaces でてたら MS 側ももっと ORM に加速するのにな おせえよ
587 :
NAME IS NULL :2005/12/22(木) 12:32:27 ID:Qu1ddMxs
>>585 読む側が、これでOracleと同じ動作になりそうだが、
更新側が心配。
つーか更新もOracleと同じ動作
更新側が、UPDATE した行を SELECT したら更新前の情報だったり、、 いや、試してないけどね。
Read committed snapshotはデフォルトでOFFだから安心しろ
UPDATE が COMMIT した後なら普通に更新後の値が返るんじゃねーの
viewって仮想テーブルだから、 本来のテーブルを占有しちゃうはずはないんですよね…?
>>592 占有の意味がわからん、もちっと具体的に質問してくれ。
594 :
NAME IS NULL :2005/12/23(金) 13:29:21 ID:Xxh6gBa/
12/30〜12/31にSQLServer2000祭を行います。
595 :
NAME IS NULL :2005/12/23(金) 17:10:06 ID:RLnfzljz
SQL server2000ですが、同時に複数の登録・更新・削除などの行為があった場合 予約みたいに順番に登録などをする事ってできるのでしょうか? 予約が無いと同時にアクセスした場合、微妙に誰かのアクセスが拒否されると思うのです。 その場合、大量のデータの場合だと激しく時間が掛かりそうなので、予約が出来ればいいなと思いました。 SQL文で行うのでしょうか?それとも、SQL server側の設定?あるいはそんなものは無い?
597 :
592 :2005/12/23(金) 22:44:27 ID:DYNYxD7M
会員テーブルと言うテーブルを元に作ったviewで、 検索・データダウンロードなどなど行う時、 (多分なのですが)会員テーブルを直接触る行為をすると、 タイムアウトのエラーが出るのです。 なので、ダウンロードなどの処理に時間がかかってるため、 テーブルのデータを更新しようとしても viewで占有しているからできないのかなぁと思ったのでした。 どうでしょうか…。
>597 VIEWだからってより、そのVIEWをどうやってどういうふうに呼んでいるかによるような希ガス
599 :
NAME IS NULL :2005/12/24(土) 02:39:38 ID:MpJIFJvt
>>597 Viewだからでなくて、会員テーブルを直接触るという行為でトランザクションをコミットしないで長時間放置してるんじゃない?
>>594 祭りってなに、曙とか出るの?
SQL Server 2005 って結構なスペックを要求してるけど、 2000と比べると重かったりパフォーマンスが落ちてたりするんですかね?
>>601 MSはクエリのパフォーマンスは上がってるて云ってるし、オプティマイザも
進化してるようだから実際にパフォーマンスは上がるんじゃないの。
pubs や Northwind を使って検証してみれば?
603 :
592 :2005/12/24(土) 22:04:48 ID:rrL+lHHC
>>598 ASP内で、ストアドを実行させて、
viewから検索結果を返すように呼んでます。
>>600 その場合だと、常にエラーでるとかじゃなくて?
>>603 ストアドからViewをよんでるならストアドのほうを疑ってみたりはしないのか。
索引付きViewのような特殊なのを除くとViewは普通にサブクエリを使ったのと
同じ動作になるからなにか影響が出ることはまず無いよ。
605 :
592 :2005/12/24(土) 22:34:29 ID:rrL+lHHC
>>604 >索引付きViewのような特殊なのを除くと
すんません、これってどういう意味でしょうか…
レコードサイズが8kバイト以上のテーブル作りたいのですが 8kバイト以上のレコードは挿入できませんとかなんとか警告が出ます。 みなさんはこういう場合どうやっていますか? テーブルを2つに分けたり?
>>607 可能な場合は長いVARCHARをTEXT型に変更。それでも入らなければ分割しかないね。
>>607 レコードサイズって事は全カラムの長さの合計が8kB?
へー、それってだめなんだ…。
Analysis Servicees mdxでゴリゴリ書きまくってるヤシいる? ディメンションのメンバにしたくない項目を、mdxの中で値とりたいんだけど・・。 (社員マスタ内の「正社員フラグ」を見たい、みたいな・・) Analysis初心者でスマソ
>>604 は親切ですな。
>>605 ASP内部でコミット打ってないだろ。トランザクションロックしてるんじゃない。
612 :
592 :2005/12/25(日) 22:25:33 ID:0W1WDINt
>>606 ありがd。
>>604 インデックスはつけてないviewでした。
て事は、ストアドの方ですかい?
んー、全部同じような書き方してるんですけど、
ここに問題があるとすれば、いっぱい修正しないといけないって事ですね…。
>>611 コミットはしてたはず…(´・ω・`)
>>609 そうです。create table 自体はOKなんですが実際にその長さ以上の
データをinsertしようとするとエラーになります。
614 :
592 :2005/12/26(月) 10:48:49 ID:???
ストアドは、ストアド実行させる時に渡した引数を元に、
CREATE
PROCEDURE ストアド(@引数)
BEGIN
SET NOCOUNT ON
DECLARE @strSQL varchar(8000)
SET @strSQL = 'SELECT * FROM V_MASTA a'
IF (@引数 <> "")
BEGIN
SET @strSQL = @strSQL + ' AND a.a_id in.....
SET @strSQL = @strSQL + ' AND a.b_id in.....
END
-- 実行
EXEC(@strSQL)
END
GO
てな感じでした。
確かに、IF内で別のテーブルやビューを呼び出していて、
複雑な感じにはなっていますが、
該当するテーブルは呼んでいませんでした。
>>611 素敵なソースサンプル、あったら教えて欲しいですm(__)m
615 :
NAME IS NULL :2005/12/26(月) 12:27:58 ID:9n1dTWNk
>>588 トランザクションを開始して更新されたデータに、
別コネクションから更新かけたら、どうなんの?
カーナビが高性能。 裏道でもなんでも知ってる。実車にも欲しい。
あ(;゜〇゜)
618 :
592 :2005/12/26(月) 13:17:59 ID:1bZPeWsC
何度もごめんなさい。
>>611 テーブルを操作する方のASPでは、ちゃんとコミットしてあって、
ビューを操作する方のASPでは、トランザクションを開始してないので、
コミットもしてませんでした。
もう、何が原因なんだか…orz
>615 コミットを待つんじゃないの?
>>618 ストアドも問題なさそうだな。あとはsp_lockでロックの状況を調べたらどうですか。
>>615 スナップショットREAD COMMITEDで更新を前提としない読み込みの場合は排他ロック中でも読み込めるが
更新を前提にする場合は更新ロックをかける必要があるので結局待たされる。
普通のREAD COMMITEDで更新を前提としない読み込みの場合は排他ロック中は読み込めないが、
更新ロック中なら読み込める。
EXECじゃなくてsp_executesqlを使ってみたら? ひょっとしたらなんかヒントになるメッセージがでているかも。
もしも>592のやつで、 ストアド内で読んでるのがtableだったら、 問題ありなる?
624 :
NAME IS NULL :2005/12/26(月) 18:03:30 ID:9n1dTWNk
>>621 > スナップショットREAD COMMITED
が前提なテーブルに対して、更新を行った場合が知りたいんです。
スナップショットREAD COMMITEDなデータに更新ロックってかけられるの?
>>624 更新可能なものは更新ロックはかけられるよ。
READ COMMITEDというのは、
トランザクション中の更新対象(更新ロック)データについて、
他のプロセスがその対象データをSELECTした場合に
どのような値を読ませるか、の指定のことで、
トランザクション中で対象データをUPDATEしても
コミットするまでは他のプロセスは、
UPDATE前の値を読ませる指定のことだよ。
>>597 >会員テーブルを直接触る行為をすると、
>タイムアウトのエラーが出るのです。
直接触る行為って具体的にはどんな行為?
>>600 のように、トランザクションをかけて、
その中で更新をかけ、そのまま放置するような行為や、
もしくはバッチスクリプトを作成していない?
例えばisqlで実際に検証したけど、
<プロセスA>
1> begin tran
2> update [ユーザ] set 姓='鈴木' where [ユーザID]='00001'
3>go
(1 row affected)
の状態で
<プロセスB>
1> select [ユーザID],姓 from [ユーザ] where [ユーザID] = '00001'
2> go
という検索をかけると、プロセスBは、
プロセスAのトランザクションが完了(commit or rollback)
するまで待ちぼうけだよ。
このようなことで、タイムアウトエラーになっているのでは?
これが、
>>585 の
2005だと、更新する前の姓が「佐藤」なら、
上記の状態のプロセスBで「佐藤」が返ってくる
モードが選べる(Oracleの NO WAIT)ということ。
ちなみに、
<プロセスA>
1> begin tran
2> update [ユーザ] set 姓='鈴木' where [ユーザID]='00001'
の状態なら
<プロセスB>で
1> select [ユーザID],姓 from [ユーザ] where [ユーザID] = '00001'
2> go
は
ユーザID
姓
------------------------------
------------------------------------------------------
00001
佐藤
(1 row affected)
と返ってきて、
さらにその後、<プロセスA>で
3>commit
(1 row affected)
の後、<プロセスB>で
1> select [ユーザID],姓 from [ユーザ] where [ユーザID] = '00001'
2> go
とやると、
ユーザID
姓
------------------------------
------------------------------------------------------
00001
鈴木
と返る
・・・でやっぱりAnalysisを使ってる人はいないワケね・・・orz
628 :
592 :2005/12/27(火) 11:11:18 ID:???
>>620 了解です。
>>626 >直接触る行為って具体的にはどんな行為?
例に出してくれたような感じのupdateをかけたり、です。
>
>>600 のように、トランザクションをかけて、
>その中で更新をかけ、そのまま放置するような行為や、
>もしくはバッチスクリプトを作成していない?
トランザクション開始→更新→コミットしてる事を確認してるので、
放置って事はないはずです。
もし、例に出してくれたものの逆の場合って、
どうなるのでしょうか?
<プロセスB>開始…トランザクションは開始しない、検索実行
↓
<プロセスA>開始…トランザクションは開始する、テーブル更新、コミット
これで、プロセスAに影響が出たりするのでしょうか。
>>623 これ、私も知りたいです。
別のところで、問題のテーブルを検索の対象にしている部分を発見して…。
ただ、読取専用で開いてるので、
問題はないと思ってるのですが。
---
意味不明な部分も多々あるはずなのに、
たくさんの人が、すごく親切に答えてくれるので、
本当に感謝しています。
ありがとうございますm(__)m
>>628 >>例に出してくれたような感じのupdateをかけたり
updateはストアド内の処理で?ASPで?
トランザクションはストアド内?ASP内で制御?
もしくは、クライアントAP?
>トランザクション開始→更新→コミットしてる事を確認してるので、
>放置って事はないはずです。
トランザクションの開始から完了まで、
時間がかかるような(タイムアウト時間以上の)処理をしていない?
トランザクション内でupdate処理した後、
時間のかかる検索処理をしたり、カーソル処理をかけたりした後に
commitさせたり、rollbackさせたりしてない?
>もし、例に出してくれたものの逆の場合って、
>どうなるのでしょうか?
・・・
>これで、プロセスAに影響が出たりするのでしょうか。
全然影響なし。
630 :
592 :2005/12/27(火) 12:00:33 ID:???
>>629 >updateはストアド内の処理で?ASPで?
>トランザクションはストアド内?ASP内で制御?
>もしくは、クライアントAP?
updateは、ストアド内で行っています。
トランザクションはASP内で行っています。
ASPでトランザクション開始
↓
ASPでストアド実行
↓
ストアド内でupdate
↓
ASPでコミット
updateの処理は、最大30個位更新するだけなので、
そんなにたいした処理じゃないのかな…と思ってます。
処理後には、特に処理もしてないです。
あと、もしもupdateが失敗した時には、
エラー処理を行って、ロールバックさせてます。
>全然影響なし。
そうなんですか。
了解しました。
>>630 あとは切り分けだね。
タイムアウトしている状態で、sp_lockを調べて
本当にブロッキングかどうかチェック。
タイムアウトが再現できなく、sp_lockが使えない場合、
ユーザテーブル更新処理のコードを全て洗い出す。
>確かに、IF内で別のテーブルやビューを呼び出していて、
>複雑な感じにはなっていますが、
>該当するテーブルは呼んでいませんでした。
別のテーブルやビューも更新処理を洗い出す。
実は何かの条件で動的に生成された
SQLがとんでもない文だったり、その生成過程で時間がかかったり等かな。
<愚痴> SQL Server 2005入れたけどなんか勝手が違うがな(´・ω・`) </愚痴>
betaの頃にいれたけど、Enterprise Manager相当のものが やたらモサモサと動いていたなあ。 .Net Frameworkなんか使うとああなるのか?
で、誰かT-SQLに.NET構文使ってみた?
635 :
592 :2005/12/28(水) 11:07:07 ID:???
>>631 sp_lock使ってみました。
処理中は、該当のテーブルに共有ロックなるものがかかってましたけど、
タイムアウトのエラーが出た時では、
そのロックも消え、その他のロックもない状態。
と言う事は、ただ単に処理に時間がかかってのエラーって事ですか??
>>634 使ってみた。
正規表現が使えたりユーザー定義型をオブジェクト指向の感覚で作れたりで便利すぎる。
637 :
592 :2005/12/28(水) 13:48:27 ID:???
共有ロックって、他から排他ロックかけられないんですね…。 と言う事は、 共有ロックをかけた状態で長時間処理してる内にタイムアウトエラーになって、 更新しようと排他ロック待ちのやつは待ちつづけ…の デッドロックになってるのかなと思うのですが、 どうでしょうか?
タイムアウトエラーになった時点で共有ロックは外れるんじゃないの
639 :
592 :2005/12/28(水) 15:05:20 ID:???
>>637 共有ロックというのは、他のプロセスは読めるが、更新ができないロックのこと
排他ロックというのは、他のプロセスは読むことも、更新もできないロックのこと
MSSQLでは、排他ロックはコミットされていない状態の更新時、
もしくは明示的にテーブルロックをかけたときにしかできない。
(はず。オレの知識では)
そのタイムアウトエラーが起こる検索処理も
トランザクション処理で(共有)ロックをかけて検索しているの?
641 :
592 :2005/12/28(水) 15:46:17 ID:???
>>640 検索処理はストアドを実行させて行っているのですが、
ASPソース側でも、ストアド内でも、
トランザクションを開始していません。
が、sp_lockで見たところ、
処理中にS(共有ロック)がかかってる事がわかったので…。
て、何か変ですね。
通常ロックはトランザクションを開始しないとかからないものなのですか??
>>641 >sp_lockで見たところ、
>処理中にS(共有ロック)がかかってる事がわかったので…。
ASP(.netじゃないとすると)で検索するときのカーソルタイプとロックタイプは?
643 :
592 :2005/12/28(水) 17:25:35 ID:???
>>642 カーソルは使用してない単一行SELECT文です。
ロックタイプは、共有ロックです。
(ちゃんと答えになっているでしょうか…)
ちなみに、.NETじゃないです。
>>643 検索処理の
recordsetのCursorTypeプロパティとLockTypeだよ
LockTypeをadLockReadOnly
にしたらどう?
645 :
592 :2005/12/28(水) 18:20:09 ID:???
>>644 あっっ(>_<)
カーソルはadOpenStatic、
ロックタイプはadLockReadOnlyでした。
この場合、読取専用でレコードセットすると、
SELECT文にNOLOCK付けても無意味なのですか??
VirtualPC2004を使って Windows2000Server+SQLServer2000の仮想サーバを構築→A Aのイメージファイルを複製しマシン名とIPだけを変えて別の仮想サーバを構築→B AB間で分散トランザクションを使った更新を行う為、 AのSQLServerに接続して以下のクエリー実行します。 begin distributed tran update B.Northwind.dbo.Employees set Lastname = 'A' commit go このクエリーはDTCサービスを停止させるまで戻ってきません。 DTCがAとBを識別できないのか固まってしまうようです。 ちなみにAと全く別に新規インストールした仮想サーバCとの 間ではこのような現象にはなりません。
>>645 Staticカーソルは問い合わせの結果をtempdbにいったんコピーして、その時点で共有ロックは解除される。
コピーのセットを使うのでロックタイプは常にReadOnlyになる。
NOLOCKヒントをつけるとダーティーリードした結果がtempdbに書き出されることになる。
ReadOnlyの問い合わせなら迷わずadOpenForwardOnlyにしとくが吉。
>>646 マシン名を変えたら、ストアドを流して SQL Server 側も変更しないと駄目じゃなかったかな
649 :
NAME IS NULL :2005/12/30(金) 04:49:08 ID:g54YFBWt
2005と2000て共存できるの?
>>647 そうです。B側に以下spを実行してsysserversを修正しました。
これで分散クエリーによる相互参照ができるようになりました。
use master
sp_dropserver A
go
sp_addserver B,local
go
ただこれだけだと分散トランザクションは固まります。
まだ何か足りていないようです。
2005のexpress入れてみたけど、管理ツールらしき 「management studio CTP」ってのが起動してくれない 誰か教えてクレ
652 :
592 :2006/01/04(水) 16:07:16 ID:3e9k/hg1
あけましておめでとうございます。
>>647 NOLOCKはよろしくないのですね…
READ UNCOMMITEDも同じ様なものらしく、ロックのオプションをつける事はやめました。
---
ここまでみなさんに色々教えていただいたのですが、
諸々が動かないのは、
おそらくロックが問題ではなく、データの量が多すぎの為
処理が被ると負荷が大きくなりすぎるためと考える事にしました。
そこで、表示の処理を変えようと思ったのですが、
テーブルのn件目〜m件目までを読み込み表示と言う事は、
ASP(VBScript)+SQLServerでどうやって行っているのでしょうか?
.NETやオラクルであれば色々あるようなのですが…。
ちなみに現在は、ストアドでデータを全件取得し、
ASPソースのループでページ移動ごとにn件目〜m件目とやってます。
>>651 同じ現象になった。
.NET2.0からSQLまで全部入れなおしたら動いた。
今はVSPro,SQLSErverただで手に入れて使ってる。
>>652 無理やりの例。
select top 10 * from #tst A where COND1=1 and not exists
(select * from
(select top 20 * from #tst where COND1=1 order by KEY1) B where A.KEY1=B.KEY1
) order by KEY1
ちなみにこれは21〜30番目が取得できる。
whereが多くなっていくとクエリはやばい事になっていくがな…。
656 :
651 :2006/01/05(木) 12:41:20 ID:??? BE:141600544-
>>653-654 回答ありがとう!]
>If this key does exist, SSMSE probably thinks you have the full SSMS on your machine.
なるほどー
657 :
NAME IS NULL :2006/01/05(木) 16:21:44 ID:t1WkfdLF
サーバーとクライアントのバージョンアップで サーバー :OS windowsNT server → windows2003server SQL SQL SERVER6.5 → SQLSERVER2000 クライアント :OS windows98,NT → windows2000,XP に変更になりましたがクライアントからサーバーにあるEXEを実行したときに SQLSERVERへの接続がwindows2000のクライアントだけ失敗します。 windowsXPのクライアントは接続に成功してPGが実行できます。 サーバーのクライアント権限は全てadministratorで設定しています。 10台のPC中3台ある2000クライアントだけこの現象が出ます。 旧環境では何の問題もありません。 どのような原因が考えられますでしょうか? よろしく御願いします。
659 :
652 :2006/01/06(金) 10:21:34 ID:jVGwiITm
>>655 こんな感じにしてみました。
SELECT TOP 50 * FROM [TBL] WHERE [id] NOT IN
(SELECT TOP 10001 [ID] FROM [TBL])
ただ、検索結果から指定行から指定件数抜き出すとなると、
やっぱりWHEREがとんでもない事に…。
あー。
どうしたらいいんだろう。
これでも、全件取ってきてASPでガリガリよりは
処理が早いのかな…
660 :
NAME IS NULL :2006/01/06(金) 14:04:48 ID:E0qDLfVT
いや、だからね。最初の表示の時だけ、表示するデータのすべての キーを取ってきてだね、ページ変わったら、クライアントでどのキーの データを表示するか求めて、そのキーだけデータベースからとってくればいいの。 キーというのはね、レコードを一意に識別する列ね。
661 :
NAME IS NULL :2006/01/06(金) 14:11:44 ID:E0qDLfVT
って、処理が早いか遅いかは実際にSQLServerに大量にデータ突っ込んで、 、SQL発行してみれば、いいと思うの。
>>660 セッションにキーセットを全部持っとくのか。多ユーザーでデータが多いときはメモリがしんどくないかい。
663 :
NAME IS NULL :2006/01/06(金) 18:42:46 ID:E0qDLfVT
>>662 その通りだし、どの方式を採用した方がいいかは要件次第でしょ。
サーバーのスペックや検索結果の平均レコード数はだいたいとれくらいになるか、平均同時接続数はどれくらいになるのか、
それらの情報がないと、どの方式がベストだか、俺にはなんとも言えない。
すべて、トレードオフなんだから。
だから、ただ、こういう方法をあると言いたかっただけ。
じゃ、一時テーブルとidentity使う方法も候補に。 メモリとかtempdbは食うけど、速いコトは速い。 これもトレードオフ。
>>659 inは結果セットが発生するから重いよ
existsの方が速いらしい
666 :
NAME IS NULL :2006/01/06(金) 23:46:56 ID:E0qDLfVT
664> そうだね、一時テーブルとかもいいよね。俺が言った方法も一時テーブルの方法も 結局は質問主が初めやってた、CursorType=Staticと同じことなんだけどね。 つか、そもそも、何故、初めのやり方でうまくいかないのか気になるんだけど。 ストアドでタイムアウトおきてんのか、検索処理でおきてんのか気になる。 ちゃんと切り分けてないような気がするんだけど、原因を。 665> 俺もそうだね、in使うときはなるべくexists使うようにしてる、更に言うならば、 existsよりも、外部結合使った方が安全だと思う。
667 :
657 :2006/01/07(土) 13:58:00 ID:nVZECw+o
社内で取引先と同じ環境でテストしていたのですが その時は2000でも大丈夫でした。 MDACのバージョンは クライアント:2.6 サーバー:2.8 です。
認証は問題ないの? WINDOWS統合なのかSQL認証なのか、その辺 ワークグループだったのがADにしたとか
認証、接続方法(名前付パイプ、TCP/IP)、名前解決、クライアントライブラリのバージョン、 アンチウィルス(パーソナルファイヤウォール系)などなど、原因はいろいろ考えられる。 ひとつひとつつぶしていくのが王道。
開発案件数 15年ほど前 Oracle>>>>>>>DB2>>Sybase>その他 最近 Oracle>>>>>Postgres>>SQL Server>>>DB2>My SQL>その他
>>670 MyとPosgreはそんなかんじだっけ?俺の周りじゃPosgreよりMyが多いのだが。
ここよりもMySQLスレに書いたほうがかまってもらえると思うよ。
672 :
NAME IS NULL :2006/01/08(日) 21:33:19 ID:bfMMbkwp
初歩的な質問ですがビューを使った場合、ストアドの中でビューを使うのと ビューと同じSELECT文をストアドに入れて使うのとでは処理スピードに違い はあるのでしょうか? それともう1点 掲示板はほとんどがperlで作ってあるようですが、SQL SERVERで掲示板 やブログを作った場合では総合的にどちらがいいのでしょうか? 掲示板の利用基準は1日の書き込みが20件前後として
>>672 おそらく有意な差はないだろう。
1日20件程度、しかも掲示板やら blog なら、SQL Server を使うメリットはないな。
674 :
NAME IS NULL :2006/01/08(日) 21:38:58 ID:N4LkNB8/
>初歩的な質問ですがビューを使った場合、ストアドの中でビューを使うのと >ビューと同じSELECT文をストアドに入れて使うのとでは処理スピードに違い >はあるのでしょうか? これは、そこまで、処理に差がでないと思うので、作りやすい・メンテナンスしやすい 方でいいと思います。 >掲示板はほとんどがperlで作ってあるようですが、SQL SERVERで掲示板 >やブログを作った場合では総合的にどちらがいいのでしょうか? >掲示板の利用基準は1日の書き込みが20件前後として うーん。perlとSQL Serverじゃ、言語とデータベースの比較で、 どっちがいいとはなんともいえません。
675 :
NAME IS NULL :2006/01/08(日) 22:46:39 ID:bfMMbkwp
早速の返事ありがとうございます。 ストアドに関しては今まで気になりながら作っていたので今後は安心して作れそうです。 掲示板の方はperlの言語など知らないので慣れたSQL SERVERで作ろうと思います。 既出と思うけどちょっと頭にある掲示板のイメージを具体化してみたいと思います。 ありがとうございました
677 :
NAME IS NULL :2006/01/10(火) 15:52:34 ID:mKE/QCSN
質問です。 見当違いのこといってるかも知れませんが、 次のような場合でSELECTでなくDELETEする方法を教えてください。 SELECT * FROM hoge1 LEFT OUTER JOIN hoge2 ON hoge1.a = hoge2.a WHERE hoge2.b=0
678 :
677 :2006/01/10(火) 16:22:48 ID:???
ス、スミマセン。。。自己解決しました。 INというのでできるのですね。
>>677 標準SQLではINなどでサブクエリを使うが、MSSQLの拡張構文では下のようにも書ける。
主キーが複合キーの場合は拡張構文を使うと便利。
ほかにもUPDATEにFROM句が書けたりする。
DELETE hoge1 FROM hoge1 LEFT OUTER JOIN hoge2 ON hoge1.a = hoge2.a WHERE hoge2.b=0
680 :
677 :2006/01/10(火) 18:43:58 ID:???
>>679 ありがとうございます!
大変参考になります。
681 :
NAME IS NULL :2006/01/10(火) 21:35:00 ID:pq8f6Pn/
質問です ピューで2つのテーブルを結合し、その結果をストアドでwhereした場合 の処理速度ってどうなんでしょうか? というのも、ビューで2つのテーブルを表示している段階ではキーが存在 していますがストアドでビューを呼び出したときにはキーは無いようなので その分処理速度が落ちるのかなと思った次第です。
>>681 select .. from table1 join table2 on (...) からなるview1 があったとして
select .. from view1 where table2.x = 999 の問い合わせは
select .. from table1 join table2 on (...) where table2.x = 999 に展開されてからプランニングされる。
683 :
681 :2006/01/11(水) 12:57:22 ID:???
イメージしてたのと全然違った方法で処理されていたのですね そういう風に処理されているなら全然心配しなくてもいいですね! ありがとうございました
IUSRに権限与えるとやばいですか?
685 :
NAME IS NULL :2006/01/11(水) 23:27:04 ID:/GC5gfzz
質問させてください。 ドメインのユーザーグループ毎にDBのアクセス権限を変えたいです。 Windowsのファイルやフォルダのアクセス権はユーザーをグローバルグループに入れて ローカルグループにグローバルグループを入れて、ローカルグループに アクセス権を与えるというのが推奨されてると思います。 DBの場合はさらにSQLのグループにローカルグループを入れるべきか、 まぁそこまでやらなくてもローカルグループに直接権限を与えてもいいのか。 そのあたりの指針みたいなもんってないですか?
テーブル内のYYYY/MM/DD形式で入っているカラムのデータを、 実行日の年月で動的に取り出したいと考えています select * from xxx where substring(s_date,1,7) = '2006/01' ※s_dateは、'YYYY/MM/DD'形式でvarchar(10)です こんな事をやりたいのですが、月の'01'〜'09'がうまく取れません SQL内で、gatedate()、year()、month、str()の関数を使って以下のように 書いているのですが、 select * from xxx where substring(sdate,1,7) = STR(year(getdate()),4) + '/'+ STR(month(getdate()),2) STR(month(getdate()),2) この部分が、1月〜9月の場合には数値の前にスペースが入って' 1'〜' 9'となってしまいます。 うまくスペースを0に変換したいのですが、C言語のsprintfみたいな関数は ないでしょうか?
687 :
686 :2006/01/12(木) 20:22:38 ID:???
>>686 即事故レス
文字列ではなく、datetime型に揃えてみました。
一応SQLサーバ側でうまく変換しれくれることは確認しましたが、遅そう…
select * from xxx
where
convert(datetime,(substring(s_date,1,7)+'/01')) = convert(datetime,STR(year(getdate()),4) + '/'+ STR(month(getdate()),2)+'/01')
こんな方法もあるということで。 convert(char(7), getdate(), 111)
690 :
686 :2006/01/13(金) 10:31:33 ID:???
>>688 ,689
アドバイスありがとうございます。
条件にbetweeenは思いつきませんでした。ヒットするレコードが6億件中の1億件程度と
ちょっと大きいので、substring()で年月を比較する方法とどっちが効率的か、
計測してみたいと思います。
>>689 ムダにdatetime型に変換しなくとも、月を2ケタで取りたい時はこれで一撃ですね。
ありがとうございます(__)
SQLは半ばやらされでイヤイヤでしたが、おもしろくなってきました。
ありがとうございました。
>>690 >ヒットするレコードが6億件中の1億件程度
月単位とか出テーブルを分けた方がよさそうな予感もする。
>>690 一般論としては検索フィールドに関数を使うのは避けたほうがいい。
その日付フィールドに索引があるなら範囲で問い合わせないと索引を使ってくれない。
ただヒットが全体の1/6なら全件総なめでもさほど差はないかもしれない。
693 :
686 :2006/01/13(金) 18:30:13 ID:???
>>691 月単位でテーブル分割も考えたのですが、アプリの改修もあるため
なかなか手が出せませんでした。
月で分割する前に6億件が7種類の業務データに分けられるのですが、
1つだけ、カーディナリティーが突出しているものがあり(8割以上占めている)、
これを別DBに分けることにしています。
加えて、ほとんどアクセスのない前月以前のレコードはこれまた別DB(ヒストリ)に
逃がします。
そのため、いままで6ヶ月分6億件あったレコードのうち、5億件がほとんど
アクセスされないヒストリに、主対象の1億件も8,000万件と2,000万件に分かれます。
これで、大幅に軽くなるのではないかと予想しています。
>>692 >一般論としては検索フィールドに関数を使うのは避けたほうがいい。
過去レスでカキコを見つけました。詳しくはこれから調べてみます。
索引は下のレスで。
>>688 データを引き抜こうとしたテーブルはクラスタ化インデックスがあるのですが、
(もちろん、日付フィールドも対象です)
substring()とbetweenの両方の実行計画を確認したところ、
Clustered Index ScanがClustered Index Seekとなり、速くなることが
わかりました。
実際にはどのくらい速くなるのかは、商用機にさわれる時にチェックしてみます。
皆様どうもありがとうございます。
694 :
NAME IS NULL :2006/01/14(土) 17:42:35 ID:oOx/pn3s
SQL Server2000です。 Datetime型のフィールドを更新したのですが、うまくいきません。 2005年1月14日をいれるにはどうすればよろしいでしょうか? Update r_event Set ew_date = 2005-01-14
それでは2005マイナス1マイナス14がセットされる。 日付の表現方法を学んでください。
697 :
NAME IS NULL :2006/01/14(土) 18:31:46 ID:oOx/pn3s
質問。 management Studioを使って、SQL Server 認証のためのログインアカウントを作成すると、 勝手にパスワードが書き換えられるのはなぜ?
>>699 書き換えられる、と思った理由は?
内部で保存されてるパスワードが読める訳は無いよね。
「そのアカウントでログイン出来ない」とかだったら
ログイン自体が不許可になっている、という可能性があるのでは。
>>694 もう気づいてると思うが今2006年な。
SQL Server2005のバックアップで教えて下さい。
>>260 のAの様にサービスを止めてから、.mdfと.ldfファイルをコピーするだけで
バックアップ可能なのでしょうか。
それとも仕様がかわり、Enterprise Managerからしかできないのでしょうか。
>>610 遅レスだけど、無理じゃね?
ディメンションのメンバに存在するからこそMDXで操作できるんだと思うけど。
>>702 2005もmdfとldfのコピーでバックアップできるよ。
706 :
702 :2006/01/18(水) 13:46:19 ID:???
>>704 ,705
本当にありがとうごさいました。助かりました。
このスレでは無理ですが、私もあなた方の様に回答のわかるものは
気持ちよく書こうと思います。
Express Managerの英語版でも、日本語扱うのに問題はないですか? もちろんフィールド名などに日本語を使うわけじゃなく、データとして日本語を扱う場合です。 MSのダウンロードセンターを検索しても日本語版は見つからないんですが、まだ日本語版は 出てませんよね。
>>708 情報thx、ぼちぼちインストールしてみます
データベース名を列挙するにはどうしたらいいですか?
sp_databases
できた! そのストアドを探してみたのに見つけられずにいた漏れって・・・orz
713 :
RDB初心者 :2006/01/20(金) 09:21:05 ID:5hUPH1fH
テーブルを全件更新する場合って カーソルで回すのとアップデート どっちが速い?
SELECT 命令で、全レコード中 x件目からy件のデータを取得、 のような SQL はどのように書けばよいでしょうか? MySQL には limit 構文で書けるのですが MSSQL はどのように 書けばいいのかわからなくて…。 よろしくお願いします。
>>715 最初からn件なら SELECT TOP n ...
m件目からはないのでプログラムで読み飛ばすか、自己結合やnot existsでTPOに合わせて要工夫。
ありがちな質問だから過去スレを見れば出てくると思う。
>716 過去スレどころか、このスレにあるから、順番に読んでってくださいw FAQ級だな、これ
別のスレから誘導されたのですが、 今年になってから、データベース(SQL鯖2000)を触り始めたのですが、 1 クエリとビュー 2 ユーザ定義関数とストアド の違いって何でしょう? 特にUDFとストアドのl使い分けがよく分からないので 教えてください。
>>718 クエリはSELECT文による問い合わせ一般。
VIEWはSELECT文による問い合わせをマクロ化した仮想的なテーブル。
MS-ACCESSではVIEWをクエリと呼んだりしているので要注意。
UDFはストアドファンクションと呼んだりするからストアドプロシージャと基本的な構造は同じであるが、
戻り値がある。普通はselect文と組み合わせて使う。
select ユーザー関数(a), b, c from xxx
このためUDFの中でデータを更新することは禁止されていたと思う。
720 :
NAME IS NULL :2006/01/24(火) 23:45:36 ID:fC/+3Ayi
>>719 レスThx
今は、テーブル構成などを把握する意味もかねて、
ユーザ向けのadpやらmdbを、いじってるから違いがよく分からなかったのよ。
あとUDFは、ローカルなtable変数には、更新追加削除OKみたいだが
現時点ではよく分からないや;;
クエリ: DBアクセスを行うための問い合わせ言語。 ビュー: Selectクエリによって定義される仮想テーブル。 定義によってはビューに対してのinsertやupdateも可能。 引数は無い。 俺は正規形を崩したりするのに使う事が多いかな。 ストアド: 一連のクエリによる処理を前もって登録しておくもの。 クエリのコンパイルのコストが減らせる。 結果セットを返すようにすればビューに近いものになるし、 また複数のINSERTやUPDATEをストアドにまとめてしまえば トランザクションを意識しなくてすむ。 引数がある。 俺は主に後者の利点を生かし、更新系で使う。 結果セットを返すためのストアドはユーザ定義関数に取って代わる。 ユーザ定義関数: スカラ値を返すものと、テーブルを返すものの二つに分けられる。 スカラ値を返すユーザ定義関数は、普通のクエリ内の関数と同様。 IDを引数で渡すと該当する人の氏名を返す、というような関数を定義したり出来る。 テーブル値を返すユーザ定義関数は、ビューや結果セットを返すストアトに似ているが 複数のクエリ文を使えたり、引数を取れるという点でビューとは違い、 またFromに書いてサブクエリとして使えるという点でストアドとは異なる。 ビューも安直で利点はあるが、 引数を渡す事で必要となる結果セットを抽出しやすくなる場合は非常に有用。
SQL Server の、データファイル *.mdf の存在する場所ですが、 レジストリに HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Setup\SQLDataRoot とあり、ここに入っている値 + Data でいいのかな、と思うのですが、 この Data のディレクトリが環境によって変わる事はありますか? *.mdf の存在パスは上記 SQLDataRoot + "Data" で 100% OK でしょうか?
>>722 デフォルトで作られるところはそうだけど指定すればどこにでも作れる。
>722 何をしたいが分からんが、つ[sysdatabases] そもそも、mdfファイルやldfファイルの配置なんて、データベース作成時に 何処にでも配置できるから。
テーブルサイズの見積り方法って、WEBで公開されてますか?
>725
計算の方法は一応あるのだが最後はvarcharなどの可変長フィールドの平均利用率を どうするかで数字がごろごろ変わってきて、最後のほうはドンと倍さらに倍といった 見積もりになってしまうな。 だいたい見積もり段階で使ったテーブル設計図どおりで本番を迎えることはまずないし。
729 :
NAME IS NULL :2006/01/27(金) 13:45:07 ID:pHI3C2gZ
T-SQLでIF文のネストに限界はありますか? END付近に正しくない構文がありますというエラーになってしまいます。 WHILE @@FETCH_STATUS = 0 BEGIN WHILE @a <= @b BEGIN IF @c = 2 BEGIN IF @d = 0 BEGIN WHILE @@FETCH_STATUS = 0 BEGIN IF @e = 0 BEGIN IF @f > 0 BEGIN IF @g > 0 BEGIN IF @h > 0 BEGIN IF @i = 1 BEGIN PRINT 'test1' END //ここはネストしていない IF @j = 1 BEGIN PRINT 'test2' END <-----ここでエラーになっている
すいません自己レスです。 IF @j = 1 BEGIN PRINT 'test2' END の部分で)を付け忘れてる部分がありました。
732 :
NAME IS NULL :2006/01/27(金) 16:47:26 ID:aoQ1VSnV
mdfファイルやldfファイルの配置場所はどこで確認出来ますか?
sp_helpdb
>>715 きたないT-SQLで悪いんだけど、ヒントになるかね?
昔PASSJかどっかのBBSに載ってたコードを漏れが改悪。
[@一度に取り出す行数] と [@現在の頁番号] の値を変更すると動いたりする。
USE pubs
DECLARE @全行数 INTEGER
DECLARE @一度に取り出す行数 INTEGER
DECLARE @現在の頁番号 INTEGER
DECLARE @副問合用の件数 INTEGER
DECLARE @SQL文 NVARCHAR(150)
SET @一度に取り出す行数 = 5
SET @現在の頁番号 = 0
SELECT @全行数 = COUNT(title_id) FROM titles
SET @副問合用の件数 = @全行数 - @現在の頁番号 * @一度に取り出す行数
SET @SQL文 = N'SELECT TOP ' + CAST(@一度に取り出す行数 AS NVARCHAR(2))
+ N' * FROM ( SELECT TOP ' + CAST(@副問合用の件数 AS NVARCHAR(2))
+ N' * FROM titles ORDER BY title_id DESC ) tmp ORDER BY tmp.title_id'
EXECUTE (@SQL文)
735 :
NAME IS NULL :2006/01/28(土) 14:58:23 ID:mU+IUxfv
>>715 M番目までの集合からN-1番目までの集合を引く
ORACLESQLパズルにMSでも動くSQLがあるだろ
すみません T-SQLで動的SQLとカーソルを一緒に使用することって可能でしょうか? 具体的にはストアドの引数としてテーブル名を取得し、そのテーブルからデータを取り出して 1行ずつ処理していきたいのですが DECLARE cur_Cursor CURSOR FOR SELECT hoge FROM @vcTable という風にテーブル名に変数を使用すると、クエリアナライザで「@vcTableを宣言してください」 といったようなエラーが出てしまいまして。 すみませんがご存知の方いらっしゃいましたらよろしくお願いします。
テーブル名に範囲があるなら、ソースが長くなってもケース分けした方が高パフォーマンス カーソル処理は統一だから、似たようなスキーマっぽいし、コピペの力技で作れるのではないかと思ってみたり。 動的でもできないことはないんじゃないかと。わかんないけど。とりあえず、 @vcTableでエラーが出るのは動的になってないからじゃない? Declare 〜 FROMは文字列になるだろうからその最後は + @vcTable でくつけなければいけないんじゃないかなー。
>>736 カーソル処理を動的に書くより、同名のViewにはじめにマップさせてしまうのはダメですかね?
突発的に思いついたんだけど。動的に書く部分はCreateViewと、DropViewで。
もし、やってできたら教えて欲しいです。
すいません、XMLファイルをテーブルに格納したいのですが、 なかなかサンプルが見つかりません。 (XML型はSQL Server Management Studio上では読み取り専用列になっています。) クライアントはVB.NETでDOMに移して処理するつもりですが 保存と読み込みの部分が不明な状態です。 情報等ご存知の方がいれば教えてもらえないでしょうか。
>>739 SQL2005ならBOOKS Onlineに載ってる。
Expressには付いてこないがMSからBOOKS Online日本語版をダウンロードできる。
要素の切り出しをDOMでやるなら文字列の読み書きとまったく同じだけどな。
特定の要素や属性で検索や読み出しをするならXQuery式が必要になる。
すれ違いかもしれませんが、見つからないので、とりあえずここで質問させていただきます。 適切なスレがありましたら、誘導をお願いします。 ストアドで、直接テキスト出力はどのようにやればいいのでしょうか? PL/SQL(Oracle)で「UTL_FILE」を利用して行うような形で、何かありますか? ※ SQL Server 2000 です
742 :
739 :2006/01/31(火) 13:55:26 ID:???
>>740 早速ありがとうございました。カンファレンスかなんかでもらったβ版だったので
BOOKSOnlineからダウンロードしてみます。
>要素の切り出しをDOMでやるなら文字列の読み書きとまったく同じだけどな。
今から調べますが、ということはXMLというより普通に[varchar](max)型のカラムに
文字列を入れるだけということでしょうか。
とりあえずXmlDocument.LoadXmlで読んでみたいと思います。
XMLが初めてだったのでてっきり新しくできたXML型のカラムに文書を保存するもの
と思ってしまいました。操作自体はクライアントのVBでツリービューで行うので問題
ないと思います。
743 :
NAME IS NULL :2006/01/31(火) 20:39:17 ID:+IwFG76F
SQL2Kでディスク分散するときの質問です。 ディスクが2枚または4枚のとき「ユーザデータ」「インデックス」「トランログ」「tempdb」は どのように分散させるべきですか? また、ディスクをパーティションで区切った場合と区切らない場合で効果は変わりますか?
>>741 bcp
>>743 ユーザーデータとインデックスはよくわからんが、ログは別ディスク、tempdb
はメモリ上に置け。
パーティションに区切るだけじゃほとんど意味なし。外周上に配置される方は、
多少早くなるかもしれんけど。
>>744 tempdbをメモリに乗せられるんですか?勉強になりました。
ただそのときメモリに障害が発生したらDBが止まりませんか?
そうなると多分却下されそうです…。
>>745 ごめんごめん。2000 では、tempdb in RAM オプションないみたい。古いバージョンでは
よく使った手法なんだけどね。
「ユーザデータ」と「インデックス」は別ディスクの置くと効果があった。Oracle7での経験だけど。
748 :
741 :2006/01/31(火) 21:36:46 ID:???
>>744 レス、ありがとうございます。
が、
ストアド内で、カーソルをループさせ、
1レコードずつ条件分岐や項目編集を行って
1レコードずつ出力したかったんです。
(ワークテーブルは作りたくないので)
でもって、一応、自己解決しました。
SP_OA系のコマンド使ってできたっぽいです。
が、とりあえずテキスト出力はできたけど、合ってんのかなぁ…
>>748 sp_OA 系はどうしようもないときだけにしといた方がいいよ。つか、何でワークテーブル
嫌なんさ? # つけて一時テーブルにしちゃえばいいじゃん。
750 :
736 :2006/02/01(水) 00:10:32 ID:???
レスありがとうございます
>>737 さんの言うとおり、DECLARE 〜 FROM までを文字列にして、 + @vcTableで
テーブル名を連結させたらうまくいきました 具体的には下のような感じです。
EXECUTE (' DECLARE Cs_Type1 CURSOR '
+ ' FOR '
+ ' SELECT '
+ ' わはー '
+ ' FROM '
+ @vcTable)
--Cursorオープン
OPEN Cs_Type1
FETCH NEXT FROM Cs_Type1 INTO 〜
>>738 さんの教えてくださった方法は、まだ試せてないです(自分の能力不足のため)
申し訳ない。
機会があったら試してみます。
ありがとうございました。
>>743 4枚だったら「ユーザデータ」「インデックス」「トランログ」「tempdb」をそれぞれに分散させるべき。
2枚だったら「ユーザデータ」で1枚、「インデックス」「トランログ」「tempdb」でもう1枚かな。
本当は「トランログ」と「tempdb」は分けたほうが良いけど。
>>751 MSSQLの場合、索引とデータの分離をとるかクラスタードインデックスをとるか悩むことがあります。
まず安全性のことを考えると最低でもトランザクションログだけは別の物理ディスクにするべきでしょうね。
この間メーカーがディスク全部をひとつのRAIDディスクにしてその中をパーティションに分けて帰りやがった・・・(泣
SQL2005でsnapshot分離を使うと、tempdbをoracleでいうところのrollback(redo) segment代わりに
するようなので今後はここも熱くなりそうです。
ちょっと修正 redo -> undo
754 :
NAME IS NULL :2006/02/01(水) 17:29:32 ID:KIHlpnN3
select XXX FROM tbl1 と取得する時に、 他にテーブルを作って参照させることはさせず、 XXXの値が1だったらA XXXの値が1だったらB とSELECTで取得したいのですが、ORACLEのDECOD関数のような、 条件で値を切り替える方法は、 どうすればいいでしょうか? IF関数を調べましたが、ダメでした
CASE
756 :
NAME IS NULL :2006/02/01(水) 17:57:38 ID:KIHlpnN3
オラクルで @ファイルパス でファイルの中のSQLを実行する。というような事ができたと思うんですが、 SQLServerで同じような事ができますか?
>>757 コマンドラインで指定するなら -i <filename>
対話モードではisql と osql にはなかったと思う。sqlcmdは :r <filename>。
ACCESS(2003)からSQLserverへの移行で、アップサイジングウィザードではアップサイジングできないんですか? また何が問題になるのでしょうか? 経験された方教えて下さい。
結局オラクルと違ってディスクIOの分散まで必要な 大規模システム組んでる奴はここにはいないのか…。
761 :
NAME IS NULL :2006/02/01(水) 22:21:43 ID:UyW/wIxu
別スレから来ました。 asp.netとSQL_serverを使っています。 Select文でちょっとお聞きします。 テーブルに「あいう」「かきく」「たちつ」「なにぬ」というデータがあり、Likeを使い 「き」と「なに」を取り出したいのです。 Yahooなどの検索をテーブル内でしたいのですが、うまくいきません SELECT hoge AS [@item] FROM hage WHERE (oge LIKE @name) というストアドで、「@name」の部分はどんな書式にすればいいのでしょうか? 「@name」を「'%き%') AND (oge LIKE '%なに%'」と書き換えればデータは取れるのですが ASP側で検索する際には「あ」だけかもしれないし、「い」「つ」「き」の3種類になるかもし れないので、@nameにぶち込む書式を教えてください。 文盲スマソ
>761 最大いくつか決まってる? 例えば、最大5個って決まってんなら、 SELECT * FROM hoge h WHERE EXISTS (SELECT * FROM (SELECT ? HOGE UNION SELECT ? HOGE UNION SELECT ? HOGE UNION SELECT ? HOGE UNION SELECT ? HOGE) HOGE_TBL WHERE h.oge LIKE '%'+HOGE+'%') ってSQL作ってやってあとはADO.NETで値を放り込んでやればよい。
>>760 エンタープライズ系のネタを2ちゃんで拾おうってのが間違いじゃ?
>>761 動的クエリーを使ってね。
764 :
NAME IS NULL :2006/02/02(木) 00:27:42 ID:l446bGbp
学校の授業で「100万件データがあるテーブルにアクセスして、 クエリなげるプログラム作って、レスポンスタイムを短くするように チューニングしろ」って課題がでたんだが、普通はどれくらいの時間 かかるんかな? ADO.NETでSQL Server2000に接続します。テーブルの列は2,3列くらい。
どんなクエリかによる。 インデックスつかって、1レコード特定するようなものならほぼ一瞬じゃない?
766 :
764 :2006/02/02(木) 01:44:52 ID:l446bGbp
>>765 そのクエリの内容を今考えていまつ。
ただどんなクエリを投げれば良いパフォーマンスが得られるのかが
よくわからず(今必死で情報集めようとしているが)
クエリの内容とインデックスくらいかな。パフォーマンスに関係あるのは。
>>766 ほれ。
SELECT TOP 1 FIELD1 FROM TABLE1
ディスク分散はパーティションテーブルとか業務的な理由もあるからそう単純じゃないよね
>>768 HDD障害の対処、バックアップとの兼ね合いとかもあるし。4枚しかディスクがなくて、
それぞれ分散、なんてHDD障害のことを考えたらありえないでしょ。
>>769 大元の質問が負荷分散の効果を聞いているのに
その回答はあげ足を取っているだけでは?
バックアップ&ディスク障害のリカバリはセカンダリの役目だろ?
772 :
NAME IS NULL :2006/02/02(木) 14:47:06 ID:JUKIKgIw
あのー 31日の夜あたりからなんですが、SQLのログにLoginFailのイベントがやたら記録されているんです。 sa, admin, rootといったアカウント名でログインを試みてる奴なんですがなんかこういうウィルスとかありましたっけ?
すまん、俺だ
>>761 パラメータの数にあわせて動的にSQLを作るか、パラメータの数だけ複数ストアドを準備する。
where oge LINK '%き%' or oge LIKE '%なに%'
フルテキスト索引をつかうならそのまま指定可能。
where FREETEXT(oge, 'き なに')
ただしフルテキスト索引の特性をよく顧客に説明しておかないと、
LIKEを使ったときと結果が違うバグだバグだと大騒ぎされるので要注意。
>>772 確かあったよね。SQL2000のSP3か4で対処したやつ。saパスなしだと一発でやられる。
Slammerだっけ?
>>771 質問主でもないし、その辺詳しくないから答えられないけど
お前みたいな人の粗捜ししかしないで、書いていない事まで妄想して
文句だけはしたり顔で言うくせに情報は出さない奴が嫌いなので
ディスクがすべてRAID01で検索メインのDBの場合でお前の回答を聞かせてもらおうか。
777 :
761 :2006/02/02(木) 22:39:25 ID:???
>>762 、
>>763 レスありがとうございました。
今日1日初耳の動的クエリや
>>762 を弄っていましたが私のスキルでは
今日中には出来ませんでした。
もう少し勉強してきます。
>>774 今レス見たのでまだですが、早速明日試して見たいと思います。
特性というのは攻撃に対する脆弱性があり感じですので、一度その辺りも
調べて見たいと思います。
またお世話になるかもしれませんが、ありがとうございました
spt_server_infoテーブルのCOLLATION_SEQの値は インストール時のCOLLATIONの指定によると思いますが、 インストール後にこれを変更することは可能でしょうか? もちろん直接テーブルを更新すれば変わることは変わりますが、 そんなことをしてよいのかどうかが分からず・・・
779 :
MAME IS NULL :2006/02/05(日) 20:36:46 ID:q9bTn3UE
ところで2005はいいのか?
なんか色々微妙
781 :
NAME IS NULL :2006/02/06(月) 01:37:20 ID:L/b68Q3o
>>775 スラマーはport1434の脆弱性をつく奴だろ
そのちょっと後に出てきた奴だと思うが俺も名前が出てこない
MSSQL2kですが、行レベルロックとか明示的に指定できないのですか? MSのサイト見ても、なんだか曖昧な説明でモヤモヤ。
784 :
782 :2006/02/07(火) 16:58:14 ID:???
>>783 ありがとう。withでやれば良いのですね。
行レベルロック等の方言?の違いなどもあり、
なかなか検索で巧く引っかかってませんでした。
ロックの単位なんかはクエリオプティマイザに任せた方がいいと思うけどなあ
786 :
NAME IS NULL :2006/02/08(水) 03:45:07 ID:pPuRpQKx
PHPのmssql関数って、SQL Server 2005利用できるのかな?
>>785 カーソルでしかselect for update の構文が使えないから
with (updlock) と with (holdlock) は使ってる。
粒度ヒントなどはシステム任せでまず使わないね。
>>782 がいってる行ロックうんぬんもselect for updateの書き方が
わからないといったレベルの話じゃないかな。
789 :
782 :2006/02/08(水) 11:03:43 ID:???
ご推察通りです。
>>787 Access2000(DAO)+SQL2kにて、行レベルロックと、IsolationLevelの SERIALIZABLE を
有効にしようと躍起になっているのですが、未だにうまく行きません。
オブジェクトがサポートしていないというメッセージが表示されて凹む訳ですが、
どうにかならないですかね…。orz
>>789 ADOじゃなくてDAOですかい。リンクテーブルやOdbcDirectを使ってるわけですか?
785じゃないですが、明示的に行ロックを使うのってどういう場面があるのでしょうか。
>>791 ロックのエスカレーションを抑制したいとき。
通常は行レベルで、エスカレーションが発生するのは1命令の1テーブルに対する
行ロックが5000を超えた場合とSQLサーバー全体でメモリが圧迫した場合なので、
あえてデフォルトを代えて抑制する必要はない。
TABLOCKやPAGLOCKを指定することはあってもROWLOCKを使うことはないな。
TABLOCKかあ。 タイムアウトやデッドロックが多発するというシステムの保守を押し付けられて 中を見てみたらデータ追加の部分が 「アプリケーションロジック内で主キー最大値を取得し、 1を足したものを主キーとして新しいレコードをINSERT」となっていて… 「同時追加時に主キーがかぶってエラーになるのでロックをかける」 というコメントとともに片っ端からTABLOCKXが追加されていた…orz というガックリな経験を思い出しちまったよ。
>>793 IDENTITYを使えといいたいところですが、ID+1でやるならこんな感じでしょうか。
begin transaction
declare @nextid integer
select @nextid = max(id)+1 from tableA with (holdlock, updlock)
insert into tableA .. values (@nextid, ...
commit work
もっと簡単な方法もありそうですが正しいかどうかはわかりません。
つまり1命令中のアトミック性は維持されるかどうか何ですけど、どうなんでしょう?
insert into tableA (id, ... ) select max(id)+1, ?, ?, ?, ? from tableA
ACCESS 2002 の 2005 対応パッチでないんだろうな つかえねえ
796 :
MSDE :2006/02/09(木) 23:56:28 ID:vOTBqaGk
学校現場で働いている者ですが、教育センターで開発された成績等を管理するシステムを導入しようとしています。 学校のファイルサーバにMSDEを稼動させて本システムのサーバ機能をインストールに成功しました。 次に 各先生方のノートパソコン20台ほどに本システムのクライアント機能をインストールしたら、無事にサーバへアクセスして、本システムが活用できるところまで来ました しかし、あるXPHomeEdition一台だけクライアント機能をインストールするときに、 DB接続失敗 MSDEが稼動していない とメッセージが出てインストールできません
(´・∀・`)ヘー
>>796 XP SP2のFireWallもどきが通信止めてたりして
799 :
MSDE :2006/02/10(金) 07:15:06 ID:0u8eiuOM
XP SP2 ではなかったです。 まだアップデートしていないようです 機種はLavieのLL550/3です ファイルサーバへのpingは通るし、共有フォルダにも問題なくアクセスできているので、やっぱり原因はクライアント側にインストールできない何かがあると考えていますが、何かまたわかりましたら、教えてください
>>799 なんだその態度?なんか調査しろって言ってんのか?
>>800 >>799 は別に期限切って回答迫ってるわけでもないし
気が付いたことがあったらアドバイスよろって言ってるだけじゃん
普通に言葉のキャッチボールもできないのかよ…
クライアントネットワークユーティリティのAliasタブに変なものがあるとか?
教育センターに頭下げて教えを請え。アホ。
804 :
NAME IS NULL :2006/02/10(金) 12:17:58 ID:pV3dJIe/
>>796 >DB接続失敗
>MSDEが稼動していない
もうちょっと正しく書いてみろ。
クライアントプログラムの出してるメッセージだしょ。
>>801 アホすぎるし必死すぎる・・・
相当痛いコだな。
809 :
NAME IS NULL :2006/02/11(土) 10:43:25 ID:FfMUfefw
質問です。 asp.net+Sqlserver2000でWEBサイトを作ろうとしています。 Sqlserverは高額なので開発はDeveloperで行い 開設の際には対応したレンタル鯖を借りようと思います。 これだけでWEBサイトは開設できますか? 何から何まで初めてなので、なんか間違ったこと言ってたら 指摘お願いします。
>>809 基本的には問題ないけど、asp.net対応SQLレンタルさば高いよ
Sqlserverが高いといっているような、クライアントでは維持できないんじゃない?
813 :
811 :2006/02/11(土) 13:51:16 ID:???
>>812 普通だと思うよ。それかMSDNかパートナー用のパッケージ使うでしょう。
ただなんとなく、
>>809 はSQLサーバー+ASP.NETのレンタル鯖が月額1000円もしないと思ってるような感じがしたので
あとリンク先の業者は、SQL鯖は自由にいじり倒せないやつだし、容量を増やせば金額もかかる。月額525円ではcalの代金にもならない。
開発環境をそのまま運用できるようにするには、それなりのサーバー借りないとだめだね
>813 CALに関しては、プロセッサライセンスが1CPU辺り60〜70万円なので、 償却期間を3年とすれば、1CPUのサーバーだと月2万円弱の費用ですね。 レンタル業者の提供する環境に合わせればOKかとは思うが、借りれる サーバーの能力が未知数なのが怖いな。 障害対策の水準とかも考える必要があるな。 インターネットで公開すると言うことは、セキュリティ対策を考えて アプリケーションの仕様を決め、コーディングも注意が必要な訳だが。 何もかも初めてだと、かなり荷が重いのではないかと思う。
815 :
809 :2006/02/11(土) 16:51:04 ID:FfMUfefw
みなさまありがとうございます。
鯖については
>>812 様のリンク先にあるcervi.jpにしようかと考えていたのですが
>SQL鯖は自由にいじり倒せないやつだし
という意見を考えると悩んでしまいます。
ですがデータベースとwebに関してはド素人なので最初はそれでいいかなと。
サイトが軌道に乗って、容量もキツくなってきたら考えますが。
セキュリティ対策は要勉強ですね。がんがります。
誰か、Windows Installer 3.1をアップロードしてください。
test hearts;
CLR ストアドなかなか使えるね。
配列データをストアドに渡して、処理させるのに便利。 その気になればDataTableやDataSetも渡せるので、サーバとのラウンドトリップの やり取りが減らせる。 ただデータサイズが大きくなるので注意が必要だが。
CLR ストアドってどうやってコード・配置・テストしてる? 俺はストアドはテキストエディタ、osql、Accessでやってたけど。 VisualStudioでも使ってるの?
CLRストアドってVSのPro以上じゃないと開発できないの? これの為だけにProにするのはなぁ...
SQL Server 2005ってADOからでもアクセスできるのかな? Active Server Pagesから繋ぐ必要が出てくるかもしれないんだけど、 ASP.NETでの利用方法しか聞いたことないから・・・
>>825 d。
とりあえずダウンロードしてみるよ。
827 :
254 :2006/02/14(火) 14:29:42 ID:NeHMpNgS
質問です。 Windows 2003 ServerでSQL Server 2000を動かしているのですが、 ODBCで接続することが出来ません。 Windows ファイアウォールを無効にして、 Enterprise Managerでは接続できるようになりました。 なんとかODBCでもつなぎたいのですが、 どの辺に問題があるのでしょうか? お願いします。
なにを、どうして、どうなったから、接続に問題があると言っている?
>>827 Windows Server 2003 から ODBCで接続出来ないの?
それとも例えば Windows 95 や 98 から接続出来ないの?
後者なら MDAC のバージョンが原因だと思う。
2005のディベロッパーエディションを買ってきた。 x86,x64,IA64毎に2枚ずつあるCDROMの文字が激しく読みにくい。 使わないから関係ないがな。
俺にはわからないよ お前がなぜ
>>827 回答:SQL Server 2000はWindows 2000 Serverで使え
834 :
833 :2006/02/15(水) 00:52:31 ID:???
使ってくださいの間違いでした。
>>827 サーバ側にODBCの設定をしていないというオチを予想
MS SQLはそんなのいるのか・・・
いらないよ
838 :
NAME IS NULL :2006/02/16(木) 16:38:28 ID:03omxfBV
主語をかけろ
U2
かけりません
841 :
NAME IS NULL :2006/02/16(木) 22:47:04 ID:2m4d7TVX
842 :
NAME IS NULL :2006/02/17(金) 23:07:02 ID:xNsmpwUw
2台のサーバ A, B に MSDE2000 を入れて、 Access2003 ランタイム版をバンドリングした ADP ファイルで接続するようなシステムを作ろうと考えています。 データ件数はマスタが30k件、50 のクライアントから一時間あたり30回程度の SELECT と UPDATE、 その子テーブル(対応履歴)への 30回程度の INSERT が発生する見積もりです。 現地に詳しい管理者を置けないため、サーバ障害時になるべく手間をかけずにもう一台を 使って業務を再開できるようにしたいのです。具体的には障害発生から30分程度で業務再開、 手戻りも障害発生から30分以内を目標にしています。 SQL Srv. が使えれば即時更新トランザクションレプリケーションを使うことで ADP の接続先 変更だけで簡単に実現できそうなのですが、予算の都合で無料で使える MSDE2000 しか 使えません。 スナップショットは高コスト且つレプリケート中はロックがかかるそうなので30分間隔で走らせる のは怖いし、マージは競合の解決が必要とのことなので避けています。 そこで、以下のようにすればよさげだと考えているのですが、甘いでしょうか。 1)サーバA で毎晩フル, 日中は 10-30分に一度差分バックアップを サーバB の共有フォルダに取得 (差分バックアップの容量/取得時間次第で、DIFF->LOG->LOG なども検討する) 2)サーバB は、サーバAのフルバックアップ取得後にそれを norecovery でリストアする。 3)サーバA に障害が発生したら、現地の管理者にサーバAのトランザクションログを取得する バッチファイルを実行させる。 4)サーバB に最新の差分バックアップを適用するバッチファイルを実行させる。 5)サーバB にトランザクションログを適用して recovery するバッチファイルを実行させる。 ※ログを取れなかった場合は recovery だけするバッチファイルを実行させる。 6)サーバB の 2) のジョブを停止するバッチファイルを実行させる。 7)クライアントにサーバBへ接続する ADP を配布し、サーバBを使わせる(業務再開) トランザクションログが取得できない壊れ方をしても、最大で差分取得の間隔までの手戻りで済む と踏んでいます。 業務が再開した後で、こちらの管理者を向かわせて原状復帰します。 MS-Access は何度も使っていたのですが、MSDE を使うのは初めてなのでこのような 方法でよいのかどうか迷っています。是非とも、ご助言下さい。
>>842 外からは同じ型のテーブル群がそのデータベース内に存在するように見えるからといって、
そのデータファイルやバックアップ、トランザクションログを複数のサーバで同じように
使える事が保証されているわけじゃないよ
そこがMSDEやSQL Serverと、AccessのMDBファイルとは決定的に異なる部分
>>842 それだけの仕掛けをバグなしで作成してトラブルなく運用できる自信があるなら止めないが、
1日1回のフルバックアップと数回のログバックアップだけで十分な気がする。
SQL-Serverのライセンスも払えない客はまる1日待たせとけばいいよ。
リモートディスクトップか類似のソフトであんたが遠隔操作したほうが確かじゃないかい。
むしろ気になるのはMSDEのEULA。最新のは調べてないが、以前調べたときは
Server系OSにインストールした場合に10クライアント程度だった。
>>842 Dev版買ってずっとテストをユーザーにやってもらえば?
>>842 差分バックアップは別に要らないような気が。
定期的にトランザクションログをバックアップして
常にサーバーBに食わせておけばすぐ切り替えられるでしょ。
MSDEはライセンスフリーで、そのまま商用利用も可能ですよね?(OSのライセンスさえあれば) それで、DBにはMSDEを利用し、管理はエンタープライズマネージャー使うのはライセンス的に問題あるでしょうか? まず本物のSQLServerを購入します。 こちらは社内で使うとして、ライセンスも購入します。 そこにEMがついてきますよね。 で、それとは別件でMSDEのDBを構築します。 ライセンスは、そこにアクセスするクライアントで決まるので MSDEの場合それがフリーですから、ライセンスは発生しないはずですよね。 という事は、別件でライセンスを使用して使っているEMで このMSDEにアクセスしても問題はありませんよね? ようは最初の1個目さえ正規ライセンス品を買えば 後はDBの容量や制限さえ気にしなければ MSDEを使って、しかもEMからアクセスしても問題ないかどうかと言うことです。 DBはEMにライセンスが必要なのではなく、 DB自体にアクセスするのにライセンスが必要という解釈で間違っていないですかね?
>>849 MSDEがライセンスフリーなんつってるんじゃぁMSDEのEULAは理解できてなさそうだな。
他のマシンからMSDEにアクセスさせる事自体、MSDEのライセンス違反。
MSDEであっても一応SQL Serverなので、Enterprise MangerでもSQLクエリアナライザでも
アクセスすれば接続できるが、その開発者用の接続ができるからといって、その使い方での
運用まで桶というわけではない。
で、SQL Serverのライセンスについても理解できてんのかどうか非常に心許ないのだが、
Enterprise Managerに関してだけは、その解釈で間違っていない。
>>850 > 他のマシンからMSDEにアクセスさせる事自体、MSDEのライセンス違反。
そうなの?
http://www.microsoft.com/japan/sql/msde/howtobuy/msdeuse.mspx > Q. MSDE を Web アプリケーションのデータベースとして使用できますか ?
> A. はい。同時接続ユーザー数が 25 以下の基本的な Web アプリケーションに
> とっては、MSDE は理想的なソリューションです。
ってあるけど・・・
#確かに、Access などに基づく MSDE については、Access をインストールしたデバイスのみ、
って書かれてけどね
エンタープライズマネージャの利用については、
> Q. SQL Server のツールおよびサービスと、MSDE の併用は可能ですか ?
> A. SQL Server のツールおよびサービスと、MSDE を併用できるのは、
> SQL Server 2000 (Developer Edition、Standard Edition、Enterprise Edition のいずれか)
> から MSDE を入手した場合、およびライセンスが適切に許諾された SQL Server 2000
> のコピーと MSDE を併用する場合に限られます。
だね。
852 :
842 :2006/02/18(土) 19:45:52 ID:???
>843 成る程、同じインスタンスに違う DB 名で RESTORE したら大丈夫だったので安心していました。 とりあえず開発環境に2つ目のインスタンスを導入して、本当に実現可能かちゃんと試してみます。 >844 >847 確かに、ログバックアップを逐次食わせていけば大丈夫ですね…頭に血がのぼっていたようです。 ちなみに導入先は社内です。ただ、別拠点且つ外部接続されないネットワークなので、自分で 常時管理することができません。 EULA は JPN_MSDE2000A.exe に含まれる license.txt, ReadmeMSDE2000A.htm をあまさず 読みなおしてみましたが、クライアントのアクセス数の制約については記載されていないようでした。 >845,846,848 ( ´Д` )えー >849 >850 MSDE を再頒布して使用するのは SQL Srv.2k Dev. で、Access2003 RT版は VSTO で可能です。 本番環境は EM を使わないで利用できるよう、DB のセットアップは開発の時点からすべて T-SQL を 組んで行っています。 しかし、EM はよいツールですね。Dev. が入る前は osql だけでいじっていましたが、BOL にかじり つかなくてもたいていの操作は行えるわ DB セットアップ用の SQL は自動生成するわ。重宝しています。
Workstation系の場合は他のマシンからは禁止だった記憶があります。 Server系の場合は10接続位だったと思うけど、WEBの場合は多いのかもね。 Workstation系でIISを動かす場合はIIS側にもライセンス上の制限があるはず。 Workstation系でのMSDEはスタンドアロンとSQLServerからのレプリケーションで 使う用途を想定していて、SQLServerに対する接続は接続数に含まなくてよかったはず。 EULA探してるんだけど、インストールしないと出てこないだっけ?
マイクロソフトがどういう利用を想定してMSDEのライセンスを設定したのかというのが
よく分からん。ADOなVBアプリ等のデータ格納先としての、Accessよりかはもちっとマシな
ローカルでスタンドアローンなDB利用を想定、なのかな?
>>851 >
http://www.microsoft.com/japan/sql/msde/howtobuy/msdeuse.mspx 以前その文面を見た時、それは一体どういうものを意味しているのかを調べたんだが、
結局それは「IISと同一のサーバにMSDEをインストールし、そのIIS上でそのMSDEに
接続するようなWebアプリを動作させる」場合は、IISの同時接続ユーザが25以下の状態が
パフォーマンス的に妥当、という意味にすぎず、その一文がEMやisqlw等でMSDEに
自由に接続してもよいってことを意味しているわけではない、だった。
WEBサーバとDBサーバを別々のマシンにするなら、DBサーバ側にはServer系OSに
CPUライセンスなSQL Serverを搭載しろ、と言われたことがあるような。
>>854 > よく分からん。ADOなVBアプリ等のデータ格納先としての、Accessよりかはもちっとマシな
> ローカルでスタンドアローンなDB利用を想定、なのかな?
かもな
だがそこに、いろいろ機能を持たせているから
だからといってBackup Execとかどこぞのサーバ監視ソリューションとかみたいに、
SQL SERVER 2000をインスコしてあるサーバに勝手にMSDEをインスコしようとするのは
勘弁してほしいものだが
ライセンス違反をするとどうなりますか?
本当かよ〜 MSが決めたルールで損害賠償取られたら、たまんねえな。
SQL Serverがいやなら、Oracleを使えばいいじゃない(マリー
>128 >129 で、クエリアナライザのデバッガがブレイクポイントを設定しても止まらないとなっているのですが、 同じことで悩んでいます。 アナライザ用のSP4パッチを当てて解決となっているのですが、これがどこにあるか 分かる方いらっしゃいませんか?SQLServer2000 SP4を当ててみても解決しませんでした。 よろしくお願いします。
SQLServerXEインストしたんだけど、SQL文たたくGUIついてないの?? 使え寝レナ。せっかく、もれが試してやろうと思ったのに。 メンドくせぇ。
>>863 つ Common SQL Environment
>>863 バカ丸出し m9(^Д^)プギャー!!
SQL Server 2000 SP4の環境で、ntext型のカラムに(JDBC経由で入れた)データが Enterprise Managerからどうも見えないんだけど、どうしたらいいんでしょう? ちなみにtext型は見えます。 JDBC経由で読んでみて、データが入っていることは確認できています。 データが大きすぎるのか、あるいはどこかに設定があるのかとか思ったのですが 未解決です。
SQL7のバックアップをSQL2000で復元できなくて困っています。 やりかた教えてエロイ人
>>867 おいらエロくないんで正しく答えられないんだけど、
「復元できなくて」だけでは情報が足りないよ。
どういう操作をしたのか(EnterpriseManagerからとか、osql上とか、そのコマンドラインを具体的にとか、
またはサードパーティのバックアップツールを使用したとか)、
バックアップの格納先(TAPEか、HDとか)、
どういうエラーメッセージが返ってくるのかとか書かないとレスがつかないと思うよ。
>>867 2000のバックアップを2000に復元するときと同じです。
871 :
NAME IS NULL :2006/02/22(水) 16:04:30 ID:yYoQEzDb
それってCAサーバにこのDBいをインストールして使えないってこと?
873 :
NAME IS NULL :2006/02/22(水) 16:24:10 ID:EZO5Nqv4
874 :
867 :2006/02/22(水) 16:41:49 ID:???
>868>869 スマソ、説明不足杉でした SQL7>SQL2000の際にEnterpriseManagerがなんのメッセージも無く強制終了する現象です。 ログも残っていなく、原因が全く掴めず諦め気味orz ウィザード系の何かが壊れているかもしれませぬ
osqlか、クエリアナライザからコマンドラインでやってみたら?
GUIに頼りきりだと、いつか困ることが出てくるよ(
>>874 の現象とか)。
コマンドラインで管理するようにすれば、いろいろ応用も利くし、ドキュメントに残すことも容易。
876 :
NAME IS NULL :2006/02/22(水) 20:09:42 ID:xCOU+l7M
text型で文字列結合できないんですが・・・ こんな感じ↓ update set text1=text1+'moji' from table1 どうやって回避するのが一般的?
構文おかしくない? update table1 set text1=text1+'moji'
878 :
NAME IS NULL :2006/02/22(水) 20:58:08 ID:Sf/3sROs
ストアドでおききします。 BEGIN TRANSACTION declare @add_id int declare @cat_id int declare @id int set @add_id = (SELECT [@add_id] FROM View_address WHERE ([@add] = @add)) set @cat_id = (SELECT name_id FROM mas_category_name WHERE (var_name = @cat)) if (SELECT id FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) < 1 --新規登録 INSERT INTO entry_id(var_member_id, var_pass)VALUES(@member_id, @pass) set @id = scope_identity() IF(@@ERROR<>0) GOTO err_label INSERT INTO entry(add_id, var_banti, e_id)VALUES(@add_id, @banti, @id) set @ret = scope_identity() if @url is not null INSERT INTO url(var_url, var_title)VALUES(@url, @title) IF(@@ERROR<>0) GOTO err_label else set @id = (SELECT id FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) UPDATE entry SET add_id = @add_id, var_banti = @banti , e_id = @id WHERE (id = @id) if @url is not null INSERT INTO url (var_url, var_title) VALUES (@url, @title) set @ret = @id COMMIT TRANSACTION RETURN(0) err_label: ROLLBACK TRANSACTION RETURN(1) とっても見にくくてすいません。 主に新規登録の処でおかしな動きをします。 entryをI)NSERTしたあと、entry_idをINSERTしなくてはいけないのですが、entryがINSERTしません。 当然@idのscope_identity()をしているのですが、Nullが入ります。 「if」の使いすぎでしょうか?それとも使用方法事態間違っていますか?
とりあえず、BEGIN 〜 END で括って。流れがわからん。
本人もそこでわからなくなっているんじゃ
>>878 >if (SELECT id FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) < 1
count(id)にすればとりあえず動くんじゃないの。
普通はNOT EXISTSを使うところだが。
883 :
878 :2006/02/22(水) 22:42:14 ID:???
解決しました。 なんてことはない話で9行目の if (SELECT id FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) < 1 が if (SELECT count(id) as [abc] FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) < 1 になっていなかっただけでした。 >879 括ってどういう意味ですか?
>if (SELECT id FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) < 1 これが、このあたりの勘違いということはない? if not exists (SELECT id FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) if (SELECT count(id) FROM entry_id WHERE (var_member_id = @member_id) AND (var_pass = @pass)) < 1
885 :
878 :2006/02/22(水) 22:43:55 ID:???
>882 入力している間にレスが・・ ありがとうございました。 これでやっと帰れます
886 :
878 :2006/02/22(水) 22:45:55 ID:???
>884 ぁぁ・・・またやってしまいました ここの住人は皆優しいな。・ ゚・。* 。 +゚。・.。* ゚ + 。・゚・(ノД`)
>>883 if 条件
1命令
if 条件
BEGIN
複数命令
END
set @id = scope_identity() はifから外れているはず。
888 :
878 :2006/02/22(水) 23:48:58 ID:???
>>887 ありがとうございます。
複数命令の時はBEGINの中にいれるのですか!
ヤバイ・・めちゃくちゃ手を入れないとダメっぽいです
本には全然書いてなかったです
ち く し ょ ー
>>888 、一般のプログラミング言語触った事あれば、
複数の文を書く時に、なんとなく注意する癖がついてるよ。
890 :
867 :2006/02/23(木) 14:56:04 ID:???
>875 osqlを調べてみたが難しそうね・・・俺の能力ではきついぽい でもやるしかなさそうなんで頑張ってみるよ thx.
SQL Server2005の評価版って使用期間過ぎると起動すらしなくなるんですよね?
>>889 つうか一行だろうが複数行だろうが脳使わずにBEGINとENDで囲むってしちまえば
そんな悩み無くなっていいじゃん、とすら思う
>>890 復元の時にEnterprise Managerの中の人が行った処理を見ればRESTORE等を
どう使うのかってのが分かるんジャマイカ
ところでEnterprise Managerが裏で投げてるSQLとかってどうやって見るんだっけ?
>>891 試用期限を気にするくらいならdev版を買ってしまう方がいい。
2005のマニュアルってまだ発売されないんですかね? それとも2000ので十分ですか? 当方、ORACLE使いで今回のプロジェクトで久しぶりにMS-SQL使うことに なり、困ってます。
899 :
896 :2006/02/26(日) 23:59:54 ID:???
>>897-898 サンクス!
MSはメーカーが無償でこんなに技術情報を提供してたんですね!(゜-゜)
MySQLの買収しか頭にないどっかのメーカーとは違いますね(ーー;)
あっちもマニュアル類は大量に無償で配布してますよ。 パッチにサポート契約が必要なのがあれだけどね〜
901 :
NAME IS NULL :2006/02/28(火) 00:32:14 ID:UNA+7DVN
今から2000を購入して開発するってアフォですか?
>>901 2000ならいいじゃない。それ以前のヴァージョンなら考え直せというけど。
2005があとどれだけ枯れる余地があるかということと、2000が枯れているかどうかってのを どういう価値観で判断するかだろうな さすがに7とかなら、MSDE2000でもいいからそっちにしるって思うだろうが
今から2000、大アリだと思う。 実績やノウハウの量が文句なし。 ServicePackもいくつも出て安定性も十分。 2005へのマイグレーションも簡単だし。 (うちのところは大量のストアド内で結合構文が古い書き方だから やむなく2005の互換性レベルを変えてしのぐ方針だが…)
906 :
NAME IS NULL :2006/02/28(火) 10:44:02 ID:DclAQVmI
素人臭い質問で失礼します。 SQL2000Serverで取得したトランザクションのログ(拡張子が.TRNです)から、 どんなトランザクションがあったのか集計を行いたいのですが、 そもそもバイナリデータの為、見ることも出来ません。 とりあえず、見れるようにデータ変換をしたいのですが、 どのようにすればいいのでしょうか。
Cognosが2005に対応しないとなぁ
910 :
906 :2006/02/28(火) 16:25:56 ID:???
>>907 おおー、これぽいのですが、英語ですかorz
とりあえずインストールまでは完了したのですが、
何故かDBに接続できないと言う結果に。
>>909 もちょっと詳しく!!
>>906 トランザクションログを解析するんじゃなくてプロファイラを上手に使えばいいんじゃねーの
>>910 もうじき日本語版が発売されるよ。
それよりも英語をもっと勉(ry
Integration servicesで転送ツール作ってるけどうまく遺憾ので解説書が欲しいんだが やっぱBooksOnlineですか・・・
SQL Server 2005 Express Edition ってPostgreSQLやMySQLより導入は簡単ですか?
インストールするだけならアフォでもできる ...のは他も同じかw
2005だとMySQLの方が若干インストールが簡単。 ってそういう事じゃないんだろうがw
ごめんなさい、そういう事ですorz MySQLは文字コードの設定がめんどうだったので・・・PostgreSQLは・・・バキュームがめんどうだったので・・・orz クダラナイシツモンデゴメンナサイ、とりあえずインストールしてみますrz
918 :
917 :2006/02/28(火) 23:32:55 ID:???
インストール挑戦してみました。 とりあえず、事前にいくつかインストールしないといけないのが メンドウなくらいで、あとはポチポチ押せば進むので簡単な感じ。 あとは、今回はVPC2004上でインストールしようとしたけど、 自鯖はCPUがC3だから動くかかなり心配。(重そうだし) 最後に「Microsot SQL Server 2005 をインストールできませんでした。」 と親切に教えてくれるのもありがたいですね。
PC を 2台用意して、(PC_A, PC_B) 2台ともに SQL Server をインストール します。 ここで、PC_A → PC_B に、1日1度単位でいいので、データベースを コピーしたいと思っています。 これは PC_A が壊れた時に PC_B を代替機として使えるように したい為、PC_A のデータベースを、日次単位程度で PC_B にコピーしたい、という事になります。 上記のような事を実現させるのによい方法があれば アドバイス頂けないでしょうか?
じゃなくて ファイルサイズ の項か。
>924 うほ、さんくす。助かりました。
927 :
NAME IS NULL :2006/03/02(木) 00:06:13 ID:N5vujdH7
Developerって、どのような場合に買うのですか? いずれは、本番稼動用にStandardかWorkgroupを買うのに必要なのですか?
>>927 開発用。
本番稼動は、稼動先にライセンスを買ってもらう。
929 :
927 :2006/03/02(木) 00:07:14 ID:N5vujdH7
それともGUIツールのないMSDEの開発用ですか?
930 :
927 :2006/03/02(木) 00:08:02 ID:N5vujdH7
>>930 必要だよ
社内の利用組織側に買ってもらえ
社内で開発するところまでならDeveloper EditionでOK。 それで作ったシステムを利用するとなったら 社内だろうが客先だろうがStandardとかが必要になる。 まあSE会社の社内だったらMSDEで十分だろうけどね
934 :
NAME IS NULL :2006/03/03(金) 00:16:08 ID:SJ0DXsHh
Developerで開発して、Workgroupに移行するなら最初からWorkgroupで 開発すればいいのでは?まぁ5千円の節約にしか過ぎないが、移行の 手間がいやだね!
うんそうだね。 そう思うならそうすると良いよ。
>935 なんか頭悪いのが出てきたなw
934には敵わんだろ。
938 :
NAME IS NULL :2006/03/03(金) 02:00:55 ID:Ez5vYUbc
クエリー結果で列見出し(項目名)を表示させないためにはどうする?
>>938 こういうこと?
SELECT Column1 AS ' '
FROM Table1
何か意味があるのか?
osqlとかでの話じゃねーのか
941 :
NAME IS NULL :2006/03/04(土) 08:04:37 ID:95Clvg4d
SQLServerのストアドプロシージャで、大量の業務処理を並行稼動 させていて、ロックリソースの取得エラーでこけてしまいます。 ロックリソース用のメモリをある程度まとまった単位で確保しておく ことはできないものでしょうか? 何か良い解決策もあったら教えていただけないでしょうか。 ちなみにSQLServerのメモリ割り当ては動的設定しており、初期割り当ては 500M程度にしてあります。
>>941 デッドロックが起きてる可能性は無いのか?もしそうならメモリ増やしてもまた起きるが。
943 :
NAME IS NULL :2006/03/04(土) 11:15:05 ID:95Clvg4d
デッドロックはないです。 SQLServetrログを見ると単純にロックリソースが不足している、とあり 業務アプリ側はDBMSから変な戻りが返ってきたと判断して異常終了 しています。従って、並行実行している処理が完了後にこけた処理を 単独で再実行すると普通に正常終了します。 私見では、ロックリソース用に固定でまとまったメモリ領域を予約 できればいいのかなあ、と思うのですが、可能なのでしょうか。 マニュアルを見ると、SQLServerが起動した際に割り当てされる全メモリ の何%かを初期値としてロックリソース用に割り振るとあります。 この「何%」というのをコントロールできないものでしょうか。
せめてバージョンぐらい書けと
2000ならsp_configureでlocksをいじれば明示的に設定できる
SQLServer6.5でカラムのデータ型って変更できないんでしたっけ? 手元には7.0しかないので互換モードを6.5に変更して テストしてるんですがALTER COLUMNは7.0からのサポートなので・・・。
947 :
NAME IS NULL :2006/03/05(日) 23:44:50 ID:Yk+EdwaQ
1秒間当たりのトランザクション数を知りたくて プロファイラを使用しようと思ってるのですが、 どうやって活用すればいいのかがわかりません。 是非教えていただけないでしょうか?
>947 パフォーマンスモニタを使った方が楽だぞ。
>>946 6.5と7.0はかなり変わってるから実物でテストしたほうがいい
950 :
947 :2006/03/06(月) 09:14:02 ID:???
>>948 パフォーマンスモニターの方ですが…。
すみませんが、どうやって測定するのか
教えてもらってもいいでしょうか…m(__)m
951 :
947 :2006/03/06(月) 10:01:22 ID:???
パフォーマンスモニタで、 SQLServer:DatabasesのTransaction/secを見ればいいんだと 自己解決したのですが あってますか??
SQL2000のSP4ってMS03-031以降のセキュリティアップデートって何か含んでます?
_____ / ̄ ̄ ̄ ̄\,, /−、 −、 \ /_____ ヽ / | ・|・ | 、 \ | ─ 、 ─ 、 ヽ | | / / `-●−′ \ ヽ | ・|・ |─ |___/ |/ ── | ── ヽ | |` - c`─ ′ 6 l |. ── | ── | | . ヽ (____ ,-′ | ── | ── | l ヽ ___ /ヽ ヽ (__|____ / / / |/\/ l ^ヽ \ / / | | | | l━━(t)━━━━┥
955 :
NAME IS NULL :2006/03/07(火) 10:53:01 ID:RKE0wbv3
SQL Serverの無料版ありませんか。
MSDE
>>957 これって(2000でいう)DTSみたいなのは使えるんですか?
無料なんだから自分で試せよ
>>958 IntegrationServiceは駄目って機能比較のとこに書いてあるじゃん
DTS使えないからMSDEでいいやって思うおれ
MSDEにはDTSはついてないだけで使えるのは使えるんじゃないの?
963 :
946 :2006/03/07(火) 22:14:07 ID:???
>949 レスありがとうございます。 亀レスすいません。 やっぱり細かく検証するためには6.5必要ですね。
964 :
NAME IS NULL :2006/03/08(水) 23:23:02 ID:smSr7Xvp
32bit版上のデータベースをデタッチして、64bit版に正常にアタッチすることは出来ますか? あと、32bit版から64bit版にmsdbを移すことが出来ますでしょうか?
965 :
964 :2006/03/08(水) 23:28:03 ID:???
すいません、ググッたら2005はもちろん、2000でも出来るみたいでした。
SQLの記述に関する質問です。 テスト結果テーブル ※KEY項目は無し 名前 年齢 国語 数学 英語 −−−−−−−−−−−−−−−−−−− たろう 12 10 100 50 ←@ たろう 12 30 50 20 ←A はなこ 13 80 50 50 ←B はなこ 13 90 70 50 ←C はなこ 14 10 10 10 ←D 項目「名前」と「年齢」が同一のものが複数存在した場合は、 最初の1件目のデータのみ抽出する ↓ <抽出したい結果> 名前 年齢 国語 数学 英語 −−−−−−−−−−−−−−−−−−− たろう 12 10 100 50 ←@ はなこ 13 80 50 50 ←B はなこ 14 10 10 10 ←D SQLのみで記述してこのような結果を抽出するには どうしたら良いのでしょうか? 環境はSQLServer2003です
今から2000のDEV買って開発を始める俺はアフォですか? あと、もう2000って生産中止ですか?
>>966 最初の1件目というのを判別する連番などのカラムは有りませんか?
>>968 ないようです。
やはり、判別する項目がないと無理そうですよね。
>>969 そもそも、最初の1件ってのが定義あいまいなんだよ。
テーブルに格納されているデータは順序が保証されないから、例のように
1件目って言われても「はぁ?」って感じ
SELECT TOP 1
>>972 order by なしの top 1 だと、たまたま最初にヒットした1件目ということかい?
>>973 そゆこと。最初の1件であることは確か。順序はわからんけどw
966です。レス有難うございます。
SELECT DISTINCT
TB1.名前,TB1.年齢,TB1.国語,TB1.数学,TB1.英語
FROM
(
SELECT
名前 AS 名前,
年齢 AS 年齢,
国語 AS 国語,
数学 AS 数学,
英語 AS 英語,
(文字型の国語+文字型の数学+文字型の英語)AS 科目
FROM テスト結果テーブル
)AS TB1,
(
SELECT
名前 AS 名前,
年齢 AS 年齢,
MIN(文字型の国語+文字型の数学+文字型の英語) AS 科目
FROM テスト結果テーブル
WHERE xxxxx
GROUP BY
名前,年齢
)AS TB2
WHERE TB1.科目=TB2.科目
こんな感じにしてみました。
>>970 の通りなので、これでOKが貰えると思います。
なんで全角で書くかね。
実行するたびに値が変わっても文句は言えないよ。
TOP 1で出てくるレコードって、インデックス無しのテーブルではどうやって決まってるんだ? リストアで変わったりするようなのだが、そういうものなのか?
>>899 ちょっと日がたってるけど気になったので。
マニュアルも探せないヴぁかのくせに悪態つかないほうがいいぞ。
>>980 余程悔しかったのですね!( ´,_ゝ`)プッ
982 :
980 :2006/03/12(日) 19:27:18 ID:???
ん?漏れは単なる通りがかりよ。 マニュアルとかってWebを見ればすぐに見つかるものなのに、それすらしないくせに文句言うやつが頭にきただけ。 身近にいるやつとダブった。 聞き流しておくれ。
>>982 そんなに顔を真っ赤にして目に涙を浮かべて必死にならないでも・・・( ´,_ゝ`)プッ
>>979 物理的な読み出し順等になるかと。
バックアップ時に、何らかの順番に変わっていれば
リストアもその順番になるだろう。
>>980-983 /\___/\
/ -‐' 'ー-' ::: \
| (●), 、(●)、 | ・・・・バカなんだから
| ,,ノ(、_, )ヽ、,, |
\ `ニニ´ .:::/
/`ー‐--‐‐―´´\
トリガについて教えてください。 レコードが更新された時に、ある列を自動更新がしたく、 CREATE TRIGGER [dbo].[table1_flgupdate] ON [dbo].[table1] FOR INSERT, UPDATE AS UPDATE table1 SET flg = flg + 1 FROM inserted WHERE table1.code = inserted.code のようなトリガを作成しました。 フラグの更新はこれで問題なかったのですが、 そのフラグを 0 に戻したい処理があるのですが、 その場合でも、上記トリガで 0 に更新された後に 1 に更新されてしまい、フラグを 0 の状態にできません。 更新された値が 0 の場合は、トリガを実行させないように するにはどうすればよいでしょうか? フラグを 0 に更新している箇所で -1 に更新する、というのは 避けたく、トリガの中だけでなんとかしたいと思っています。 アドバイスよろしくお願いします。
>>986 ALTER TABLE xxx DISABLE TIGGER xxx でトリガを無効にするか、
IF UPDATE(flg) を使ってflgが直接更新されたときとそれ以外のときで処理を分ける。
988 :
986 :2006/03/13(月) 18:22:41 ID:???
>>987 ありがとうございます。
IF UPDATE(flg) を試しているのですがうまくいかないので
おかしい所を指摘頂けないでしょうか?
CREATE TRIGGER trig_name on db.table1
FOR INSERT, UPDATE
AS
IF UPDATE(flg)
RETURN
ELSE
BEGIN
/* 処理 */
END
というトリガがある状態で、
update table1 set flg = 0
とやった場合、トリガの /* 処理 */ の内容が実行されてしまいます。
IF UPDATE(flg) で flg が更新された場合は RETURN しているので
抜けていくと思っているのですが、抜けていきません。
何か大きな勘違いをしていますでしょうか?
>>988 CREATE TRIGGERの説明を読むとIF UPDATE()に対しては
ELSEが使えなさそうだけど、その構文で通った?
990 :
986 :2006/03/13(月) 23:21:39 ID:???
>>989 ELSE 通りました…。
不安だったので ELSE をやめて、
IF UPDATE(flg) RETURN
BEGIN
/* 処理 */
END
にかえてみましたが同じ結果でした。
>>988 その範囲は間違ってないような。
再帰クエリーオンにしてるとか、処理のところで条件なしのUPDATEを実行してるとかしてない?
992 :
986 :2006/03/13(月) 23:49:45 ID:???
>>991 ありがとうございます。整理して調査してみたら
別のトリガで更新された結果、再度トリガが起動されているような
状態でした。失礼しました。
1つ気になる所があるので教えて頂きたいのですが、
IF UPDATE(flg) RETURN
の flg が、テーブルデザイン上でデフォルト値が設定されたいた場合
INSERT のトリガで UPDATE(flg) はどのように判断されるのでしょうか?
というのは、今度は INSERT で UPDATE(flg) にひっかかってしまい、
RETURN で抜けてしまうようでそれ以降の処理が実行されなく
なってしまいました。この IF UPDATE(flg) RETURN の行をコメント
アウトすると処理が実行されるので flg が更新対象フィールド
という判定になっていると思うのですが、INSERT を行なっている
箇所をみても flg に値はセットしておらず、考えられるのが
デフォルト値に設定されているからかな、と思うのですが…。
根本的な質問だけと、みんな、何で接続してる? ODBC、ADO、DAO〜 OLE DB....他になんかあるか? パフォーマンス重視するなら何がいいよ? 一概に何がいいとは言い切れないと思うけど....
普通、ADOだろ。 つか、OLE DBインターフェースをラップしたものがADOで、 ODBCインタフェースやOLE DBインターフェースを直接呼んでる人は おつかれさんって感じ。
Java/JDBCでやってる。
生産性も納期も無視してアプリケーションのパフォーマンスだけを追求できるような 研究職じゃないんでね
BDE/SQL Link...
男は黙ってDBLib/NetLib
元は 男は黙ってサッポロビール だっけ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。