Microsoft SQL Server 総合スレ 6
Microsoft SQL Server 総合スレ 6
3 :
NAME IS NULL:2008/04/07(月) 07:59:59 ID:7wzqdvA4
ではさっそく
SANに2台サーバが接続されています
片方のサーバのSQLSERVFRでオープンしているデータファイルをもう片方のサーバのSQLSERVERから読み取り専用で開く事は可能ですか?
バージョンは2005です
できない気がする。
MSDE 2000、Books Online で FETCH を見ると RELATIVE に指定する変数は
smallint でも良いことになっているけど、変数の値が負だと @@FETCH_STATUS が -1 になった。
型を int に変えたら直った。
これで4時間悩んだ。MS頃す
データベースAの全テーブルとデータベースBの全テーブルのコンペアってどうやります?
やっぱり全部テキストに落としてから比較?
8 :
NAME IS NULL:2008/04/11(金) 09:46:27 ID:l77RsaBa
SQLについて教えてください。
とあるNVARCHAR列に半角が入っているものを検索したいのですが
列 like '%A%' OR 列 like '%a%' || ・・・・・・みたいに
一文字ずつ半角コードと総当りさせるORを書くしかないのでしょうか?
なにかいい方法はありますでしょうか?
9 :
NAME IS NULL:2008/04/11(金) 10:53:30 ID:l77RsaBa
事故解決しました。
Access使って
SELECT * FROM ××マスタ
WHERE StrComp(列名,StrConv(列名,4),0) != 0
SQLについて教えてください
DATATIME型として入っている、部分を取得して
GROUP BYでまとめたく以下のようなSQLを作成しました。
SELECT substring(convert(char,U_DATE,111),1,10) as U_DATE,count(*)
FROM tb_ticket
GROUP BY U_DATE
U_DATEが同一のものがまとまってほしいのですが、全レコードが出力されてしまい
countがすべて1となってしまうのです。
datatimeをGROUP BYするにはどうしたらよいのでしょうか
日付のyyyy/mm/ddでカウントしたいなら
GROUP BY の条件も GROUP BY substring(convert(char,U_DATE,111),1,10)
ジョブについて教えてください。
とあるバッチ(hoge.vbs)があります。
これをジョブで起動するのですが。
cscript.exe hoge.vbs
これをhoge.vbsの実行が終わったら1秒空けて(あけなくてもいいかも)
またhoge.vbsを実行したいです。永久に。
このような処理をジョブで可能でしょうか?
よろしくお願いいたします。
>>12 SQL Server エージェントをみてみたら1分間隔までは設定できるみたいだけど、1秒というのはできないっぽい。
(まあ、ジョブを60個作って無理やり動かせば可能だけど)
ただ、SQL Serverエージェントで処理する必要があるの?
例えばhoge.vbs内で無限ループさせるとか、hoge.vbsを呼び出すバッチファイルやスクリプトを作成するとか。
あと、1秒空けるのは、sleepを使えばCPU時間を消費しないで待たせることは可能。
最初の起動としては、スケジュールを作成するときに、スケジュールの種類を"SQL Serverエージェント開始時に
自動的に開始"を設定することでできるし、Windowsタスクの場合でも"システム起動時"に設定すれば起動できるよ。
どんな処理かわからないから、漠然としか回答できないけど、こんな感じでいいかな?
>>11 ありがとうございます。
抽出したい件数がカウントできました!
>>12 pingで1秒waitっぽいことできるでしょ
varcharの列でnullだったり空だったりすると抽出条件が面倒なので、
空で統一したら便利なんじゃないかと考えました。
nullを許容のチェックを外して既定値を '' にしたんですが、
運用していく上でなにか不都合があったりするのでしょうか?
>>16 ビジネスロジック上nullと空を区別する必要ないならいいんじゃないの?
あと最近うんちがRAIDになってしまう
家でずぼっと出て会社で残りをするような
ちょっと質問ですが、今までOracleを使ってたのですが、
少しの間だけ、SQLSERVERを使っているプロジェクトに入ることになりました。
SQLSERVERを使ってる人はだいたいクエリーツールは何を使っているのでしょうか?
クエリーアナライザーを使うのが多いのでしょうか?
職場だとフリーやシェアのソフトを入れても特に問題は無いです。
2000ならクエリアナライザ使ってるだろうな
あとVisualStudio
意外とaccess
Access2003以下のMSSQL2005触らせなさは異常
>18
2005ならManagementStudio、2000ならクエリアナライザがあるが2005のManagementStudioを使った方がいろいろ便利だと思う。
Oracleと違って標準で用意されてるツールで大体十分だと思うよ。
23 :
16:2008/04/16(水) 09:14:29 ID:???
>>17 サンクス。区別する必要が無いときはそれでやってみます。
24 :
NAME IS NULL:2008/04/17(木) 13:50:03 ID:tnV6pzL3
integration serviceについて教えて下さい。
当方、2003serverとVB6.0を用いて、integration serviceでデータのインポートを呼び出そうとしているのですが、可能でしょうか。
本やネットを調べても、.netやbusiness intelligence development studioの話題しか出てこないのですが……。
上げてしまいました、すみません……。
悩み中…
SQL Server 2000で、約2億件のデータから特定の条件の約2000万件のデータを削除したい
普通に delete from A where B=C とかではあっさりタイムアウトするので分割削除したい
delete top 1000 from A where B=C みたいなことって出来るんでしょうか?
27 :
NAME IS NULL:2008/04/18(金) 11:38:05 ID:hKVau2G8
で、それを2万回やるの?
そうw
29 :
NAME IS NULL:2008/04/18(金) 13:06:21 ID:nmpP6AcP
他の列使って絞り込みながら少しずつ削除とかできないの?
>>29 やっぱそれですかねぇ…
それやりかけて嫌になって聞いてみたんですが
>26
delete A from A a where exists
(select * from
(select top 1000 * from A) b
where A.key = B.key)
こんな感じ?
レコード数が多いと微妙な気がするけど。
もうちょっと条件入れて少しづつ消した方が確実かなと思う。
>>30 SQL Server 2005はDELETEでTOPの指定はできるけど、SQL Server 2000ではできない。
その辺りの方法については、Pass Jのフォーラムとか川端さんのブログで見た記憶があるけど。
>>26 bcpを使って条件付で抜き出す。
truncat tableでテーブルクリア。
bcp最小ログでデータをロード。
1行ずつ消していけばよい
>>24 SSISを実行するSQL Server Agentのジョブを作成して、
sp_start_jobで作成したジョブを実行すればできると思う。
>>26 deleteのコストは高い。
論理削除ではどう?
2億件のレコード数をいっそう増やすのか
インデックスを付けるとどうかな?
10分の1まで絞れるなら少しは効果が出そうだけど。
40 :
sage:2008/04/23(水) 17:17:00 ID:YvQLSJqa
VB2005
SQL Server 2005 Express Edition
サーバOS:Windows 2000 Server
クライアントOS:Windows XP
ADOでSQLサーバtestに
' 接続文字列を生成する
Dim stConnectionString As String = String.Empty
stConnectionString &= "Data Source = test;"
stConnectionString &= "Initial Catalog = testdb;"
stConnectionString &= "Integrated Security = SSPI;"
' SqlConnection の新しいインスタンスを生成する (接続文字列を指定)
Dim hConnection As New System.Data.SqlClient.SqlConnection(stConnectionString)
' データベース接続を開く
hConnection.Open()
' 接続に成功した旨を表示する
MessageBox.Show("Microsoft SQL Server に接続されました")
' データベース接続を閉じる (正しくは オブジェクトの破棄を保証する を参照)
hConnection.Close()
hConnection.Dispose()
として接続しようとすると
サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときに
このエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることが
エラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server
への接続を開けませんでした)
というエラーメッセージが出て
hConnection.Open()
のところで中断します。
サーバのリモート接続は
ローカル接続およびリモート接続−TCP/IPおよび名前月パイプを使用する
に設定しているのですが…何がいけないのでしょうか?
>>40 express edtionの場合デフォルトのサーバー名がインスタンス名付きになってるから
それが足りないのでは。
Data Source=test\sqlexpress
Data Source=.\sqlexpress
42 :
40:2008/04/23(水) 17:59:30 ID:???
Data Source=test\sqlexpress
にしたところ、
このログインで要求されたデータベース "testdb" を開けません。ログインに失敗しました。
ユーザー '(ドメイン名)\(ユーザー名)' はログインできませんでした。
というエラーメッセージに変わりました。
少しだけ進展したような気がしますがどう対応していいかわかりません。
ご存知の方いましたら教えてください。
あと、sage間違いすいません。
>>42 DBにアクセスするプログラムをVSのウイザードで自動生成して出来たものを調べるのが近道。
接続文字列は*.exe.configにあるはず。
44 :
42:2008/04/23(水) 19:04:10 ID:???
すいません、自動生成の仕方を教えてください;
>>44 ネットワークでつかえるように設定しなきゃダメよ。
localならいけるんでしょ?
暇だから、SQL Server 2008 新機能紹介 全国弾丸ツアー 2008 とやらに行こうと
思ったら、既に東京会場は満員だった orz
とりあえず追加開催に期待するか。
47 :
NAME IS NULL:2008/04/24(木) 09:28:38 ID:TQpLkKjm
>>40 >>42 データベースにユーザ追加してないんじゃないの。
Windows 認証でも Windows Server にユーザ追加しているからって
データベースにユーザ追加していなかったら接続できない。
使い始めの頃それでずいぶん悩んじゃったなぁ。
テーブルにインデックスを貼ったらSelect文の速度が
早くなったんですが、一部のSQLで逆に遅くなる現象がでました。
インデックスを貼って遅くなる原因は何が考えられるのでしょうか?
49 :
44:2008/04/24(木) 16:28:55 ID:???
>>45>>47 指摘された点を見直したら出来ました!
ありがとうございました。
>48
一部のSQLってのがUPDATEとかINSERTなら
インデックスも更新してるから遅くなることがあるかも
>>48 INDEXが効果を発揮するのって、最低でも100件以上の行があるイメージがある。
INDEXを付けたせいで遅くなる操作もいくつかあるよ。
>48
実行プランがどうなってるかチェックしたら?
使ってほしいインデックスと違うインデックスが使われたりとかね。
取得件数が全レコード数の半分とかなら
フルスキャンの方が速い
今月から仕事でSQLserverさわってるんですが
それ関連の資格を取るなら何がおすすめですか?
トラブル時に客先へ急行するためですねw
的確だなw
58 :
NAME IS NULL:2008/04/26(土) 13:04:20 ID:2E/8ALfP
サーバ側
OS:Windows Vista Home Premium
DB:SQL Server 2005 Express Edition
クライアント側
OS:Windows XP Pro
クライアント側からADO接続でVistaのSQL Serverに接続出来ません。
なんか解放する必要があるのでしょうか?
サーバー側がXPのときは接続されるけど・・・
なぜ?? ご教示を (m__m)
鯖側でADOが使えるならネットワークの設定。
デフォルトはポートが閉じられている。
XPの方は誰かが開けたんだろう。
60 :
NAME IS NULL:2008/04/26(土) 19:36:39 ID:55VyVdYl
SQL Server 2005 Enterprise Edition 180日間 限定評価版のセットアップに関する質問です。
Setup.exeを実行するとログを確認するようポップアップメッセージが表示されセットアップが中断されるのですが、
ログには特にエラーメッセージ等が出力されません。
空きハードディスク容量、必要システムのメモリとOSを確認しましたが条件を満たしていました。
どうすればインストールできるでしょうか?また、他になにか出力されるログ等ないでしょうか?
実行、エラー発生、ログ確認までの操作手順
1.SQLEVAL_JPN.EXEをダウンロード。
2.SQLEVAL_JPN.EXEを実行。解凍先に既存の c:\sql を指定。
3. C:\sql\servers を実行。
4.下記のメッセージがポップアップ表示。
---------------------------
Microsoft SQL Server 2005 セットアップ
---------------------------
SQL Server セットアップで予期しないエラーが発生しました。
詳細については、%ProgramFiles%\Microsoft SQL Server\90\Setup Bootstrap\LOG にある
セットアップの概要ログ ファイル (Summary.txt) を確認してください。
---------------------------
OK
---------------------------
5. C:\Program Files\Microsoft SQL Server\90\Setup Bootstrap\LOG\Summary.txt に下記のログを出力。
Microsoft SQL Server 2005 9.00.1399.06
==============================
OS Version : Microsoft Windows 2000 Professional Service Pack 4 (Build 2195)
Time : Sat Apr 26 19:23:53 2008
以上、よろしくお願いいたします。
61 :
NAME IS NULL:2008/04/26(土) 20:46:48 ID:Ra21+QYi
Windows 2000/XP Professional にインストールできるのは
Express/Developer だけのはずですが。
62 :
NAME IS NULL:2008/04/26(土) 20:50:51 ID:Ra21+QYi
と思ったが調べてみたら
Windows 2000 Professional Edition SP4 も動作対象に入ってるのな。
間違って記載されてるんじゃないのか、これ
WindowsInstallerを最新にしてみるとか。
Enterprise Editionをクライアント系のOSに導入するとライセンス上の制約で
いろいろ出来ないことがあるから、パンフレベルでは動作リストに載ってないことが多い。
64 :
NAME IS NULL:2008/04/27(日) 10:11:52 ID:0RcOeyfW
製品版のシステム用件にはクライアントOSははいってないんだけどね、
なぜか評価版では入ってるんだよね。
declare @rc int
select @rc = 10000
exec_next:
delete from t1 where c1 = 'a'
if @@rowcount > 0 goto exec_next
select @rc = 0
ちょっとづつ消すとか
66 :
NAME IS NULL:2008/04/29(火) 06:48:18 ID:hY5+XXEW
>>66 文字化けした場所は違うけど再現した
9.0.3159
マジで?
連休明けに会社のマシンで試してみよう。
>66
text型をレプリケーションすると
4000バイトごとに2バイト文字が境界に来ると半分\0に置き換わる現象を思い出した。
初心者ですがSQL serverはXPにインストールできますか?
無料のなら出来る
永遠無料版?それとも試用版かな?
レスサンクスです
HOMEにインストールできなかったのか
Express Edition ならできるだろ?
それ以外の Edition を HOME にインストールしたがる奴はかなり珍しいと思うが。
EEなんかで満足できるかよ
さすがにその餌じゃつれないと思うな。
the FILESTREAM Attributeについての情報は?(日本語で)
79 :
NAME IS NULL:2008/05/09(金) 11:52:45 ID:pp+XZC4e
ム板とどっちで聞こうか迷ったんですけど・・・
VB6+ADO2.8って、データベースミラーリングのフェールオーバーってサポートしていますか?
SQLServerにデータベースミラーリングを設定して、↓の接続文字列で接続してみたのですが、
切り替わりませんでした
Provider=SQLOLEDB;Data Source=sql-principa;Failover Partner=sql-mirror;Initial Catalog=mirror_test;User ID=sa;Password=test;
>>79 ProviderとしてSQL Native Client(SQLNCLI)を指定すれば大丈夫なはず。
あと注意点としてConnectionTimeoutとCommandTimeoutがデフォルトのままだと
フェールオーバーする前にタイムアウトしたりする。
81 :
ビ・泣Qイツ :2008/05/09(金) 21:05:07 ID:???
>>66 はァ?
何か問題でもあるのか?
俺は半角文字さえちゃんと扱えれば何も困らんよ
82 :
NAME IS NULL:2008/05/09(金) 21:30:24 ID:qZP+UMRS
83 :
ビ・泣Qイツ:2008/05/10(土) 01:28:19 ID:???
マイクロソフト製品は勘定系でSQL鯖を使ってしまうような
命知らずな日本人デバッガー(奴隷)により支えられています。
84 :
NAME IS NULL:2008/05/11(日) 00:43:04 ID:LC/4+jXW
質問です。
今、SQLSERVER2005の入門書を読んで、VBでデータベースを扱う簡単なアプリを
試作しています。スタンドアローン環境です。
一つのデータベースに複数のテーブルを作ったのですが、これらはファイルとしては
どこに保存されているのでしょうか?
将来別のPCに移植する場合、アプリだけでなくこのDBファイルも移動したいのですが、
実体がどこにあるのかわからず不安です。
お願いします。
c:\program files\microsoft\sql server\..\data
こんなかんじだった
86 :
79:2008/05/11(日) 10:57:20 ID:???
>>80 うまく動きました。
どうもありがとうございました。
>>66-67 MSSQL2000 に付いてきたクエリアナライザで実行したら問題なかった。
Management Studio の不具合な気がする
90 :
NAME IS NULL:2008/05/13(火) 16:56:43 ID:esOdpdnX
asp.net で表示させても問題ないから
Management Studio のバグやね。
Management Studioの日本語対応は糞すぎ
92 :
NAME IS NULL:2008/05/15(木) 16:58:56 ID:DjfxOw0v
今動いているSQLServer2005のCAL数を調べるには
どこを見ればいいですか?
CDROMメディアしかないので箱や紙ではわかりません。
93 :
NAME IS NULL:2008/05/16(金) 01:55:02 ID:fed44/a3
Reporting Servicesの構成ツールで名前付インスタンスの場合、
仮想ディレクトリを、[ホスト名$別名]で作成できません。
どうしたらいいでしょうか。。。
94 :
NAME IS NULL:2008/05/18(日) 00:26:11 ID:rZA4K5Y5
2000同士でリンクサーバしてるんですけど
リンク先のテーブルにロック掛けようとしたら
「リモート データ ソースのインデックスまたはロッキング ヒントを指定できません。」
なんてエラーが出ます
ロッキングヒントを指定できません・・・・
と言うことは、リンクサーバ経由でのテーブルロック・・・どころかロック自体無理と言うことですか?
トランザクションの中に入れちゃってるから他のパスでロックするわけに行かないし・・・
めんどくさいトランザクションのかけ方をやっと見つけ出したのに
95 :
NAME IS NULL:2008/05/18(日) 17:56:57 ID:0NqsCSCu
分散トランザクションなんて
マイクロソフトに作れるわけないじゃん。
Oracleで日付型のデータを文字列yyyymmddで取り出したい場合
select to_char(dt, 'yyyymmdd') from tt;
などとしますがSQL Serverの場合はどのようにしたらよいでしょうか?
しかしこの CONVERT のスタイルを数値で指定すると言う前近代的な仕様は
何とかならんもんかな。
せめて Excel 互換にするとかしろよ。
教えてください
javaプログラムからインサート文でデータを追加しているんですけど
追加したデータがテーブルの一番最後の行じゃなと思っていた動きができません
今のところ偶然そうなってるので問題なく気にしてなかったんですけど
というか、最後に追加されものだと疑問を抱かなかったんですけど
今日カタカナの前にアルファベットかなにかをいれると
カタカナの行の前に挿入されました
どの列のせいか分かりませんが
なにか挿入される優先順位があるのでしょうか?
>Excel 互換
ここ、笑っていいんだよね。
>>99 INSERTによる行の順番は忘れろ。
欲しい行の順番は ORDER BY 等でなんとかするのがSQL、
挿入の順番などを考えていたら、運用でつまずく。
>>102 マジですか?
ORDER BYっていうのはjavaでも使えるんですか?
そのままSQL文をjavaプログラムに書いても使えないですよね、スレ違いすみません
詳しく説明させて下さい
今オークションチックなものを作っていて
決まりははいんですけど、ID列&PS列は全部バーチャルで半角英数で登録しています
他に手動でインクリメントしていくnamber列があります
インサート時テーブルの行数を取得して、行数+1をnamber列に入れるといったものです
他に入札金額を入れるmoney列
それとインサートした時間をString型で入れる列があります
(でもこの時間はちょっと変更する可能性があります)
どの列が利いているのか分かりませんが
money列が一番金額の高い人が最後の行になるようにして入札テーブルは問題なく動いてます
でも今日他の会員登録テーブルにカタカナを入て
その後他の会員をインサートしたら、最後から2行目に挿入されました
それでインサート文は最後の行に挿入されるんじゃないことに初めて気付かされました
今まで不具合なく動いていたオークションテーブルにも
不具合が生じるじゃないかと心配になって質問しました
数字が大きい順とか何か単純な決まりはないのでしょうか?
>>103 SQLとかの前にDBっていうものを勉強したほうがいい。
ファイルじゃないんだから順序なんて存在しない。
>>103 ついでに言うなら、あなたの懸念している通り、今うまく動いているのはただ単なる偶然です。錯覚です。
不具合はおそらく出ます。心配する暇はないです。
すぐに改修したほうがいい。仕事でしてるのならね。
順序つけるのは
>>102さんの言うとおりORDER BY を使えばいい。
多分それで全てが解決はできないけどね。
>>101 >> Excel 互換
> ここ、笑っていいんだよね。
実際 Excel は無茶苦茶高機能だから、完全互換は無理だと思うが
'YYYY/MM/DD' 関連ぐらいは、サポートしてくれ。
'YYYY/MM/DD' なら、まだなんとなくわかるけど、111 だとヘルプ
見ないとさっぱりわからん。
>>103 > 他に手動でインクリメントしていくnamber列があります
> インサート時テーブルの行数を取得して、行数+1をnamber列に入れるといったものです
DB なに使ってるのか知らんけど、たいがいの DB に連番を入れる機能があるからそれ使っ
たほうがいい。その列を何に使ってるのかわからんけど、複数人がほぼ同時に入札したら
同じ番号がつくかもしれないよ。
>>104 > SQLとかの前にDBっていうものを勉強したほうがいい。
激しく同意。
まーねー、「INSERT順でデータがあるじゃん」という考え方は分かるんだけどね〜
仕事じゃないことを祈る
その時わたしは気づいたのです。
この列名が、業務のPRIMARY KEYであることに…
第1部・完
いくら待っても第二部は来ませんでした。 来ませんでした。
>>105 このレベルだと外注した方がマシだろ
それと、突っ込み所満載すぎてスルーされてるがnamberってなんだよ
103
皆さん詳しく教えていただきありがとうございました
今学校でjavaとweb3構築の勉強をしていて課題でホームページを一つ提出するのですが
そうだったんですが、偶然だったんですね
かなり落ちこみますた、勉強しますね
でも皆も妖しげなホームページなので、いや止めたほうがいいですね
提出して動かなかったら嫌ですもんね
お前、その課題は本当にDB必要なのか?w
javaでsqlserverってのもねー
mysqlとかじゃないの?
行の順番について上にあったけど、
DB作る上で列の順番はしっかり考えておいた方がいい。
一度作ってからどんどん項目を増やしていくと、
関係のある列項目が飛び飛びだったり、まぎらわしい列項目ばかりが並ぶことになる。
たぶん「正規化」で教わることだと思うけど、
今現在そういうシステムに直面して、嫌になってきた。
列の順番なんて後でいくらでも変えられるじゃん
仕様書で決まってるから、自分1人では変えられない…
久しぶりにSQL Serverをやるんだけど、もうすっかりわすれてる・・
DATENAMEで、mm出すと0埋めの二桁で、dd出すと1桁の時0埋めされない文字が
でてくるのって前からの仕様だっけ?
たとえば1月だと01のようにゼロ埋めされるけど、
1日だと1のようにゼロ埋めされない文字が帰ってくる。
103
皆さん、感謝感激雨霰です、マジ涙出そう
order by成功しました
まだテスト用プログラムでしか試してないんですけど
金額が高い順に手動で連番ふってるので使えると思います
今日一日気分悪かったけど、やっと晴れました
中間は変な並びでも、最後の入札履歴だけはちゃんと並んでる状態にできそうです
ありがとうございました
>>119 もうちょっとやり方があると思うぞ?
まず、そのテーブルでのユニークな数字は、IDENTITY属性で指定できる
わざわざ行数+1なんて入れてたら同じ数が入らないとも限らない
順序の項目を参照→
http://www.sqlpassj.org/dbe/keyword/01_01.aspx 金額が高い順に連番をふるんじゃなくて、入札(?)テーブルに
金額とユニークな商品IDを登録して、WHERE 商品ID = @商品ID ORDER BY 金額 DESCすれば
金額順に表示される。
基本的には、どのテーブルにもIDENTITY属性のID列、行が挿入されたときのInsertDateTime列、
行が更新されたときのUpdateDateTime列、行が削除されたことを表すIsDelete列を作っておけば
後にいろいろ対応できる。
とマジレスしてみる。
>>120 論理削除は色々と意見はありそう。
InsertとUpdateの更新日付をわける意味は?
>>122 論理削除は、マスタ関連なんかで参照される可能性があるけど
表示時間が長くなるから一覧には表示したくないとか、
後からわがままな要望がでてくる可能性を考慮。
Updateは同時実行制御なんかに必要で、
Insertは入力補助のために過去何日間に入力されたものの一覧を出せとか、
ある特定日に入力したものだけ一覧で出せとかを考慮して。
ああ 楽観的ロックね。
バーボン、ロックで。
113
121さんの言うとおり仕事でもないのにすみませんでした
120さんもマジレス感謝です、要らない列は省きます
ここの人達は皆親切ですね
考えることで自分の知識を整理・強化してるんだよ
ストアドプロシジャの中で変数に値を代入するのに 2つの方法があるよね
1. set を使う
2. fromやwhereのない select を使う
俺はいつも 1. で、2. を使う理由が思いつかないんだけど、2. の利点って何かある?
↑代入文の右辺に、演算子や関数のほかは定数と@変数しか出てこない場合です
>>128 表が変わっても、正しそうな値を拾ってこれる。
SQL CLRを利用すれば、そんな問題からすべて解放されるぉ
その代わり違う問題をいっぱい抱えそうだけど。
なんか不具合とかある?
SQLでもいいんだけど、.NET使えれば使えたで便利だから
ストアドでSQL CLRを使おうと思ってたんだけどさ
いや別にチャレンジングゥ〜な君を止める気はさらさらないから。
人柱よろしく。
135 :
128:2008/05/24(土) 18:20:27 ID:???
>>130 レスサンクス&解説お願いしていいですか?
表が登場しない、set でもできるし select でもできる代入を、
あえて select でやることの利点があれば知りたいです。
>>134 こういう保守的な技術者が日本の技術を悪化させてると思う
枯れた技術を使うのは基幹システムの基本
新技術をいきがって使うのは社会的に重要でないシステムにしろよ
関数でSQL CLR使ってるよ
正規表現をどうしても使いたい場合
ファイルの削除や存在チェックをする場合
WMI APIを使いたい場合
ところでSQL Server2008正式版って今年中にはでそうなの?
139 :
130:2008/05/24(土) 20:39:24 ID:???
>>135 SQL Serverは触ったことないので、単なる勘です。
Oracleのストアドプロシージャで散々な目にあったので、RDBMSで共通のSQLで表現できればそちらを採用するってだけです。
参考にならなくてごめんなさい。
Oracleはなんであんなにバグだらけなんだろう。
>>136 MS の言う新技術に何度となく裏切られてるから、導入を躊躇するのは当たり前。
いきがって導入するのは、学習能力のない奴だろ。
安定したら、検討するよ。
枯れた技術とかいいながらSQL Serverを使用している137、141は矛盾
なんでISAMとかBtrieveとか使わないの?池沼?
>>139 サンクス、了解しますた
さーて、MSDE 2000 でまた遊ぶか
>>142 技術者ってのは面倒を避けるために、適当な理由をつけて、問題を回避する傾向が強いからね
んで枯れた技術とか、最新の技術は・・とか理由をつけて言い張ってるだけだから気にすんな
でもOracleのANSI SQL対応がバグだらけなのを見ると
枯れるのを待つのはありな気もする。
ならば訊こう。枯れたの定義は?
枯れた枯れてないの定義なんて、使用する側の自己満足に過ぎないでしょ
枯れる枯れてないに関わらず、どうせ問題が発生したらメーカのせいにして責任は負わないんだから
責任を追う必要がないのに、新しい技術を導入しないのは、単にそれを導入したくないというだけの話
導入したくない理由は? それを理解していないから=技術者曰く「枯れていないから」
2chでもう枯れてるよねーという話題になったとき枯れてる。
あれこれバグ報告があるうちはやめたほうがいいね。
でもOracleはバグの回避策を掲示板等へ書き込むことすら
禁止してるからとんでもない糞
同業他社製品との比較は別スレでどうぞ。
>>142 > なんでISAMとかBtrieveとか使わないの?池沼?
枯れてりゃなんでもいいわけじゃない、必要な機能があることが前提なんだが
そんなこともいちいち説明しないのいけないのか?
まっ、反論したかっただけなんだろうけど。
>>146 枯れたかどうかなんて、自分の経験と周りの評判だよ。
>>147 みたいに責任取
らなくて済むなら、そんなの気にせずにばんばん導入するのもありだろうけど。
>>148 サポート費用稼ぎたいんだろうけどな。
サポート費用も高いし、一旦やめてから再度サポート契約しようとすると、
やめた期間の費用+α 払えとか、ほとんどヤ○ザ同然。
何この多重問い合わせ
>>144 技術者だって仕事でやってんだから金にならん仕事は手間をかけずに片付けたいのは当然だろ。
153 :
NAME IS NULL:2008/05/25(日) 20:32:17 ID:DMMLfmVY
>>138 悪いが、2008って2005と何が違うか
俺に五七五で教えてくれ
2008の売りはXML対応と、MS Officeとの親和性だったかな。
ソフトウェア開発環境展で、新バージョンの利点を説明してた。
マージ使えるってのは?
まじ
あとは圧縮バックアップとか
今日すげー嫌な汗かいたんだが、XPにSP3適用するとSQL Server 2005の
TCP/IP接続おかしかない?
W2KでテストしてたのをXP SP3に移してみたら、127.0.0.1じゃないと
Windows認証もServer認証も通らない。
SQL Serverインスコし直したら、自分自身からならプライベートIP通る
ようになったけど、他のPCからは通らない。
当然TCP/IPは有効にしたし、Expressなんでポートも1433に固定して、
Firewallも穴開けてます。
なんかすっげー怪しいぜ、というか俺の勘違いでなければ非常にヤバイ。
>158
別にそんなことおきてないよ。
SP3だけど普通に繋がってるよ。
>>158 Express = 名前つきインスタンスという意味なら、Windows のファイアウォール設定は
sqlservr.exe に対して外部からのアクセスを許可しないと通らないよ。ポートは動的にアサインされるから。
ついでに UDP 1433 もあけないとだめ。SQLBrowser にアクセスして SQL Server が何番ポートで listen してるか
問い合わせるから。
それでも駄目なら netstat -ano してちゃんと listen してるか確認するのが次のステップだな。
>>159 えんやこらやってServer認証は通るものの、Windows認証は未だ
通らず。
去年の末頃は同様の構成でつながってたのにわけからん。
ドメイン管理のない環境でWindows認証使うなという神様の言う
とおりか?
ODBCにファイルDSN使ってるシステムが動かんのも偶然であって
ほしい。
>>160 いやいや、当然そのあたりは全部確認済みですよ。
Firewall切っても動かないぐらいです。
>161
Windows認証は試してなかった、後で試してみるよ。
165 :
NAME IS NULL:2008/05/29(木) 00:25:29 ID:On8Unush
最近T-SQLに興味を持ち出したのですが、
帳票出力等のプログラムからSQLでデータを取得する場合、
テーブル値関数使うという判断はいかがなものでしょうか?
割と便利な気がしたのですが、実用した人の経験談とかも聞いてみたいなと。
自分の選択肢だと
1.ストアドでワークテーブルに加工してInsert⇒レポート側でベタSELECT
2.Viewをいくらか作ってそれを元に帳票向けに加工したSQLで取得
3.レポート側のプログラムで複数テーブル参照しまくりの力技。
4.テーブル値関数(最近知った)でそのままSELECT(xxx,xxx,xx) FROM 関数名
ほかにも方法はあると思いますが、少なくともVIEWよりはテーブル値関数のが
管理的に便利な気がして・・・
ただ、障害発生や拡張とか考えたとき、解析・コーディングに負担あったりするとか
いろいろ気になります。
気持ち的にはやってみたい気がするのですが、前例やその他経験者の少なさから
興味だけで終わりそうな予感。。。
>>163 あ、明快ですね。気がつかない俺がバカだった、サンクス
おまえら弾丸ツアーいく?
行くよ〜。
半分は息抜きだけどね。(w
このページの内容は役に立ちましたか?
1 2 3 4 5
非常に低い 非常に高い
170 :
NAME IS NULL:2008/06/01(日) 00:47:25 ID:AcT0qzva
>165
テーブル値関数で実装したが、今のところ特に問題ないよ
やってることは1.ストアドでワークテーブル〜 みたいなもん
ただ、where条件は中に入れないと、データ件数にもよるけど、
パフォーマンスが悪くなってしまう
×select aaa,bbb from t_func(111,222) where ccc=333
○select aaa,bbb from t_func(111,222,333)
それと、Access2003からテーブルリンクできなかったと思う
SQLServer2008CPT2月版さわってるんだがManagementStudioでSQL書いたらインテリセンスが利いて驚いたぜ。
172 :
NAME IS NULL:2008/06/02(月) 16:17:24 ID:gBCGUa8J
>>171 T-SQLのデバッグできるようになった?>ManagementStudio
自分は当分インストできねーーー
ブレークポイント設定したり1行ずつ実行したり変数に何が入ってるか確認できたりってことでは
ストアド?
あと再帰なんかも途中の結果を見たい時がある。
弾丸ツアーで聞いてみようかな。
177 :
165:2008/06/03(火) 23:13:34 ID:5E6/z6Zz
>170
>×select aaa,bbb from t_func(111,222) where ccc=333
>○select aaa,bbb from t_func(111,222,333)
確かに、関数化の意味なさそうですねw
ためしに速度とか試してみようかなぁ・・・
ありがとうございます。
>それと、Access2003からテーブルリンクできなかったと思う
なるほど。。。ちょっと痛いかも・・・
178 :
NAME IS NULL:2008/06/04(水) 01:16:27 ID:U14zGNqi
JavaからPreparedStatementを使用してSQLを実行した時、
バインド変数を使うと使わない時と比べて圧倒的に
処理速度が低下します。(0.1秒→180秒くらいの差が出る)
この現象の原因としては何が考えられるでしょうか?
また、バインド変数の有無で処理速度が変わる所までは
突き止めましたが、これ以上の原因の切り分け方が有れば
教えてもらえないでしょうか。
よろしくお願いします。
>>178 そんなに差が出るものかな?特別なケースの特別な現象かもしれないよ。
回答が欲しいなら、JDBC、OS、DBMSの種類とバージョン、
それから検証が出来るくらいのプログラムソースは示すものだ。
180 :
NAME IS NULL:2008/06/04(水) 12:17:26 ID:pUXBCNvj
SQL-Server2005Express + IISの場合って、ライセンス要るの?
>>180 CAL関連の話は複雑なので代理店に確認して欲しい。
SQLServer Express自体の接続に制限はないがOSのライセンスに制限される。
IISはOSにバンドルされているのでこれもOSのライセンスに制限される。
Client OSの場合ピアツーピアに限られるので定型的なアプリとしては使用できない。
Server OSの場合、IIS上のアプリが匿名ではなく認証を使用する場合
CALやプロセッサライセンスが必要になる。
Server OSで匿名接続の場合はOSの価格だけで構築可能。
182 :
NAME IS NULL:2008/06/04(水) 14:45:15 ID:pUXBCNvj
>181 サンクス
Server OSで匿名接続の場合はOSの価格だけで構築可能。
です。
183 :
NAME IS NULL:2008/06/06(金) 22:03:02 ID:oUKZsqUS
SP3はまだか?
2005今だにバグだらけで使い物にならないんだけど…
>>178 俺は同じ現象の経験あるな。
とりあえずSQL晒せ。
>178
むやみにインデックスを付けていてバインド変数を使ったときのクエリに対する実行プランが
使って欲しくないインデックスを使った実行プランになったりという感じかなと思う。
特にバインド変数を使うとクエリが同じだから悪い実行プランが使い回されて何度やっても同じ状態という感じになるかと。
スペースの有無くらいの違いで違うクエリ扱いされて違う実行プランが使われると突然応答が良くなったりすることもある。
sp_updatestatsを実行して様子を見てみたり、
WITH(INDEX())とかしてインデックスを指定したりOPTION FORCE ORDERとかやってみれば収まるかもしれない。
それにわざと違うインデックスとか指定してみて同じくらいの応答時間になるインデックスを探してみたりとかしてみたりするよ。
プロファイラで見ると使って欲しいインデックスを使って検索していたときに比べてReadの数が妙に多かったりする。
186 :
178:2008/06/12(木) 00:19:28 ID:z6+fGzza
確認が遅れてすいません。環境は以下のとおりです。
SQLJDBC1.0.809.102
WindowsServer2003 SP2
SQLServer2005
[SQL]
SELECT *
FROM TBL1 A,
(SELECT DISTINCT child1, child2
FROM TBL1
WHERE (parent2 >= '1000000000' AND parent2 <= '2000000000')
) B
WHERE (A.child1 = B.child1 AND A.child2 = B.child2)
AND A.parent2=A.child2
上記SQLは1秒以下で実行されますが、
列parent2の1000000000、2000000000をバインド変数にした時は
200秒近く掛かってしまいます。
また、parent2とchild2はそれぞれインデックスが張られています。
他にも出すべき情報がありましたら教えてください。
よろしくお願いします。
Distinctと*をやめれ
あとはparent2 >= '1000000000' AND parent2 <= '2000000000'をBetweenにかえろ。
>186
同じクエリをManagementStudioで実行プランを表示で実行してみろよ。
バインド変数を使った方のクエリはプロファイラに表示されたクエリをそのままコピって
ManagementStudioで実行して同じように長時間かかる場合が再現すると状況を確認できるよ。
大抵素直に再現してくれるよ。
多分違う実行プランが表示される気がする。
>188
BETWEENは>=と<=に展開されて実行されているんだよ……
多分差がでることはないよ。
1. parent2にクラスタ化インデックスを作る
2. (child1,child2)でハッシュインデックスを作る
3. 結合方法をJoin句に変える
というのはどうなのでしょう?
ADO.NetからSQL-Server2000を使用しています。
ストアドプロシージャに関して質問させてください。
DataAdapter の InsertCommand 用にデータを挿入するストアドプロシージャ Insert1
を作成しました。Insert1 ではストアド Proc2 を呼び出しています。
Proc2 内で select を実行すると呼び出しもとの DataAdapter にその結果セットが
帰ってくるのですが、これを Insert1 で受け取って破棄するにはどうすればいいの
でしょうか。
コードで書くとこんな感じです。
Create Procudure Proc1 as begin
exec proc2 -- ここでproc2の結果セットを破棄したい。
end
Create Procudure Proc2 as begin
-- 何か処理して処理後の結果を返す
select * from table1
end
環境は
VisualStudio 2005 Pro(VB.Net)
SQL-Server 2000 Ent です。
よろしくお願いします。
>>186 これは実行プランを比べてみないとわからないね。
ポイントになりそうところは
parent2 >= '1000000000' AND parent2 <= '2000000000'
がおおよそどのくらいヒットするかという点。案外件数が少なくない?
parent2 >= ? AND parent2 <= ? としてしまうとオプティマイザは
どのくらいヒットしそうか予測できないので最適化の判断を誤る可能性がある。
仮にネストしたループにプランされてしまっていたら大幅に遅くなるよね。
つまりAに対して1レコードずつ判定を繰り返す。
SELECT * FROM TBL1 A
WHERE A.parent2 = A.child2
AND EXISTS (
SELECT * FROM TBL1 B
WHERE A.child1 = B.child1 AND A.child2 = B.child2
AND parent2 >= ? AND parent2 <= ?)
このSQLはイメージでこれを実行しても別の最適化がされる可能性があるので注意。
>191
SQLServerだとBETWEENは展開されるから変わらない。
INが大量のORに展開されてたりもするね。
一般的な話ではBETWEENの方が効率がよくなるのを期待していいはずなのでその情報は間違ってないと思うよ。
20年前ならいざ知らず、最近のSQLパーサーは賢いから
小細工せずに素直に書いたSQLのほうが最適化されやすいよね
まあね。
最後は結局実行プランとにらめっこすることになるね。
プランが不安定になるのはテーブルや制約索引の設計がいい加減なケースが多い。
安易にヒントに逃げないでその辺を見直すのが先決。
上のお題では child2単独の索引をやめてchild2, child1 (順番大事)の複合で索引を作る。
もしTBL1にプライマリーキーがなければ適切なものをつける。
この2つでだいぶ改善するはず。
カバードインデックスにする手もある。
create index TBL_IX2 on TBL1 (child2, child1, parent2)
MSSQL2005以降なら付加列インデックスが利用できる。
create index TBL_IX2 on TBL1 (child2, child1) include(parent2)
child2, child1でユニークというわけではないので付加列インデックスにする意味はないな。
はじめのパターンのプラン
|--Filter(WHERE:(...
|--Nested Loops(Inner Join, OUTER REFERENCES:...
|--Nested Loops(Inner Join, OUTER REFERENCES:...
| |--Sort(DISTINCT ORDER BY:...
| | |--Clustered Index Scan(OBJECT:....
| |--Index Seek(OBJECT:...
|--Clustered Index Seek(OBJECT...
改良版のプラン
|--Nested Loops(Inner Join, OUTER REFERENCES:...
|--Stream Aggregate(GROUP BY:...
| |--Index Scan(OBJECT:...
|--Index Seek(OBJECT...
Sortがなくなってだいぶすっきりした。
>child2, child1 (順番大事)の複合で索引を作る
と書いたが順番は関係なかったので訂正。
parent2の単独索引も不要。
質問しっぱなしで逃げるとかどういう神経してんだ
>>192 テーブル変数か一時表で呼び元に返してやればいいんでないか
203 :
NAME IS NULL:2008/06/14(土) 01:48:48 ID:19RmXNyg
2000 STD なのですが質問させてください。
最初のインストール時にはCAL10人分で始めたのですが、ユーザー数が増えたため
追加購入した場合どのように10人から10プラスアルファに変更できるのでしょうか
再インストールしなくてもエンタープライズマネージャから変更可能だと思いますが
解決法が見つかりませんでした。
よろしくお願いいたします。
なんでライセンスを購入したところに聞かないの?
>>201 死ぬほど忙しくなってインターネットをやる時間すらなくなってしまったんじゃないかな?
ストアドプロシージャで、xml型のパラメータ受け取ってsp_xml_preparedocumentで
展開してから一括でINSERTしてましたが、存在チェックしてからINSERTする必要が
出てきたので、展開されたテーブルの1レコード毎にチェックしたいのですが、
どのようにすべきでしょうか?
>>206 何の存在をチェック?
NOT INじゃダメなのか?
一意制約違反を起こしたらrollbackすればいい
209 :
206:2008/06/16(月) 08:54:16 ID:YabEVWOQ
やりたいのは一意制約違反の無い行のみ追加したいのですが、
ロールバックすると全てキャンセルしちゃうから1行ごとに
チェックするしかないのかなぁと…
210 :
206:2008/06/16(月) 10:24:40 ID:YabEVWOQ
カーソルを使って思った処理が出来そうです。
失礼しました。
211 :
178:2008/06/19(木) 00:44:01 ID:VBzYbTdU
多くの回答を頂いたにも関わらず御礼も言えないままで申し訳ないです。
実行プランを出してみましたが、ご指摘の通りバインド変数の
有無で大きく内容が異なりました。
バインド変数有りの場合、無しと比べて実行プランの長さが倍ほどになり、
IndexScanという処理が2回程現れます。(無しでは1回も現れません)
頂いたアドバイスを一つ一つ試したいのですが、週末からプロジェクトの
方が慌しくなり、あまり手が付けられていません。
落ち着いたらまた経過を報告させて頂きたいと思います。
ご回答頂いた皆様、どうもありがとうございました。
212 :
NAME IS NULL:2008/06/21(土) 20:03:15 ID:xziLRgkp
MERGE早く使いたい!! (2008から入るらしいが・・・)
SQLServer2005上で↓を効率よく実現する方法教えて!
※参考(
ttp://www.shift-the-oracle.com/sql/merge.html)
MERGE INTO USER_MASTER
USING (
SELECT
'0099' "USER_ID",
'入力した名前' "USER_NAME",
'0010' "DEPT_NO"
FROM DUAL
) phantom
ON (USER_MASTER.USER_ID = phantom.USER_ID)
-- または
-- USING DUAL ON (USER_MASTER.USER_ID = '0099')
--
-- 既存レコードの更新
WHEN MATCHED THEN
UPDATE SET
USER_NAME = USER_NAME || '(更新)',
MODIFIED_ON = SYSDATE
-- 新規レコードの作成
WHEN NOT MATCHED THEN
INSERT
( USER_ID, USER_NAME, DEPT_NO )
VALUES
(phantom.USER_ID, -- or '0099'
phantom.USER_NAME,-- or '入力した名前'
phantom.DEPT_NO ) -- or '0010'
このソフトを熟知している方が多そうなので、
こちらにて質問させて下さい。駆け出しのネットワーク管理者をやっております。
パケットをキャプチャしているとICMP及びTCP接続パケットを大量に他NWに
投げている端末がありまして、確認するとsqlblowser.exeがTCP接続の原因の様なのです。
SQLServerを使用した事が無いのですが、
このアプリはICMPを投げた後にTCP接続するような動作をデフォルトで行うのでしょうか?
214 :
NAME IS NULL:2008/06/23(月) 21:11:08 ID:AOnhapfM
すんません。あげておきます…
215 :
NAME IS NULL:2008/06/24(火) 13:53:50 ID:BT1PbFhk
>>213 SQL Server 構成マネージャ > SQL Server 2005 のサービス
で SQL Server Browser 立ち上がってない?
#多分それでは無いかと・・・
>>213 SQL Server Browserは、ご近所のSQL Serverを探して一覧を作成するのが
お仕事なので、可能性はあるが、キャプチャまでしたことない。
止め方は
>>215のところで止めれば良いので、一度やってみては。
217 :
213:2008/06/24(火) 21:57:30 ID:BwCyEnPQ
>>215,216
お二方共、有力な情報ありがとう御座います。
さっそく明日に該当サービスを停止しても業務に支障が無いか確認致します。
ありがとう御座いました。
>>217 SQL Server Browser ってクライアントからのアクセスを
受け付ける役割もあるので、問題の端末がサーバ用途の場合、
サービスは止められないかもです。
パケットを投げるのがまずいのであれば、サービスを止める代わりに
アウトバウンド通信をブロックするとかどうですか?
>>218 Oracleのリスナーと違ってアクセスを受け取る役割はないような。
可変ポートにしてない限りはいらない。
IA64で性能でねぇ。。。
221 :
218:2008/06/25(水) 08:32:16 ID:???
>>219 ずっと勘違いしてましたorz
ありがと。
222 :
NAME IS NULL:2008/06/25(水) 09:34:24 ID:D8c5ROxn
>>219 クライアント:ポート:1434へアクセス(UDP)
SQLSV:->TCP/IP ポートまたは名前付きパイプを返す
クライアント:->返された、TCP/IP ポートまたは名前付きパイプでアクセス ですか
#まぁHelpを嫁ということですね
#このあたりは2008で変わるような記述をどこかで見たような
#>Oracleのリスナー
#昔だとfork() だろうけど、今は何だろう?
223 :
NAME IS NULL:2008/06/25(水) 18:51:50 ID:JWkEO9dM
sql server2000でトランザクションログから更新sql全文を取得することはできますか?
oracleだとlogminerのような機能があるけど
海外のサードパーティ系ツールであるそうだが標準ではないっす。
ログは物理操作だけで論理操作を記録しないこともあるから、
全部は取れないのではないかと思う。
225 :
NAME IS NULL:2008/06/26(木) 20:01:18 ID:SvFJj1W/
>>224 ありがとです
サードパーティ系ツール名がわかれば教えてタモレ
どういう用途に使いたいのか次第だろうけど、
プロファイラでクエリを全部取得するのじゃ駄目なんでしょうか?
一気に大量に来ると溢れるけどね。
>>225 自分が知っている範囲では、Log ExplorerとかSQL Log Rescueとかかな。
229 :
NAME IS NULL:2008/07/02(水) 10:15:03 ID:h4L3xO4O
SQL Server2008で空間系の検証を行っています。
が、どうも空間インデックスが効いていないような感じです。
同じような境遇の方いらっしゃいますか?
数十万件のGeometry型を含むテーブルに対して、
次のようなクエリーを実行させると20秒程かかりかなり遅いと感じています。
>SELECT Geom.STAsText() FROM SpatialTable with(INDEX = SpatialIndex) WHERE Geom.STIntersects(@Data) = 1
実際に吐き出されるレコードは数件です。
@Data はPOINT()からSTBuffer()して作成したポリゴンです。
空間インデックスは作成出来たので期待していたのですが、
いざ実行プランを見てみると通常のクラスタ化インデックスが使用されていました。
そこで FROM句 に with(INDEX = SpatialIndex) でインデックスを名指ししたところ、
次のエラーが出ました。
メッセージ 8635、レベル 16、状態 9
クエリ プロセッサは空間インデックス ヒントを含むクエリのクエリ プランを作成できませんでした。
理由: 必要なバイナリ空間メソッドが条件に見つかりませんでした。インデックス ヒントの削除または SET FORCEPLAN の削除を試行してください。
意味がよくわかりません。
実はインデックスの中身が出来ていないのでは、なんて思っています。
SQLの知識は乏しいので八方ふさがりになっています。
何かヒント等ありましたコメントください。
>>229 ダーティリードというのはそういうもので、知らぬ奴が馬鹿だ。
リンク先のような事例ではMSSQL2005以降のSNAPSHOT分離レベルを使えということになる。
NOLOCKヒントがREAD UNCOMIITTEDと同じダーティリードとわかってない人は多そうだな。
つまり自身もロックをかけないし他のトランザクションのかけたロックも無視する。
コミット前のデータは見えるし、削除してコミットしてないデータは既になくなってるように見える。
インテントロックもかからないから、UPDATEやDELETE/INSERTでレコード物理位置が動いた場合は
両方見えることも両方見えないこともありえる。
NOLOCKヒントをはずせば解決だよん。
234 :
NAME IS NULL:2008/07/02(水) 23:25:06 ID:faA08Ceq
>>223 個別にDELETE/INSERTした場合はともかく、
「UPDATEでレコード物理位置が動いた場合に
両方見えることも両方見えないこともありえる。」
本当にこれがダーティリードの正しい実装ですか?
他のDBMSでも同様の実装がなされているのでしょうか?
>>234 > 本当にこれがダーティリードの正しい実装ですか?
ダーティリードだからね
そこはDBMS依存だろう。
read uncommittedなんて管理用にアバウトな件数を数えるときに使う程度だよ。
それ以外で使ったのは、dual表作ったときくらい。
fromなしselectが使えないクライアントソフトがあったんで作った。
create view dbo.dual as
select top 1 'x' as x from sys.objects with (NOLOCK)
ところでダーティリードの規格ってあるのかな?
ANSIで決まってたりしてないよな。
viewにする意味もnolockにする意味もわからない
COMMIT前のデータが見えるという仕様のみで、
実装方式により予期せぬ結果が返ってくるかどうかまでは
既定されてなさそうですね。
実表をdualにした場合にダミーデータを消したり2件以上にしたりしたときのダメージが大きい。
sys.objectsを使うのはsqlseverに必ずある表で必ず1件以上データが存在し
常に参照されているためキャッシュされている確立が高い。
nolockを使うのは単に共有ロックのオーバーヘッドさえ避けたいため。
とにかく1件取れればよい。
241 :
NAME IS NULL:2008/07/04(金) 00:04:35 ID:HGacSGIp
2008のRC0が出たばかりですがRC1ってのが次に出るの?
>>240 どうしてもviewにしたいなら
create view dbo.dual as
select 'x' as x
でいいじゃん。
クライアントの仕様はともかくddl文にもfrom句必須って訳じゃあるまい
>>242 それもやったのよ(笑
クライアントソフトは何やってたのだろうね。それもエラーになってた。
SP2以降に見つかったバグが既に500件以上あるんだって
早くSP3出しとくれ。
以下の条件文@(あるSQLの一部分)を、
A〜Bの何れかに代えてクエリアナライザ等で実行した場合、
Cの場合のみ応答時間が低下する現象が発生しておりますが、
どのような原因が考えられるでしょうか?
アドバイス等ありましたらお願いします。
@ where pk1 = '11111'
A where pk1 = cast('11111' as char)
B where pk1 = cast('11111' as varchar)
C where pk1 = cast('11111' as varchar(8000))
なぜ varchar(8000)にキャストするかというと、
JDBCのPreparedStatement#setStringにてバインド変数を使用した場合に、
JDBCドライバの内部的には上記Cに近いSQLに展開されるためです。
バインド変数の使用によって性能低下が発生したことがきっかけで、
その後に切り分けを実施した結果、上記Cでの性能低下に行き着いた
次第です。
pk1は、主キーの第一項目で char(5)です。
実行プランは@〜Cで完全に同一です。
OS: Windows 2000 Server SP4
DB: SQL Server 2000 SP4
JDBC: SQL Server 2005 JDBC Driver 1.2
Java: JDK 1.4
>245
似たようなことだが、C#で空文字をパラメータで渡すとvarchar(8000)に展開されて仰け反ったけど、
別に遅くなってる様子がなかったので気にしてなかったよ。
247 :
NAME IS NULL:2008/07/19(土) 17:19:16 ID:ORteGkYE
SELECT tbl1.aaa, tbl2.bbb
FROM tbl1
INNER JOIN tbl2
ON tbl1.ccc = tbl2.ccc
WHERE tbl1.ddd = ○○○
AND tbl2.eee = ×××
っていう書き方がなんか嫌いで、いつも
SELECT t1.aaa, t2.bbb
FROM (SELECT * FROM tbl1 WHERE ddd = ○○○) t1
INNER JOIN (SELECT * FROM tbl2 WHERE eee = ×××) t2
ON t1.ccc = t2.ccc
みたいな書き方してしまう。このほうが(俺は)頭の中でわかりやすい。
でもやっぱ最初のSQLのほうが断然速そうに見えるんだが実際どうなんだろう?
(最近はWHERE条件がない場合でも下の書き方をする癖がついてしまった。。。)
>>247 実際のところは実行プランを見ないとわからないが、
普通はその辺の書き方でプランに差は出ない。
どちらかのテーブルのCCCに索引があればどちらのSQLでもほぼ一定のプランになるはず。
両方のCCCに索引がない場合はSQLの書き方や統計情報にプランが
影響されやすくなるので差が出るかもしれない。
て言うか、わざわざ書き換えるほど下の方がわかりやすいとは思えない。
1人でやってるなら、好きに書けばいいけど、その SQL を他の人がメンテ
する可能性があるなら、一般的な書き方をするべきだと思うよ。
>>247 SQLに限らないが特殊なコーディング規約に慣れすぎるのは、
一般的や規約のコードに対する読解力が相対的に低下する
ことになるのでは?
きっと他のプロジェクトメンバは迷惑してるよ。
俺のプロジェクトでやるやつがいたら書き直しだな。
1つのSQLがあたりまえに数千行規模の場合、
期待しない実行プランになるリスクも高くなりそう。
数千行規模のクエリとかどれだけ予想外な実行プランが走るか怖くて見たくないぞ。
> 1つのSQLがあたりまえに数千行規模の場合、
ネタかバカのどっちかだろ。
253 :
247:2008/07/19(土) 23:34:54 ID:???
みなさんご意見ありがとうございました。
ちなみに実際のコーディングでは下のような感じで書いてます。
こうするとクエリアナライザで個々のSQLが実行しやすいので。
SELECT t1.aaa
, t2.bbb
FROM (
SELECT *
FROM tbl1
WHERE ddd = ○○○
) t1
INNER JOIN (
SELECT *
FROM tbl2
WHERE eee = ×××
) t2
ON t1.ccc = t2.ccc
今後実行速度等の比較をしてみます。
あと社内のメンバーにも意見を聞いてみようと思います。。。
前スペースって消えてしまうんですね。もう一回貼ります。
(スレ汚してスマン。。。)
>SELECT t1.aaa
> , t2.bbb
> FROM (
> SELECT *
> FROM tbl1
> WHERE ddd = ○○○
> ) t1
> INNER JOIN (
> SELECT *
> FROM tbl2
> WHERE eee = ×××
> ) t2
> ON t1.ccc = t2.ccc
>>251 実業務のSQLが長くなるのは理由がある。
レコードあたりのフィールドの数がやたら多い。
select のフィールドのリストは縦に書くことが多い。select * は原則禁止。
(ここまでは仕方ない)
プログラム側にキャッシュできるような変更のない小さなマスターまで結合したがる。
(リザルトセットを直接利用するコントロールや帳票ツールのせいというのもある。)
外部キー関係がいい加減でやたら外部結合が必要。気が付くとcoalesceやdistinctを使いまくり。
サブクエリーにまでselect * は禁止!を守ってしまうアホがいる。
これを守れば一千行に手が届くようなSQLが出来上がる。
× ネタかバカのどっちかだろ。
○ ネタかバカかアホのどれかだろ。
>>255 概ねその通りだが外部結合のところがよくわかりません。
外部キー使うと外部結合が不要になるの?
抜けのあるキーと結合するとなると内部結合ではデータが欠ける。
重複のあるキーと結合するとデータがだぶる。
参照整合性でその問題は発生しなくなる。
実際に物理的な制約をかけるかどうかは別にしてシステムとして
その辺の整合性を保障をしないと結合なんて使えませんがな。
抜けのあるキーは別にして、キーがダブるって...
どんなレベルの奴が設計してるんだよ。
既に大量のデータが存在するテーブルにクラスタ化インデックスを付けた場合、
インデックスの作成やデータの並べ替えなどが行われるのはCREATE CLUSTERED INDEX文を
実行した時ですか?それとも実行自体はすぐに終わってバッググラウンドで処理が継続されてる
んですかね?
(DROP_EXISTINGオプションが関係してくるのかな?)
完了するまで戻ってこない。
他のプログラムからいじってもテーブルロックがかかって操作できないはず。
クラスタ索引の再編や付け直しはメインリーフページを再配置するから時間がかかる。
ケースによってはクラスタ索引なしという選択も悪くない。
新しい職場で2005のMSDN版みたいな奴を初めていじったんだが
インストール手順書にメモリのチューニングがあった
みんなこれいじってる?
訂正
MSDN→MSDE
2Gや4Gの壁なら突破してるけど
メモリのチューニングってどれのことだよ
>>264 どこいじったのかよくわからんが
キャッシュの設定があった
フルテキストインデックスなんですが
Like '%AAA%' と contains(カラム,'*AAA*') とでは
取得件数に大きな違いがあります
Like '%AAA%' と contains(カラム,'*AAA*') は
同じではないのですかね?
Like検索が遅いので、初めて全文検索を使ってみましたがよくわかりません orz
SELECT * FROM HOGE WHERE HOGE1 > 100 AND HOGE2 < 200
といったSQLで引かれるテーブルがある場合
インデックスは
HOGE1とHOGE2別々につけたほうがいいですか?
ひとつのインデックスとしてHOGE1, HOGE2でいいですか?
>>267 フルテキストはあらかじめ文章を単語に分解してそれを検索するイメージなので、
通常そこでは区切らないだろうような辞書にない単語や普通じゃない固有名詞などは
ヒットしない可能性が高い。
DBに登録してからフルテキスト検索にヒットするようになるまでタイムラグがある。
Linkと一致しないといってクライアントや上司(たよりにならね〜)がバグだと言い出すので、
開発や導入前にどういうものかよく説明しておく必要がある。
SQLサーバーのは単語や類似語の登録が出来なかったように思うので、
企業内システムには割りと使いにくい。
(このへんは余り自信がない、出来るのかもしれない)
>>268 別々につけても片方しか使われない。
複合キーした場合は2つ目は索引としては使われないが、
カバードインデックスとしての効果は出る。
SQL server 2005 Service Pack2のセキュリティ更新プログラム(KB948109)だけ
何度再実行してもインストールされません。コード2B08ってのが出て、
問題のトラブルシューティングとかいうのも見てみたのですが、原因が全くわかりま
せんでした。種類が重要になってるので凄く気になります。どうすればいいんでしょうか?
OSはVistaです。ここのスレを教えてもらったスレで名前を2バイトじゃないもの
にした方がいいかもしれないというようなアドバイスを頂いて、ユーザーアカウント名を
半角英数字のものにしましたがやっぱりダメでした・・・
>>271 > OSはVistaです。ここのスレを教えてもらったスレで名前を2バイトじゃないもの
> にした方がいいかもしれないというようなアドバイスを頂いて、ユーザーアカウント名を
> 半角英数字のものにしましたがやっぱりダメでした・・・
ユーザーアカウントだけ?
コンピュータ名はどうなっているかな?
あと、コンピュータ名を半角の大文字で入力した方がいいはず。
(今回の件とは直接関係ないけど、念のため)
昨日からExpress Editionで使い始めました。質問させてください。
テーブルにデータを入れるときは全て手動なんでしょうか?
csvファイルとかから読み込んで入れたいんですけど、そういう機能はないのでしょうか。
調べてもわかりませんでした。お願いします。
>>273 DB右クリック>ウィザードで行けたような気
でも、型の推測がバカなので注意。
275 :
bcp:2008/07/24(木) 22:33:43 ID:???
どうせ調べてないんだろ。
ググッた単語書いてみなよ。
>>275 273です。
ありがとうございます。
しかし、Error = [Microsoft][SQL Native Client]サーバーへの接続確立時にエラーが発生しまし
た。接続先が SQL Server 2005 である場合は、既定の設定では SQL Server がリモート
接続を許可していないことが原因である可能性があります。
というエラーが出て結局ダメでした。
ここを見てこの通りにやってもみたけどダメでした。
http://support.microsoft.com/kb/914277/ja 残念です。
>>274 Express Edition2008では「ウィザード」っていうコマンドが見当たりませんでした。
がんばって探したのですが。
なにしろウィザードだからな
279 :
NAME IS NULL:2008/07/25(金) 20:59:22 ID:zcVwMyen
>>277 ネタ? ちゃんと読んで、書いてある手順通りやんないと駄目だよ
#ちゃんとsql server 再起動してるよね?
>>Express Edition
には接続ウィザードないよ。
tool->データエースへの接続で mdf 直接指定じゃ無かったかな
ちゃんと調べなさい(もしくは書籍の立ち読み)
#Express ずいぶん使ってないから 覚えてないw
csvファイルの取り込みは DTSWizard.exe で探してクレイ
#なんかのバージョンで入っているらしい
#自分は、dev版使ってるからどれを入れればいいかわかんね>express
初めてさわるんなら、まず情報収集しなよ
どうでもいいテストデータを少量入れる時、
Excelで作ってコピー>テーブルを開いてペーストとかやるな。
とんでもなく時間かかるからアレだがw100件未満推奨。
なんか情報が錯綜しているんで、ちょっとまとめてみる。
> 昨日からExpress Editionで使い始めました。質問させてください。
> テーブルにデータを入れるときは全て手動なんでしょうか?
> csvファイルとかから読み込んで入れたいんですけど、そういう機能はないのでしょうか。
> 調べてもわかりませんでした。お願いします。
BCPというコマンドラインツールがあるから、これでテキストファイルのインポート/エクスポートが可能。
使い方としては、CSVファイルをインポートする場合
bcp データベース名.所有者.テーブル名 in CSVファイル名 -S.\SQLEXPRESS -T -t , -c
CSVファイルとしてエクスポートする場合
bcp データベース名.所有者.テーブル名 out CSVファイル名 -S.\SQLEXPRESS -T -t , -c
※詳しい使い方は、BCP /?入力するか、オンラインマニュアルを参照。
あと、Express Edition使っているんだったら、マイクロソフトダウンロードセンターから
Microsoft SQL Server Management Studio Expressをダウンロードしてインストールした方がいいよ。
ttp://www.microsoft.com/downloads/details.aspx?familyid=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&displaylang=ja
Express Editionでいちばん使い勝手がいいのはIBM DB2だよ。
あれは全部そろってる上に、そのまま業務に使える。
Express EditionなんてDB2に無いぞ
DB2 Express-C がそれです。
285 :
bcp:2008/07/28(月) 21:35:32 ID:???
>>282 使い勝手などは人に依存する部分も多いので、一番とか根拠の
無いことを言う奴は宣伝と思っていいかな?
いいですよ。私は”青い”血が流れているので
ここで聞いて良いのかわからんのだが
VS2008のDVDでVSインストールしたら
一緒にSQLSERVER2005EXPRESSもインストールされたんだが
Microsoft SQL Server Management Studioがインストールされなかった
これは個別にインストールしろってことなのか?
>287
ExpressEditionを使うなら別に入れる。
DeveloperEditionとか使うならVisualStudioのインストールオプションから削って最初から入れないでおく。
>>288 トンクス
VS2008Pro版だったんだが
初めてのインストールなので戸惑った
290 :
287:2008/08/01(金) 13:25:01 ID:???
本体からSQLEXPRESSを削除して
MSDNのSQL2005を入れたら
全部入ってくれたわ
いつの間にかXPでもSQLSERVERが動くようになったのね
はじめからExpressとDeveloperEditionはXPでの動作は保証されている。
正規版はXPで動作するがライセンス上ほぼスタンドアロンでしか使用できない。
期間限定のお試し版はサーバー限定でXPはインストールできない。
確かこんなだったはず。MSDNのってDeveloer版じゃない?
292 :
NAME IS NULL:2008/08/01(金) 14:40:48 ID:+ktCTmOk
>MSDNのってDeveloer版じゃない?
たぶん そのはず
293 :
291:2008/08/01(金) 17:52:04 ID:???
確かにDev版でしたわ
ところで諸兄に質問
郵便局が発行してる郵便番号データのKEN_ALLってやつを
SQL2005のマネージメントスタジオでSQL2005にインポートすると失敗する
SQL2000のエンタープライズマネージャでMSDE2000相手にインポートだと成功するんだけど
これはうちだけなのかな?
初心者丸出しの質問で申し訳ないのですが・・・
SQL Server 2005 EXPRESS が入っているサーバー間で
ミラーリングができないものかと思案中なんだけど
ググってもEXPRESSはミラーリングやフェイル・オーバー・クラスタ
とか構築できないという情報だけなんだが
やはり、EXPRESSエディション同士のサーバー間で
ミラーリングを構築することは不可能なのだろうか???
実際にExpress同士でミラーリングができる環境の構築に
成功している人がいたらアドバイスをお願いしたいのです・・・
297 :
NAME IS NULL:2008/08/04(月) 13:53:37 ID:3h5OcO5t
>>295 MSDNに無いって書いてあるから、だめなんじゃない?
298 :
294:2008/08/04(月) 14:26:15 ID:???
299 :
bcp:2008/08/04(月) 23:28:26 ID:???
>>295 不可能に決まってるだろ。
まじめな話し、エンジン部分の大きな違いはミラーリング/クラスタと
サイズ (プロセサの個数とかも含む) の制限だけなんだから、Express
でミラーリングなんかサポートしたらバカ高い Standard や Enterprise
Edition なんかを買う奴がかなり減るだろ。
>>272 亀レスで申し訳ありません。インストール出来ました!!!
本当にありがとうございます。コンピューター名を半角の大文字にしたら
あっさりとインストール出来ちゃいました・・・本当に不思議ですね。
301 :
295:2008/08/05(火) 14:21:24 ID:???
>297
>299
そのようですね^^;
とりあえず今回はトリガを用いて
DB(A)のテーブルの変化をDB(B)と同期させるように
するつもりです。
トリガ作るのがものっそい面倒なんで
ミラーリングができねーかなーなんて思ったのがきっかけでした。
ありがとうございました。
302 :
bcp:2008/08/06(水) 00:26:56 ID:???
何でそんなことしたいのか知らんけど、仕事なら普通に
Standard Edition 買うのを勧める。
趣味なら、心置きなく楽しんでくれ。
データ同期がしたいならログ配布っぽい仕組みにチャレンジした方がまだ現実的かも。
リアルタイムは無理だけどさ。
トリガ使ってのミラーリングはやってる。
安定動作するまですごく大変だったよ。間違いなくお勧めしない。
ミラーリングって一見簡単設定っぽいけど、一歩間違うと復旧させるの大変だろ?
ちょっとSQLかじった程度じゃ、トラぶった時、手に負えなくなるのが関の山。
306 :
bcp:2008/08/07(木) 22:47:38 ID:???
そりゃミラーリング (=運用) と SQL (=開発) じゃあ、求められるスキルは違うだろうよ。
Aというテーブルにデータが追加されたらBにも追加するというトリガ(after)があるとする。
Aでエラーが起きたらトリガは起動しない。
Bでエラーが起きたらAの追加もロールバックされる。
後者のBでエラーが起きてもAにはデータを入れておきたい場合はどのような手段がありますか?
Bにエラーをさせないようによく言い聞かせておく
309 :
307:2008/08/08(金) 11:59:06 ID:???
>>308 解決しました。ありがとうございました。
ワラタ
Oracle→SQL Serverに移行するんだけど
MSから出てるツールはどうなの?
データに完全に差分が出ないのなら使いたい
あと、複数のDBがあって、全TBLをまとめて同時に移行できる?
>>311 自分でゴリゴリバッチ書けばいいじゃん
313 :
NAME IS NULL:2008/08/12(火) 04:18:53 ID:ejoHNrE8
CREATE LOGIN したときの
DEFAULT_DATABASE は
どうやったら確認できますかね?
SQL Server 2000で、datetime型の列の規定値を
データのupdate時の日時に設定することは出来ますか?
MySQLでいうところの
default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
みたいなことをしたいのです。
列の規定値の定義方法をご教示いただきたく。
GETDATE()をデフォルトに指定しろ。
ユーザーが勝手にDBに接続してくる・・・。Windows認証だと防げない・・・。
>>316 ユーザーが勝手にDBに接続しなきゃ、データ見れないだろw
318 :
NAME IS NULL:2008/08/13(水) 05:05:32 ID:9W/6/zwG
SQL Server 2005のデータベースのデータ型の設定で
nvarchar(255)にしていADO.net経由で書き込みすると、文字列データまたはバイナリ データが切り捨てられます。
というエラーが返ってくるのは何故でしょう?
書き込むデータは半角やら全角やら混ぜたものなんですが・・・。
>>315 d
INSERT時のデフォルトはそれで良さそうなんですが、
UPDATE時に変更はされないですよね?
>>318 エラーメッセージを正確に記載するのが良いとオモ。
つかADO.NETのスレの方が良くない?
320 :
NAME IS NULL:2008/08/13(水) 08:20:28 ID:4+Qu872F
>>317 うんまあそうなんだけどユーザーが無許可で作ったアプリケーションかスクリプトで
接続してくるのを防げないかな。
>>318 SqlParameterのサイズかデータタイプが間違っている可能性もあるな。
その部分をさらせ。
324 :
NAME IS NULL:2008/08/14(木) 01:08:19 ID:m4R6Ogem
>>319 >>320 >>322 遅くなりました。
あれからテーブルやDataSetを作りなおしたり、
色々試していたらちゃんと登録されるようになりました。
結局、根本の原因がわかっていないので
少し怖いのですがとりあえず解決ってことで・・。
325 :
NAME IS NULL:2008/08/14(木) 07:39:13 ID:1s/mhNXs
Expressのダウンロードページは入り口のバナーだけ2008になっているけど、
なかにはいると2005のままだな。
>>323 SQL認証の方が危ないだろ。
>>321 SQL Server Management Studioで、[セキュリティ]−[ログイン]で当該ユーザーに対して、
適切なアクセス権を設定すればいいと思うけど。
>>326 同一のクライアント端末で、あるプログラムからの接続は許可し、それ以外のプログラム
からの接続は拒否する。これをWindows認証でどういうアクセス権を設定すれば
実現できるの?
そもそも、Aというプログラムで見せるのはよくて、Bというプログラムで見せるのはダメというのが間違いなんじゃない?
というか、元発言者の意味が不明。
接続と一言で言っても、SQLの管理権限なのかデータベース単位の書き込み権限なのかテーブルの読み取り権限なのかさっぱりわからないじゃないか。
前提がわからなきゃ、Windows認証もSQL Server認証もへったくれもない。
326だけど、「無許可で作ったプロシジャ」と勘違いしていた。
>>326は無かったことに。 m(_ _)m ペコリ
>>330 各ユーザーにAdministrator権限が設定されていて、
SQL Serverに接続できてしまうというオチだったりして。
333 :
326:2008/08/14(木) 14:31:46 ID:???
>>330 2層システムでのDB単位の読み書き削除権限だと思うが。
ていうかAは自分で書いたもので、Bは悪意を持った内部の
ユーザーが書いたものと言えば理解できるのか?
>>334 なんかこれが正解っぽいけど、ADO.NETで自動コード生成できなくね?
ていうか別にこれならSQL Server認証でも同じじゃね?
質問です。かなり困ってます。携帯からなので改行変だったらすいません。
SQL SERVER 2005 を使ってローカルサーバーのデータベースに接続してるんだけど
データベースの名前を変更してしまったので
SQL SERVER自体にログインできなくなりました。
コマンドプロンプト上で元の名前に戻すことは可能でしょうか。
コマンドプロンプト上じゃなくても何でもいいです。
3時間調べたのにサッパリわかりません。
誰か助けて下さい。お願いします。
339 :
初心者:2008/08/14(木) 21:00:35 ID:vu4PdX5p
すみません。SQLサーバーの本をよみはじめてものなんですが
ストアドで、AS まえ(ヘッダー)に変数を定義するものと、AS以降の中で
変数を定義するものの使い方の違いはなにがあるか教えてください
>333
接続元のアプリから接続文字列のアプリ名を入れちゃえば好きなようにアプリ名を設定できるわけだが。
既存のアプリと同じアプリ名を名乗られてアウトになると思うよ。
>>337 コマンドプロンプトからだったら、osqlコマンドがあるからシステム管理者でログインして
ALTER DATABASEでデータベース名変更。
あと、デタッチして新しいデータベース名でアタッチする方法もあるか。
というより、Management Studioでシステム管理者として接続してGUIで変更した方が早いけど。
システム管理者の権限があれば(データベースの名前を変えても)SQL Serverに接続できると
思うけど、何をどうしたの?
windows認証にこだわる理由が分からんな
>>342 Active Directoryと統合できるじゃん。(=パスワードポリシー等も統合できる)
あと、SQL Server 2005では改善されたけど、SQL Server 2000まではアカウントポリシーも
設定できなかったし。
余程、レガシーなアプリケーションを使っていない限り、Windows認証を使うべきだと思うけど。
管理面倒だからWindows認証使わせてないけど
>>341 ありがとうございます。
ローカルサーバーにAという名前のデータベースがあったのですが、間違えて名前をBに変えてしまいました。
そしたらSQL SERVERに接続出来なくなりました。
Aという名前で接続してたときと同じログイン名とパスワードを使用したら
localhostに接続出来ません。ユーザーの既定のデータベースを開けません。
ログインに失敗しました。ユーザー"(ユーザー名です)" はログイン出来ませんでした。
microsoft SQL server エラー4064
というエラーが出ました。
そのAというデータベースは違うユーザー権限で作成してありますが
ずっとシステム管理者の権限で接続していました。
マイクロソフトサポートのページを参考に下記をコマンドプロンプトで試しました。
sqlcmd -S InstanceName -d master -U SQLLogin -P Password
注 : InstanceName には、接続先の SQL Server 2005 インスタンスの名前が入ります。SQLLogin には、既定のデータベースが削除されている SQL Server ログイン名が入ります。Password には、SQL Server ログインのパスワードが入ります。
3. sqlcmd プロンプトで次の行を入力し、Enter キーを押します。
ALTER LOGIN SQLLogin WITH DEFAULT_DATABASE = AvailDBName(←ここをデータベースBに変更)
注 : AvailDBName には、SQL Server ログインでアクセスできる、そのインスタンス内の既存のデータベースの名前が入ります。
4. sqlcmd プロンプトで GO と入力し、Enter キーを押します。
これを試してBというデータベースに接続(?)はできたのですが名前の変え方が分かりません・・。
この方法自体が間違っているのでしょうか。
Management Studioでの変更の方法の方が簡単ならそちらのがいいのですが
詳しく教えていただけないでしょうか。長文すいません。
>>345 Management Studioにシステム管理者の権限(sa、もしくはAdministrator権限)を持ったユーザーで接続して、
[データベース]ツリーを展開して、当該のデータベースで右クリックして[名前の変更]を
実行するだけだけど。
あと、名前を変更した後、[セキュリティ]−[ログイン]のプロパティで[規定のデータベース]の
変更するのを忘れないようにね。
ちなみにクエリーでの変更方法は以下の通り。
alter database 旧データベース名 modify name = 新データベース名
>>346 >>347 SQL SERVER自体(むしろDBそのものを)全然使ったことがないのでManagement Studioは触ったこともなく・・
なので347の方法でやった方が簡単っぽいですね。なんとなくですが。
コマンドプロンプトで
alter database 旧データベース名 modify name = 新データベース名
と打てばいいのでしょうか。
その前に345で書いた(4. sqlcmd プロンプトで GO と入力し、Enter キーを押します。 )
までを実行した後に alter database 旧データベース名 modify name = 新データベース名 を打てばいいのでしょうか。
馬鹿な質問を何度もすいません。
348ですがマネージメントスタジオでデータベースを変えていました。。どうしよう。
350 :
NAME IS NULL:2008/08/15(金) 10:12:50 ID:XhgDq30d
>>349 何をどう変えたのか 落ち着いて書かないと、だれも反応出来ないぞ
>>343 マイクロソフトの宣伝文句そのままやんけ
352 :
NAME IS NULL:2008/08/16(土) 04:42:24 ID:tVj6/05A
353 :
bcp:2008/08/16(土) 07:33:06 ID:???
まあ、SP2 + その後の修正モジュールまで出てるのに、
バグフィックス "0" はないわな。
ただ、2000 より酷いか?
おれは、2000 の方が相当酷かったと思うが。
ACCESSのMDBにエクスポート、インポートでエラー出まくりという時点で2000以下。
355 :
NAME IS NULL:2008/08/16(土) 11:08:23 ID:tVj6/05A
>354
それのせいでACCESSほとんど使わなくなったなぁ。
>354
やっぱあれって2005の不具合だったんだ…
使用メモリ増えたら普通に落ちるしな
358 :
NAME IS NULL:2008/08/17(日) 19:45:03 ID:SfEuPb5O
SQL SERVER 7.0 を使用してテープバックアップとファイルバックを
行っていたのですが、テープドライブを交換した後にオンラインバックアップが
機能せずにDBの応答が止まるようになりました。
テープでのバックアップはもちろん、ファイルでのバックアップの時でさえ
DBへアクセスできなくなります。バックアップが終了するとDBへアクセスできます。
所謂、アクティブオンラインバックアップが機能していないと思われますが、
設定で元に戻すことは可能でしょうか?
何か改善する良い方法はありませんでしょうか?
2005から2008にバージョンアップする際の、機能の比較表等は
Microsoftから出されてたりするでしょうか。
バージョンアップの際のチェックリストを作成するにあたって、
比較対象となる資料を探していますがなかなか出てこないので…
2005からのマイナーチェンジ版という位置づけであれば、
単に移行した中身の確認で済みそうですが…何か注意するポイントはありますか?
長分で申し訳ありませんがご教授ください。
初心者の質問ですが、もしも知っている方がいたら教えてください。
sql server 2005 developer edition って、テストか運用かという概念的な制限が
あるだけで、物理的な制限はまったくないのでしょうか?
たとえば「○人以上がアクセスしに行くと読めなくなる」とか。
ないよ。EEと同じ。
テーブル定義書をさっくり出力してくれるツールってないもんかのお。
できればカラムの備考なんかも出力してくれるとうれしいんだが
>>361 じゃあ、社内や身内で使うシステムなんかだと、こっそり
Developer使っている所もありそうだな。
あと弱小レンタルサーバ業者とか。
ねえよ。
>363
Visioでテーブル定義を管理してそこからマクロで出力できたりしないかと
頑張ってみたけどマクロから取得できない部分が結構あったり
設定がちょっと変わったりするといろいろデフォルト値とか飛んだりして細かい融通が利かなくて中途半端で使えなかった。
結局直接DBを読み込んで好みのフォーマットのxlsに出力できるツールを自前で作って使ってる。
>>363 ObjectBrowser ER4ってそんな機能なかったっけ?
>>364 実装評価中ですと言えば使えるなw>Dev
>>366 あれ? Visioでデータベースのリバースエンジニアリングでできなかった?
>>366 なるほどのお。俺も結局自分で書くことにした。
とりあえず必要なデータを取得するとこまでできた。
まあがんばってみるわ。さんくす
372 :
bcp:2008/08/22(金) 22:51:02 ID:???
>>370 できるお。
ただ、各カラムの備考まででたっけ?
373 :
366:2008/08/23(土) 00:24:34 ID:???
>370
出来るんだけどマクロで備考とか外部キーとか取り出せなかったと思うよ。あまりにも中途半端だった。
これを元にテーブルに対応したクラスのソースを自動生成とかしたかったのに。
てっきり全部取り出せるものかと思って少ないサンプルをいろいろ試したけど時間の無駄だった。
ストアドの結果をカーソルで取得することって
できるでしょうか?
イメージ的には下記なのですが・・・
DECLARE curHoge CURSOR FOR
EXEC sp_hoge
>>374 INSERT INTO hoge EXEC sp_hoge
みたいに、ストアドプロシージャの結果を既存のテーブルにINSERTした後で
カーソルを使って読み込むってのはどう?
DBから定義書出すなら
CSEって言うツール(ベクターとかにある)を使うと良いかも
ちょっと古くておもにOracle用に作ってあるんだが
SQLSERVERにもODBC接続できる
EXCELに定義書が出力されて
肩とかがちょっと違う名前で出されるんだけどその辺は手作業で修正
>>378 ありがと!
有償のパッケージソフトでExpressを使ってるのが多いんだけど、
例えば Search Server とかだと4GBってすぐいっちゃうんだよね。
毎度CPUライセンス買うのも何だし、CALはもっと高いし…。
380 :
NAME IS NULL:2008/08/26(火) 23:19:07 ID:WgF1x9pf
2008入れたらうまく動かなくてアンインストールしたらVSとの連携が破壊された
って聞いてからびびって人柱の報告待ちでつ
>>382 サンクス
てか他の言語だとx86とx64に別れてるな・・・
なにやってんだMSJapan
セーフモードで起動しているときにSQL Serverのフォルダ名を変えてしまい、
通常起動したら接続できなくなってしまいました。
後でフォルダ名を元に戻したのですがそれでも接続できず・・。
こういう場合修復する方法はあるでしょうか?
サービスは上がってんのか?
>>385 SQL Serverが起動できていないのなら、イベントビューアのシステムログに記録されているはず。
>>386にも書かれているけど、まずSQL Serverのサービスが起動しているか確認すべき。
SQL Serverが起動しているかしていないかで、今後の対応が変わってくるから、
とりあえずは、その辺りを確認してみて。
388 :
NAME IS NULL:2008/08/28(木) 09:41:38 ID:qu30JBOu
2008 Express インストした人に質問
Management Studio Express からもストアドのdebugできるようになった?
#クライアントの部分入れ替えようかな・・・と
#いま テスト環境作れなくって
389 :
385:2008/08/28(木) 12:07:34 ID:???
イベントビューアを見てみたら、サービス固有エラー 17058で停止してました。
「サービスとアプリケーション」から起動させて見ましたがやはり同じエラーで
とまってしまいました。
MSのHPには"ログ ファイル '%s' を開けませんでした。"という意味みたいですが
・・・再インストールしたほうがいいのかなぁ。
>>389 どのログファイルが開けないの?
これだと、システムデータベースのログかユーザーデータベースのログか判らないから。
SQL Serverのエラーログは、
C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG\ERRORLOG
にエラーログが記録されていると思うから参照してみて。
SQL Serverの起動オプションでなんとかなる場合もあるから。
もし再インストールするのなら、ユーザーデータベースの*.mdfと*.ldfだけはコピーしておいてね。
後でアタッチすれば戻るはずだから。(ただ、ログファイルが開けませんでした、というメッセージが気になるけど)
391 :
NAME IS NULL:2008/08/28(木) 23:53:49 ID:xlOS+FEs
SQL Server 2005 Developer Editionを使用しています。
社内サーバー(Windows2003server)に、複数ユーザーの環境(DB)が同居
しており、その為インスタンスを増やしております。
サーバー内のDB(名前付インスタンス:SQLEXPRESS)に自分のPCから
ManagementStudioでアクセスすると、「リモート接続が許可されていない」
というエラーになります。
ただし、既定のインスタンスのDBへは特に問題なくアクセスできます。
設定内容は以下の通りです。どなたか対処方法を教えてください。
・サーバー名:IP→接続可/IP\SQLEXPRESS→接続不可
・SQLBrowser→サービス開始
・ネットワーク構成:TCP/IP→有効化済
・全てのインスタンスにおいて「ローカル接続およびリモート接続」を選択
しており、「TCP/IPおよび名前付パイプを使用する」も選択しています。
393 :
385:2008/08/29(金) 18:09:34 ID:???
>>390 ありがとう。そのあたりを調べてみます。
自分はUDP1434決め打ちじゃなくて sqlbrowser.exe を例外に追加してる
2008には前みたいな専用の管理ツールついてないのかな。
Express入れたはいいけど管理ツールがついてなくて弄れない。
VS2008からまあ触れるんだけど、ManagementStudioの2008版ってExpressにはないのかな?
SQLServer2005で検索のSQLを流すと検索結果件数がほぼ同じ150件程度なのに
XXX Like '%aaa%' and XXX Like '%bbb%' と
XXX Like '%ccc%' and XXX Like '%eee%' では (aaa bbb ccc ddd は説明上として)
検索の時間に大きな差がでてしまう orz
原因がわからない orz
10倍近く時間がかかるけど
>>398 それ以前に'%aaa%'みたいな書き方だとインデックスが効かないからね。
前回に実行したレコードの結果がキャッシュにあったからとか。
Like検索は遅いよね
フルテキストインデックスもいまいち使えないし
ナマズ検索とか入れてみようかな?
>>401 前方一致ならインデックスが効くから速いんだけどね。
後方一致でも、REVERSE関数でインデックスを効かせるという裏技もあるんだけど、
中間一致はインデックスが効かないから。
TechEDでPassJのBoFに参加したんだけど、SQL Server 2008のフルテキストインデックスは
なんとか使い物になるらしいけど、どうなんだろ?
403 :
NAME IS NULL:2008/09/03(水) 23:34:07 ID:rUAiPbPY
SP2の累積更新パッケージってもう10までいってるんだな。
どんだけバグってるんだよ。SP2以降のバグまとめサイトとかないのか?
>>403 いっそのこと2008にしてしまうっていうのはどうだ?
累積バグはほぼ解決されているだろうし。
SQL Server 2005 Compact Edition って、リモートPCからアクセスできますか?
406 :
NAME IS NULL:2008/09/04(木) 21:38:19 ID:m0oEq6NU
>404
新規機能以外は安定動作すると信じたいが、
2008はジャーバージョンUPなんだからSP1が出るまでは様子見だろ
>>406 そんな事言ってたらいつまでたっても使えないorz
>>406 つか、実際にはマイナーバージョンアップみたいなもんだから大丈夫じゃね?
新機能以外は。
409 :
bcp:2008/09/06(土) 17:12:24 ID:???
>>405 なんで Compact Edition なの?
どなたか、WindowsVistaで無料で使えるSQLServerを教えてください(MS)
EnterpriseManagerがあるもので><
SQL2005のあたりでしょうけど
411 :
NAME IS NULL:2008/09/06(土) 20:55:29 ID:TEM3Zsb9
ExpressEditionは? SQL Server Management Studio しかないけどね
2000までじゃないのかな?>EnterpriseManager
412 :
NAME IS NULL:2008/09/06(土) 21:57:48 ID:izhmgg+/
あ、レスありがとうございます
ExpressEdition SP2と
SSMSEE SP2とで、なんとかEnterpriseManagerの代用はできるみたいです
SP2=Vistaでも使える
今から、データーベースなどを入れて動くかどうか試します(*´ω`)
2008でもある
414 :
NAME IS NULL:2008/09/07(日) 00:13:58 ID:8QjXdBnk
SQLServer Management Studioには
Server2000の無償版のような、SQLServer エージェントの機能はないんでしょうか?
別の方法でエージェント機能が使えるならそちらでもいいのですが;;
何から何までここで聞く気か?
416 :
NAME IS NULL:2008/09/07(日) 01:36:13 ID:8QjXdBnk
すみません
なにやらVistaでSQLServer2000が動くと言っている人がいるのですが
実際、動かすことできるんでしょうか?
私の経験ではできなかった気がするのですが・・・(´・ω・`)
その話が
>>414 の質問とどう繋がるんだよ。
私の経験とか言うな
418 :
NAME IS NULL:2008/09/07(日) 03:06:30 ID:8QjXdBnk
>>417 ?|ω・`) 落ち着いて下さい
皆様助言ありがとうございます。無事アプリケーションを動かす事ができました
私が414でいったことは
SQLServer2005/2008 ExpressEditionにはSQLServer Agenは付属しておらず
別途、この機能をあくまでも無料の範囲で実現できるものかとお伺いした所存でございます
Developerを買えと煽られればそれまでの所でございますが
無償版で、詰まるところお金を使わずにどこまでいけるものなのかという話でした
結局、5000円程度払えばすむ話だったのもありますが
SQLServer2000を入れることで解決しました(Vistaでも強制的に入れれる模様)
これから、同じ事を考える人のために一応お書きしました
尚、SQLServer2000は やはりセキュリティー面で脆弱な為
不安な方は2008 Developer版をお勧めします。
皆様ありがとうございました
落ち着いてくださいにわろた
420 :
NAME IS NULL:2008/09/07(日) 09:31:57 ID:qU/73or3
EX版は機能制限が多いからしょうがないね
仕事で使うなら、後々のこと考えると2005/2008で評価しとかないと と思う
#大きなお世話w
そもそもエージェントの機能って使うかや?
自動メンテとか、ミラーリングの監視とか。
ほとんどOSのタスクスケジューラで代用できるから、
そのためだけに2000を使うとか馬(ry
423 :
NAME IS NULL:2008/09/07(日) 20:15:16 ID:s+5Pmz84
SQL Server2000をPCに入れたいんですが、どうしたらよいでしょうか?
あるソフトを起動させたいのですが、そのソフトはNET Framework1.1とSQL Serverを入れないといけないらしいです。
どなたか解説してくれる人はいませんでしょうか??
すいません初心者なんで
ソフト名伏せてちゃどんな設定で入れたいのかわかんねえよ。
そのソフトの導入手順書読めよ。
425 :
NAME IS NULL:2008/09/07(日) 20:26:50 ID:s+5Pmz84
すいません
AISっていうソフトです。
そのソフトの導入手順書には
SQL Server2000(ver8.00.760以上)をインストールしてくださいとしか書いてありません
DBとAISは別のPCに入れるの?
持ってるSQL ServerはStandard?
AISって何するソフト?
もしふつうのパッケージソフトでなければ当然誰もわからんからベンダに
聞くか、お仕事だったら情報システム部にでも聞いたほうがいいよ。
SQL Server入れるだけならインストーラ動かすだけなので特に難しい
ところはない。つまるとすればサービスアカウントと認証モードのあたり
だが、こればっかりは手順書に指定がないのならAISとやらを作った
ベンダにしかわからない。
427 :
bcp:2008/09/07(日) 22:41:19 ID:???
> ver8.00.760以上
SQL-Server 2000 入れて、SP3 以上 (最新は SP4 かな?) を当てればいい。
つーか、
>>426 も書いてる通りその導入手順書書いた所に問い合わせた方がいい。
エンプラ2000とMSDE2000で
スケジュールバックアップやってたんだけど
同じ機能って2005にもある?
スタジオじゃそれらしい項目見あたらなかったんだが
オレオレ略語でまくしたてる人ってきもいな。
430 :
NAME IS NULL:2008/09/09(火) 09:35:26 ID:/zqMJM+Y
SQLエージェントがなければWindowsタスクを使えばいいじゃないか。
ところで、日立って何でもかんでもJP1を勧めてくるの?
必要な人には必要なんだろうけど、SQL Serverのエージェントで十分だと思うんだが。
JP1は監視中のログファイルをつかみっぱなしにするので
ログファイルを一定サイズとかでリネームしたりして
切り替えていくことが出来なくて困った記憶が。
今でもログは肥大化し続けているというか…
すまん、教えてくれ。
おまえらエージェントって何に使ってんだ?
434 :
NAME IS NULL:2008/09/11(木) 10:15:31 ID:P/HcnLlc
時間指定でバッチを流す場合じゃない?
#使ったことないけどw
ストアドで質問です。
動的にテーブルを作成する。
ストアドが作りたいのですが、できません。
仕様はあるファイルからテーブルの列、型、文字数を取得して、
ストアドにパラメータを渡して自動的にテーブルを作成するプログラムです。
問題は列の数は(1〜n)で可変です。
ストアドに渡すパラメータは可変にすることは出来るのでしょうか?
例
EXEC CreateTable ’項目(配列)’ ’文字数(配列)’ ’型名(配列)’
見たいにできませんか?
>>396 返事遅くなって申し訳ない。
IP制限で全然入れなくて・・・
それで早速それを入れてみたんだけど、管理ツールらしきもののインストールが見つからなかった。
レプリケーションとかに関してや、ヘルプがどうとかはあったんだけど。
インストール関係の専用ウィンドウがでるけど
その左ペインにあるインストールの項目を選んでも、本体のインストールかレプリケーション自体しか項目がなかった。
一体どれが管理ツールなのかな・・・
>>437 Management Studioというのは見つからなかったかい?
このSQL Serverを自宅のパソコンで少し勉強してみたいのですが、
XPで無償版をインストールして勉強だけはできるのでしょうか?
勉強できるかどうか勉強しろ
441 :
bcp:2008/09/12(金) 21:30:15 ID:???
無償なんだから入れてみればいいのに...。
上にも誰か書いてたように認証モードとか辺りでつまづくかもしれない
けど、それも勉強のうちだ。
どうしてもわからんならやったことと結果をきちんとこのスレに書けば、
誰かが助けてくれる... かも知れない。
442 :
NAME IS NULL:2008/09/13(土) 14:58:12 ID:PTrJ4U+T
普通に使う分にはいいんじゃ無い
後は赤本かビギナーズガイド見ればいいんじゃないかな?
#2008版はまだ出てないけどね
自宅のパソコン 2台の一方(XP Pro)にSQL Server、
もう一方(Vista)にManagement Studioを入れたんだけど
SQL Server認証でならログインできるのに
Windows認証でできない。
どこを設定すればいいのでしょうか?
444 :
443:2008/09/13(土) 19:14:02 ID:???
自己解決
新しいログインで「NT AUTHORITY\NETWORK」を作った。
両方のパソコンに同じアカウントを作るだけじゃダメなのか・・・
スレ汚しスマソ。
445 :
NAME IS NULL:2008/09/14(日) 00:09:51 ID:6q39VD8B
>>442 2008の本はもう出版されています。
情報遅すぎ。
何コイツ(笑)
詳しい方、教えてください。
例えば、
INSERT INTO 高額商品表 SELECT DISTINCT 商品名 FROM 価格表 WHERE 単価 >= 10000
みたいな感じで複数レコードを抽出して高額商品テーブルに挿入したいのですが、
高額商品テーブルの商品名列に一意制約指定しています。
一意制約違反とならないレコードのみ高額商品テーブルに挿入するためのSQLは
どのように書けばよろしいでしょうか?
>>447 商品名が一意制約ってのはどうかとは思うが、、、
INSERT INTO 高額商品表
SELECT DISTINCT 商品名
FROM 価格表
WHERE 単価 >= 10000
AND 商品名 NOT IN(SELECT 商品名 FROM 高額商品表)
>>447 同一の商品名で、顧客ごとに価格が変わる事はよくあることだと思うので、
DB設計者に一言確認した方がいいと思う。
エラーが出なくなったからおk、
コンパイル通ったからおk、
みたいな人いるよなー。
早速の回答ありがとうございます。
例では単純に書いてしまったのですが、実際は1レコード単位で商品名列が
3つに分割されています。
商品名1、商品名2、商品名3で商品名3がユニーク列です。
この場合に、商品名1〜3と単価を高額商品表に挿入する場合は、どのように
書けばよいでしょうか?
>>451 >>447の例もそうなんだけどさ、
テーブルである必要性がわからん。
単価が固定であればビュー、可変ならストアドで充分じゃね?
可変で別にSELECTしたいってんなら、テーブル関数ってのもあるし。
なんでテーブル?
抽出された高額商品表をマスタ的な使い方します。
高額商品表に抽出されたレコードに各種情報を付加し、
価格表のレコードを付加情報を付けた状態にアップデートしたいのです。
>>453 その一連の流れの中で飲み使うのであれば、
ストアド内でテーブル変数使ったほうが楽じゃないかな?
ちょっとは自分で考えろよ。危うい感じがするなー。
ていうか、付加情報を別テーブルにして高額商品ビューと結合とかすればいいやん。
456 :
bcp:2008/09/14(日) 23:58:53 ID:???
俺も危うい感じがするなぁ〜。
そもそも
> 一意制約違反とならないレコードのみ高額商品テーブルに挿入するためのSQLは
で、違反となる奴はホントに処理しなくていいんか?
なんか、マジで
>>450 みたいに思ってそうで怖い。
制約違反となるものは最初1件とか条件があるんだと思うよ。
INSERT,SELECT文 一発では行わず、
カーソル付きSELECT文で対象レコードを取得して
WHILEループで制約違反にならないように
INSERTしていくという方法もあるよ。
そうです、最初の一件目で制約違反で止まります。
カーソルについて勉強してみます。どうもありがとう。
VB2008+SQL Server 2005 Express を使用して業務アプリを開発しています。
サーバーなどはたてずに、mdfファイルは配布しようとしています。
その場合、Management Studioなどでmdfの中身(ストアドなど)を参照する事が可能だと
思うのですが、それをできないようにする方法はあるでしょうか?
開発者以外にはストアドを参照させたくないのです。
よろしくお願い致します。
>>459 >サーバーなどはたてずに、mdfファイルは配布しようとしています。
これってcompactになるんじゃないの?
っつ〜かAccessをぶち込んでも変わらない気がするんだけど、パスワードかけておけばいいのでは?
…ただどっちにしてもReflector for .NETで気合い入れて見ていけばわかるというオチがw
SQL Server 2008のManagement Studioで、2005にはあった、
利用状況モニター>プロセスによるロックってどこにいったの?
>>460 回答ありがとうございます!
>これってcompactになるんじゃないの?
すみません、ストアド資産を流用したかったのでcompactにしてないです(^_^;
パスワードはデータベースに対して設定することができるのでしょうか?
できるのであればとりあえずそれで対処したいのですが…
まさか寝てないよな?
書き逃げか?(^.^)
GUIDを格納するカラムに、初期値を設定したいのですが、マネージメントスタジオで
何を入力すれば良いのでしょうか?
データ型がuniqueidentifierのカラムの「規定値またはバインド」にどう設定したら、
初期値を00000000-0000-0000-0000-000000000000に出来るのでしょうか?
SQLServer2005でCSVファイルをインポートしたいのですが、
エラー発生時にロールバックしないようにするにはどうすればいいのでしょうか?
('00000000-0000-0000-0000-000000000000')でした
質問させてください。
↓こんなストアド作ったんですけど、ほとんどは正常な値で帰ってくるけど、30回に一回ぐらい
全然違う値で帰ってきます。。。ちなみにデータ量が多いときほど顕著になる気がします。
ストアド@で一時テーブル作って、EXEで別のストアドA呼んで、元のストアド@で作った一時テーブルに処理結果を格納。
格納されたデータをストアド@で加工して結果を返す
毎回間違ったデータが帰ってくればいいんだけどたまに違う結果が出るってどういうことしょうか?
よろしくお願いします。
質問の仕方からして駄目だな。
471 :
469:2008/09/24(水) 02:13:46 ID:???
ストアドの内容がかなり間違っていました。
1.ストアド@で一時テーブルを作ってデータも格納
2.別のストアドA呼んで、元のストアド@で作った一時テーブルに対してカーソルを定義し、データを操作
して結果を@に返す
3.ストアド@に帰ってきたデータを加工して最終的なデータができる
1.で作ったテーブルの件数が少ないとうまくいくようです。
たまに誤った結果が返るってことは領域の問題なんでしょうか?
質問の仕方からして駄目だな。
再現性のあるミニマムのソースを出すのが早いよ
474 :
469:2008/09/24(水) 21:12:52 ID:???
質問の仕方が悪かったですね。
今日いろいろ解析して、何とか解決しました。
2.のカーソル操作ではレコードが日時順に並んでいなければいけないのに
1.のテーブル作成で明示的にORDER BYを記述していないため、レコードの並び
順が保障されていなかったのが原因のようです。日時順のデータだったのでその
まま使っても問題ないと思っていたのが間違いのようです。
475 :
NAME IS NULL:2008/09/26(金) 10:15:51 ID:cv9ybFuz
>2.のカーソル操作ではレコードが日時順に並んでいなければいけないのに
使うときにsortしないか?
> 1.のテーブル作成で明示的にORDER BYを記述していないため、レコードの並び
> 順が保障されていなかったのが原因のようです。
テーブル作成時にORDER BY指定しても、読み込み時にソート順は保障されないぞ。
※SQL Server 6.5では保障されていたが、SQL Server 7.0以降で保障されなくなった。
477 :
NAME IS NULL:2008/09/27(土) 05:56:49 ID:4wGR4Hje
×テーブル作成
○カーソル定義
478 :
469:2008/09/27(土) 11:38:49 ID:???
説明が間違えていました!
2のカーソル定義時にソートすることによって解決しました。
SQL-Server 2000使ってます。
DBのバックアップのダイアログで、中断のラジオボタンの下二つ、
[トランザクション ログ]と[ファイルとグループ]がDisableになっているんですが、
これはどういった条件でなるんでしょうか?
トランザクション ログのバックアップを取りたいんですけど・・・。
完全バックアップは取ったの?
SQL Server2000使用です。
row_nunberを使用するSQLを教えていただいたのですが、
当方2000のため、row_numberが使用できませんでした。
以下のSQLを2000で使用したいのですが、方法はありますでしょうか?
状況としては。
各ペットにはペットCDが割り振られています。
この時、各自の持っているペットCDがTOP2で取得したいです。
上記に対して、返答を頂いたSQLです。
SELECT 名前, ペットCD FROM (
SELECT row_number() over (partition by 名前 order by ペットCD)
seq, 名前, ペットCD FROM テーブル名
) x
WHERE (seq <= 2)
テンポラリテーブル作ってそこにインクリメントキーのついた列を追加
ってので俺は回避したな
>>480 レスありがとうございます。
>完全バックアップは取ったの?
取ってないです。
完全バックアップの実行とラジオボタンのDisableが
関係あるということでしょうか?
485 :
NAME IS NULL:2008/09/30(火) 21:37:35 ID:K5B3Tyx1
すいません、質問です。。
SQLSERVER2005のバックアップDBを、2000に復元することは無理ですか?
なんか復元途中にエラーが出るんですが・・・
データを移す目的だったらSSISとか使えばー。
487 :
NAME IS NULL:2008/09/30(火) 23:09:52 ID:GcTkZg0G
SQLServer2005 Expressで質問です。
ASP.NETからDB参照するプログラムで使用しているのですが
一定時間DBにクエリが発行されていない状態で
クエリ発行を行うと
イベントID:17401
重要度:10
メッセージ
%d 秒間のアイドル状態の後、サーバーの実行が再開されました。
サーバーはユーザー操作により起動されました。
このメッセージは情報提供だけを目的としています。ユーザー操作は不要です。
というログがイベントログに出力され、クエリの結果が返ってこず
エラーになってしまいます。
SQLServerには休むことなく、常に起動して仕事を行ってほしいんですが
なにか設定をすればこの現象は防げるのでしょうか。
【環境】
・サーバ
Windows2003 ServerR2
・DB
SQLServer2005 Express SP2
・ASP.NET
VisualStudio2005で作成したモジュール
488 :
bcp:2008/10/01(水) 00:07:51 ID:???
日本語読めないのか?
「このメッセージは情報提供だけを目的としています。ユーザー操作は不要です。」って
書いてあるだろ、エラーじゃねーよ。
クエリの結果が返らんのはお前のバグだろ、ちゃんと見直せよ。
>>484 レスおくれてすみません。
状況的に直ちに確認することはできなくなってしまったのですが、
参考になりました。試してみます。ありがとうございました。
採番テーブルを使った採番処理を SQL Server の中に仕込む必要に迫られました。
支店コード毎に採番したく、利用する側からは、F_採番(支店コード) という風にできるかな?と思い
F_採番()なるストアドファンクションを作ってみましたが、その中ではテーブルのUPDATEは出来ないとのこと。
ストアドプロシージャならば出来るのですが、
INSERT INTO 伝票(支店コード,伝票番号) SELECT 支店コード,F_採番(支店コード) FROM 元ネタ;
みたいな芸当(一括登録とか)が出来そうにありません。
カーソルこさえて回すしかないのでしょうか。
>>491 > ストアドプロシージャならば出来るのですが、
> INSERT INTO 伝票(支店コード,伝票番号) SELECT 支店コード,F_採番(支店コード) FROM 元ネタ;
> みたいな芸当(一括登録とか)が出来そうにありません。
あれ?それで出来ると思うけど。
何かエラーが出るのならそのエラーメッセージを教えて。
493 :
492:2008/10/02(木) 15:06:11 ID:???
ごめん理解した。
ストアドファンクション内でUPDATEが出来ないから、連番として扱えないということね。
494 :
NAME IS NULL:2008/10/04(土) 12:18:15 ID:xNZqDkS6
2005ですが、主キーがあるとは限らない2つのテーブル(或いはクエリ)の
データが完全に一致するか調べたいんだが、どうやるのが簡単?
とりあえず思いつくあたりだと、
@各々ソートしてカーソルで一件づつ回して比較。
A全項目でグループ化して、グループ毎のカウントで比較。
DECLARE @A_COUNT AS INT SELECT @A_COUNT = COUNT(*) FROM A
DECLARE @B_COUNT AS INT SELECT @B_COUNT = COUNT(*) FROM B
IF @A_COUNT != @B_COUNT RETURN 不一致
DECLARE @WK_COUNT AS INT
SELECT
@WK_COUNT = SUM(件数)
FROM
(
SELECT 項目1,項目2,項目3,COUNT(*) AS 件数
FROM A
GROUP BY 項目1,項目2,項目3
INTERSECT ALL
SELECT 項目1,項目2,項目3,COUNT(*) AS 件数
FROM B
GROUP BY 項目1,項目2,項目3
) AS WK
IF @WK_COUNT = @A_COUNT * 2 BEGIN
RETURN 一致
END ELSE BIGIN
RETURN 不一致
END
こんな感じか?
サイズが小さいテーブルならUNIONしてDISTINCTして同じ件数とかでいけそうな気がする。
496 :
NAME IS NULL:2008/10/04(土) 13:56:33 ID:t3OKmBtk
テキストで書き出してDIFF
497 :
NAME IS NULL:2008/10/04(土) 14:25:30 ID:xNZqDkS6
>495
それだと、
1つのテーブルにまったく同じデータが複数行ある可能性があるので、
上手くいきません…
498 :
NAME IS NULL:2008/10/04(土) 14:47:47 ID:ZuEJHK9A
499 :
NAME IS NULL:2008/10/04(土) 15:41:36 ID:g+VjDE2R
>498
テーブル1
1
1
2
テーブル2
1
2
2
としてどうやればEXCEPTで?
ソートしてrow_numberつけて
ご存知の方がいたら教えてください。
「MS SQL Server 2005 Express Edition」+「vb.net2005」を使用して、小規模システム構築を考えています。
(端末2、3台のクラサバシステムです)
MSのサイトで、Express Editionのメモリ使用量の制限で1GBとなっているのを見ました。
これは、OSも含めたメモリ使用量になるのでしょうか?
それとも、DB単独でのメモリ使用量になるのでしょうか?
WindowsXPにインストールしようと思っているのですが、
搭載メモリを1GBか2GBどちらにしたほうが良いかと疑問に思いました。
制限4GBじゃなかったか?
505 :
bcp:2008/10/05(日) 21:43:01 ID:???
>>503 の言う通り、2GB 載せるべき。
評価用に Windows 2003 R2 + SQL Server 2005 Express Edition + 4GB
で運用してるけど、SQL Server だけで 1GB 食ってる。
506 :
501:2008/10/07(火) 01:30:01 ID:???
皆さんありがとうございます。
SQL Server単独で1GB食うなら、OS部などを考えると搭載メモリは2GBがよさそうですね。
おれなら4GB載せるけどな。
508 :
NAME IS NULL:2008/10/07(火) 11:26:39 ID:rO9cgVQf
.NET2.0でSQL Server 6.5に接続したいんだが、System.Data.SqlClientって
7.0以降しか対応してないのね...orz
6.5に接続可能なプロバイダってないの?
教えてエ(ry
System.Data.Odbc
>>509 やっぱODBC経由しかないのかorz
ネイティブに6.5に対応したプロバイダもなさそうなので
ODBCを使うことにしますた。d
SqlClientでもOdbcでもIDbファミリだから手順は一緒だよ。
6.5は古すぎてもう忘れてしまったが、
OleDBプロバイダが使えるようならそっちの方がOdbcより親和性が高いと思う。
OleDBプロバイダのサポートは7からだったようです
失礼します。
bcpでデータをコピーする際、データベースにログインした状態で実行するのではなく、
普通にコマンドプロンプトで実行するのはなぜでしょうか?
1>bcp .........略.......
2>go
と最初勘違いしてやってしまいました。
・バッチ書くとき楽だから。
・DB上でパースしたくないから。
516 :
514:2008/10/08(水) 14:20:57 ID:???
>515
なるほど。たしかにバッチファイル作るとなると、そっちでないと不便ですね。
ありがとうございます。
SQLCMDのT-SQLから使えるコマンドとしては
bluk insert や insert ... select * from openrowset(BULK ..)
があり、bcpと違いロード専用。
ロードするデータはサーバー、正確にはサーバープロセスから
アクセスできるところに置く必要がある。
>>501 XPをDB鯖にするのはライセンス違反だ。
シーケンス使えないから糞
ちょっとくだらない質問ですがお願いします。
たとえばSQL SERVER 2005で
出来ないとは思うのですが
たとえばVB.NETからSQLを発行するときにテーブルを返すタイプのストアドプロシージャは呼び出せるのでしょうか?
例:
SELECT * FROM 「1テーブルを返すストアド」 WHERE条件
それだったらストアドにパラメータを使えという話になるのですが、ちょっと気になったもので…
>>521 あぁっ・・・確かにおっしゃるとおりです orz
SQLServer2005の全文検索はつかえないけど
SQLServer2008の全文検索はどうですか?
おとしたらisoでDVDにやけっていわれて試せてない・・・
SQL Server 2008 Express with Advanced Servicesで
ManagmentStudioからフルテキストインデックスって作れる?
なんか、うちの環境だとTransact-SQLからは作れるんだけど、
ManagmentStudioだとデータベースの中に「ストレージ」が無いし、
[フルテキスト インデックス] ダイアログ ボックスでも追加ボタンが押せなくなってる。
便所の壁で仕事に関する相談かぁ
随分安っぽい仕事だな。
お客様が知ったらどんな気分だろうな。
そういやこの間、この板でウチのヤツっぽい書き込み見たな。
多分、客が知っても「特定される情報がなきゃおk」で終了になるだろうけど。
529 :
NAME IS NULL:2008/10/11(土) 10:49:01 ID:QblW9WIu
金もださず、時間もかけず、自ら調べようともしないで、
便所の壁に書いとけば、名無しのさんがベストな答えを出してくれるから仕事も楽々
こんな奴らに仕事を発注した会社が真っ当な賃金支払う筈ないよな
自分達の価値を貶めてる馬鹿の集いですね
Windows2003 Small Business Server でSQL Server 2000 EnterPriseEditionがインストールできないのはなぜでせう
>>530 1.福田のせい
2.小泉のせい
3.竹中のせい
ですね。
あっそぅ
>>518 501ではないが
どどどど、どのライセンスに抵触しますか?(滝汗
SQL Server 2005 Expressのライセンス条項で明示的に禁止されてる中にはOSの制限はなかった。
とはいえ、許可されてる範囲がいまいち明示されてないので断言できず、、
SQL Server 2005 Expressには制限はないがOSに制限される。
XPはサーバーとして使用してはいけないが、ピア接続など一時的なものはかまわない。
その2〜3台のクライアントがあるシステムがどちらに含まれるかという部分にかかっている。
定常的にクラサバとして使用するならピア接続の範囲を超えている可能性がある。
537 :
535:2008/10/12(日) 20:08:23 ID:???
確かバックエンドとして使っても駄目なんだよな、.NetのWebアプリから使われるとかも。
でも当然DB鯖自体は外に出ないので内部通報者でもいない限りばれっこない。
ライセンスが馬鹿げてるんだからしょうがない。
>>538 > 確かバックエンドとして使っても駄目なんだよな、.NetのWebアプリから使われるとかも。
Xpの制限、接続の種類別本数制限だから、バックエンドとしては問題ない。
ただ必要ライセンス数は減じない。
アパッチェとかじゃ.NETサーバーできんの?
英語だけどなんとか調べてみるわ
.net framework 2.0 + winアプリ + sql server 2005 Enterprise
の環境で実現したいことは
データベースの該当3テーブルに悲観的なロックをかけて他からのアクセスを完全に防いだうえで処理したいと考えています。
恐らくトランザクションの開始時に
BegginTransaction(分離レベル:恐らくSerializable?)
というようにしてロックレベルを指定するような気がするのですが、確信が持てないのと
このままで普通に処理していくと指定したテーブルのみロックをかけるような事が出来ないような気がします。
何らかの情報等あれば頂けないでしょうか?
説明不足の部分や、自分自身 トランザクションとロックの使い分けと違いが微妙な部分があるのですがよろしくお願いします。
カラム名を英語で作成しているのですが、
カラム名と日本語カラム名の対応テーブルを
使用して上手く表示させるにはどうすればよろしいでしょうか?
シノニムのことかい?
SELECT tbl.ENGLISH_NAME 日本語名 FROM tbl
SQL Serverで行ってみようはまだ買えるんかい
548 :
544:2008/10/15(水) 23:08:13 ID:???
>>545 すみません。説明が分かりづらいと言うか、テーブル構造が悪いのですけど
TableA
ID|列A|列B
---------------
1|10 |20
TableB
列名|名前
---------------
AAA|あああ
とあった場合、ID=1で抽出すると
AAA|10
BBB|20
の結果を得たいのですが可能でしょうか?
>543
トランザクションを開始した後にまず
WITH(XLOCK, TBLLOCK)
とでもしたクエリを流せ。
>>548 以前のプロジェクトで同じようなケースあったが
…スマン忘れたww
>>548 無理だろ、、、どこにも紐付いてないだろ、、、
554 :
492:2008/10/16(木) 17:12:50 ID:???
>>548 ちょっと待て、
> BBB|20
はどっから出てきた。
というか、TableBにID列はないのか?
>>544と
>>548の関連も不明だし。
あと、TableAは正規化する余地があると思うぞ。
いかん、名前欄を消し忘れた(笑)。
まあTableAに関しては、面倒だからVIEWにしたけど、unionでTableAの列Aと列Bを
(見かけ上)別レコードにすることが出来るんで、あとはTableBと作成したView1を
結合すればいいと思うぞ。
create view View1 as
select ID, 列A as 列 from TableA
union select ID, 列B as 列 from TableA
go
-- TableBにID列があると仮定
select 列名, 名前
from View1 inner join TableB on View1.ID = TableB.ID
where ID = 1
TableBにID列が無かったり、OUTER結合したいのかがはっきりしないからなんとも言えないが、
OUTER結合したい場合はinner joinではなくleft outer joinとでもすれば結果は出ると思う。
ただ、ID列がないなら、結合するためのキーがないからどうしようもない。
>>555 お前さんがちょっと面倒見がよくてよく回答してる奴だってことはわかった
わざと、聞いてるんじゃないの、答えられない馬鹿を釣る為に。
疑いだしたら匿名掲示板はNO RECORDです
559 :
544:2008/10/17(金) 10:28:08 ID:???
すみません、訂正して再質問させてください。
釣りでは無く本当に困っているのでどうか助けてください。
<TableA>
ID |列A|列B
---------------
1|10 |20
2|30 |40
<TableB>
ID |列名|テーブル名
-----------------------
101|列A |TableA
102|列B |TableA
103|列G |TableC
104|列C |TableD
<やりたいこと>
@<TableB>の全て取得したい。
A各テーブルは最新のIDの行を取得したい。
今は、<TableB>をカーソルを使って回してsp_executesqlで
SELECT 列A
FROM TableA
WHERE ID = (SELECT MAX(ID) FROM TableA)
のような文を作って取得していますが、異常に遅い状態です。
理想を言えば、TableB.テーブル名 = 'TableA' を指定すれば↓のような結果が欲しいです。
列名|値
---------------
列A |10
列B |20
sys.tables、sys.columnsを使用して何とかできないものでしょうか?
よろしくお願いします。
560 :
544:2008/10/17(金) 10:32:11 ID:???
>>555 Viewを使っての(見かけ上)別レコードにする方法試してみます。
ただ、TableAが200列とかあるので遅くなりそうな・・・。
構造は変えられないので正規化できないですし。
連投すみません。
CLRってマルチスレッド使える?
先物一回死んで・・
誤爆
564 :
NAME IS NULL:2008/10/17(金) 20:21:41 ID:YYMduugc
どなたか分かる方がいましたら教えてください。
SQL Server 2005 EnterpriseEditionを使用しています。
ManagementStudioで作成したデータベースのプロパティを開きました。
そのダイアログ内に
・「ANSI 警告有効」
・「算術アボート有効」
・「ANSI NULL 有効」
などTRUE/FALSEで設定できる項目があるのですが、
どう設定を変えても設定が反映されていないように思います。
何かご存知でしたらお願いします。
565 :
NAME IS NULL:2008/10/17(金) 22:12:12 ID:YYMduugc
追記です。
>どう設定を変えても設定が反映されていないように思います。
GUI上では値は変わっているのですが、
その後、Javaでクエリを発行しても、
その設定が有効になっていないような結果になってしまう
ということです。
SQL Serverへの接続時オプション?
>>565 SQLCMDではどうですか?
OLEDB/JDBC/ODBCなどの場合は接続時に
自動的にSET ANSI_NULL ON などのコマンドが発行されて特定の状態に上書きされるはず。
568 :
NAME IS NULL:2008/10/17(金) 23:52:36 ID:nUyHAdFv
>>566 返信ありがとうございます。
SQL Server全体の設定(サーバのプロパティ)ではなくて、
データベースの設定(データベースのプロパティ)だったと思います。
>>567 返信ありがとうございます。
なるほど〜。
やはりGUI(ManagementStudio)だけではできないですか。
569 :
bcp:2008/10/18(土) 09:24:25 ID:???
>>568 > なるほど〜。
何がなるほどなんだか。
>>568 は、Management Studio の事なんか書いてないだろ。
Java でできないのは、JDBC とかの影響だから、直接 SQLCMDで試してみろって
言うだけのことだよ。
別に、Management Studio からクエリ発行して試すのでもいいと思うけど、
よくわからんのならまずは「言われた通り」やってみなよ。
以下の手順で、SQLサーバを丸ごと移行できるのか確認したくて質問しました。
ある、SQL Server 2000 Developer Edition が動いているマシンにて、
SQLサーバを止めて、以下のデータのコピーをとる。
C:\Program Files\Microsoft SQL Server\MSSQL\Data
次に別のマシンに、SQL Server 2000 Standard Edition をインストールする。
そして、SQLサーバを止めて、同様の場所にあるDataフォルダの中身を
ごっそりと入れ替える。そしてSQLサーバを起動する。
これ以外に、何か設定ファイルを保存しておき、移す必要はあるのでしょうか?
私の方で行っている範囲では、この作業で問題無く動いてはいますが、
見落としがありそうな気がしていて、不安です。
非常に初歩的な質問ですが、よろしくお願いします。
>570
普通はデタッチしてアタッチし直す。
572 :
NAME IS NULL:2008/10/18(土) 23:23:37 ID:1KkMfcNq
>>569 職場でしかManagementStudioを使えないので、
月曜にやろうと思います。
家にあればいいんですけどね。
Webでよくある、複数条件での検索指定の場合のセオリーってあります?
単純に条件 IN(@条件文字列)だと効率悪いですかね
補足です。
複数条件 と言うのは、 Googleの検索条件でスペース区切りで指定する場合などです
>>573 SQLでのINはパフォーマンスに大きく作用する。多用すべきではないと言われている。
ぶっちゃけパフォーマンスを気にしなければ行けないのは、全レコード(行数)が1万のオーダーを超えてから。
>>546 2008年3月初版の本がもう手に入らんのか、、
>>574 >複数条件 と言うのは、 Googleの検索条件でスペース区切りで指定する場合などです
言わんとすることがいまいちわかんね。
SELECT * FROM table1 WHERE x IN ('Hello', 'World', 'This', 'is', 'a', 'pen')
は、
SELECT * FROM table2 WHERE x='Hello' OR x='World' OR x='This' OR x='is' OR x='a' x='pen'
と同じなわけだがそこらへん大丈夫?(Googleのスペース区切りはORでなくAND)
あと、IN(@条件文字列) というパラメータ置換は何でやろうとしてる?
ADO.NETだと @条件文字列="A B C D" の場合、IN('A B C D') とエスケープされてしまうわけだが。
(ADO.NETでWHERE句を本気で実行時に動的に書き換えたいなら、データアダプタをサブクラス化でもする他ない。)
>>575 >INはパフォーマンスに大きく作用する。多用すべきではないと言われている。
ではINのより効率的な置き換えとは何ですか(・∀・)?
ちなみに、SQL Server 2005 Expressでは↑の2つのSQL文にパフォーマンス上の差異はない(実行計画が同じになる)。
exists
>exists
mjk
>exists
IN(サブクエリ)なら、EXISTS(サブクエリ')に置き換えられる。
例:下記は等価。
(1) SELECT * FROM foo WHERE x NOT IN (SELECT y FROM bar)
(2) SELECT * FROM foo WHERE EXISTS (SELECT * FROM bar WHERE foo.x = bar.y)
だが、EXISTS(サブクエリ')の書き換えで常に高速になるわけではない
(結果的にテーブルfooの殆どのレコードがSELECTされる場合、(2)より(1)の方が早い。反対だと反対。)
みんな知ってるね
581 :
580:2008/10/19(日) 03:46:03 ID:???
訂正:
誤: (1) SELECT * FROM foo WHERE x NOT IN (SELECT y FROM bar)
正: (1) SELECT * FROM foo WHERE x IN (SELECT y FROM bar)
すいません、質問です。
SQL Server では「管理」のところでシステムのログを見たり、現在どのユーザが
接続しているかを確認する機能はありますが、どのマシンがどんなSQLコードを
実行したかを見る機能はあるのでしょうか。
もしそれが無いとすると、その履歴を吸い出すためのツールはあるのでしょうか。
保守的な意味合いで、実際にテーブルを開いてチェックする以外の方法で、
具体的にどのテーブルのどのデータが操作されているのかを随時チェックしたいのです。
>>583 なんとかってツールがデフォで入ってるだろ
スマンが名前は度忘れした…
>>584 Enterprise Manager、クエリアナライザ、このあたりでしょうか?
SQL Server Profiler
つか2000かよ。知らね。
2000でもプロファイラはありました。英語がカタカナ表記になっているだけのようです。
調べてみると、どうやらそのツールを使うようです。
TSQL の SQL:BatchCompleted をトレースするイベントクラスとして設定していると、
DBにアクセスしてきたSELECT文が拾えるところまで確認出来ました。
ツールをある程度使ってみての質問なのですが、トレースした後、その結果に
フィルターをかけて「TextData」が「SELECT 〜」のみを表示とか出来なさそうですが、
ユーザDBに対してのSQL文のSELECTやUPDATE文のみを抽出する良い
方法ってないのでしょうか。
トレースプロパティのフィルタにて、ApplicationName の項目を工夫するくらいしかないのかなぁ。
あと、このトレース結果を保存する際、トレースファイルとしては保存出来るが、CSV形式ファイルに
出力とか一発で出来ないみたいだね。
一度データベースに保存してそれからCSV変換となりそうだぎゃ。
解析するまでの過程が面倒だ。
591 :
577:2008/10/19(日) 20:13:01 ID:???
> ADO.NETだと @条件文字列="A B C D" の場合、IN('A B C D') とエスケープされてしまうわけだが。
パラメータの中のシングルコーテーションをクエリの一部として解釈されるならパラメータにする意味が全くないだろ。
スペースで区切った文字列でもあくまでスペースが含まれている文字列でしかない。
CommandTextをパラメータの数に応じて動的に作るだけだよ。渡すパラメータも動的に追加する。
死ぬほどパラメータが多いときやパラメータ数が予測できないときはお勧めしない。
パラメータ数の上限に引っかかる。2100個だけど上限なしに指定出来るようなときは引っかかる。
INでクエリ以外で固定のパラメータをたくさん入れると
時々とんでもない実行プランになることがあるので動作速度も予測できない。
パラメータとして渡したいものを一時テーブルに突っ込んでそれをサブクエリにするとかが堅いけどちょっと面倒。
一時テーブルに突っ込む過程でパラメータ数が多いと工夫しないとそれなりに時間がかかってしまうという欠点もある。
あと、文字列をそのままパラメータ以外で突っ込むのは論外。
Unicodeとかいろんな文字コード経由とかもあってどんなに頑張っても気づかない穴が発生する。
ちゃんとパラメータで渡せるようになんとすること。
593 :
577:2008/10/19(日) 20:32:01 ID:???
>パラメータのエスケープを自作ルーチンで賄うことになり、
>個人的には特に後者がセキュリティー上のリスクを高めるので問題だと思う。
重ねてスマン、良く考えたら573に書いてあるような "IN (@検索条件)" みたいなWhere句の論理構造自体を書き換える場合でも、
パラメータのエスケープを自作ルーチンで賄わずに済む方法はあるな。これはテーブルアダプタの拡張とは独立の話だった;
語りたがりな初心者の戯言として忘れてくだされorz
594 :
577:2008/10/19(日) 21:10:18 ID:???
>>592 パラメータ数上限やパフォーマンスは別途考慮対策するとして、
>ちゃんとパラメータで渡せるようになんとすること。
この一点のみについて言えば次のようにAddWithValue()なり使ってパラメータ渡しすればおkってことでいいんですよね?
[C#]
string[] searchTargets = new string[] { "A", "B", "C", "D" }; // 検索対象文字列(仮に4個)
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT * FROM [foo] WHERE foo.x IN (@p1, @p2, @p3, @p4)";
cmd.Parameters.AddWithValue("@p1", searchTargets[0]);
cmd.Parameters.AddWithValue("@p2", searchTargets[1]);
cmd.Parameters.AddWithValue("@p3", searchTargets[2]);
cmd.Parameters.AddWithValue("@p4", searchTargets[3]);
こうすれば、仮に検索対象文字列に [']とか[--]とかその他どんな文字が含まれていようとも、
(フレームワークにバグがない限り)フレームワークが適切にエスケープしてくれるので
(フレームワークにバグがない限り)上記クエリ発行でSQLインジェクションは*絶対に*起き得ない。
あとはこれにアレンジを効かせれば(パラメータを動的に増減させるとかすれば)、>573的にもよさげ?
>594
パラメータで渡すってのはそもそもエスケープとかするのとは関係ない、
パラメータ部分はあくまで変数でクエリの意味には影響しない部分。
シングルコーテーションやいろいろ記号を入れようが文字コード外の値を入れようが
あくまでそういう値の文字列変数とフィールドの値を比較といった感じで扱うだけ。
これはいろいろエスケープするのでは絶対に越えられない壁。
そんな感じのクエリを動的にパラメータの数だけ増やせるように作ればいいよ。
パラメータの数が多くなければそんなに問題が起きるようなこともないし。
パラメータを利用したSQL文ではSQLインジェクションは発生しないとされる(
ttp://www.atmarkit.co.jp/fdotnet/basics/adonet03/adonet03_02.html)。
これが可能であるためには、例えば
cmd.CommandText = "SELECT * FROM foo WHERE x IN (@p1)";
cmd.Parameters.Add("@p1", "Hello; EXEC sp_catalogs 'bar'");
としたときに、パラメータ展開結果が
SELECT * FROM foo WHERE x IN ('Hello; EXEC_sp_catalogs ''bar''')
となって、@p1部分全体がエスケープされるのではなくて?
SQL Server Profiler持ってる人だれか調べれ
598 :
570:2008/10/20(月) 11:14:38 ID:???
>>571のアドバイスを元に調べてみて、やってみました。
今まで、移行が出来なかったDBもアタッチを使うことで出来ました。
ありがとうございます。
念のため確認したいのが、デタッチしてファイルのコピーをするのと、
SQL Server を停止してファイルのコピーをするのは同じことですよね?
デタッチそのものに何か特殊な処理があるのでしょうか?
599 :
570:2008/10/20(月) 13:32:54 ID:???
600 :
NAME IS NULL:2008/10/20(月) 17:49:31 ID:Fvc0cWYg
質問です。
・本社にSQL Server 2005
・本社と支店をVPNで接続
・支店クライクライアントPCはサーバPC名の名前解決済み
という環境で、支店から本社サーバPCのデータベースAAAに、
ODBC接続を設定しようとすると、規定のデータベースを変更するのところが、
masterとかNorthwindなどの初期のものしか表示されません。
本社ネットワークからODBC接続を作成しようとAAAが表示されています。
何が原因でしょうか?
よろしくお願いします。
>>600 真っ先に思い浮かぶのは、AAAへのログインが成功しているかどうかでしょ。
何か特別にパスワードなどを設定しているかどうか。
すみません、質問です。
あるベンダさんがSQL Server 2kでシステムを入れたのですが、それには
データベースを毎日深夜に自動的にDATにバックアップするツールが
ついてました。ベンダさんは、「これで時間設定すると便利ですよ」と
紹介をしていたのですが、これって、そういうツールをいれなくても
EnterpriseManagerで出来ますよね。
どうしてツールを入れる必要があったのかが疑問で聞いてみたくなりました。
(ベンダさんは、内部仕様についてはなかなか教えてくれません。設計仕様だとか
これがサポートの形だとかそういうぼかす言い方しかしませんので)
バックアップツールの機能は、指定した時間にDATやHDDなど指定したところに
データベースの完全バックアップを行うのみです。
>>603 正直、NTBACKUP.EXEは使いたくない(笑)
多分、バックアップするツールってArcServeとかBackupExeとかだと思うけど、
テープへのバックアップだったら、そっちを使ったほうが良い。
昔、自分もWindows標準のバックアップツールを使っていたけど、
バージョンによって仕様(コマンドラインのオプションとか)が変わるんで、
自分のところもテープを使う場合にはツールを使ってバックアップするようにした。
※Windows Server 2008になって、またバックアップのコマンドが変わったし。
604 :
bcp:2008/10/20(月) 21:02:31 ID:???
※ そもそも素の 2008 では、テープへのバックアップはできなくなったよ。
標準ツールを使うバッチファイルをタスクスケジューラに登録しただけなんでないかな
>>602 できれば、そのツールが何か教えてもらえませんか?
(JP1だったら日立確定。まあ、JP1ではテープに出力昨日は無いけど)
607 :
NAME IS NULL:2008/10/21(火) 09:18:21 ID:N1IgYAGM
>>601 レスありがとうございます。
パスワードとかは特に設定はしていないですね。
でも、SQL Serverの設定でしょうね。
もう少し調べてみます。
ありがとうございました。
608 :
NAME IS NULL:2008/10/21(火) 09:49:09 ID:N94vUEPB
ここにいらっしゃるみなさんの環境についての質問です。
SQL Server でデータベースを作る際、ビューやストアドプロシージャを
全く作らずにテーブルの作成のみで、後はクライアントのアプリの方で
直接テーブルのデータを操作するという設計をすることは普通に
あるのでしょうか?
これはその設計方針次第といってしまえばそうなるのでしょうが、
製品自体が頻繁に仕様変更のバージョンアップがあり、それによって
旧バージョンとの互換性が無くなる部分が多いとか、他のデータベースへの
移植の可能性があるなどの状況を考えると、多少パフォーマンスを
悪くしても、そういうテーブルのみといった作り方の方が良いのでは
と思います。
パッケージにおいて、サーバは PostgreSQL か SQL Server かを選べるタイプのを
見ると、これは SQL Server はテーブルのみじゃないのかなと思えてしまいますが。
>>608 小規模な開発以外はありえない。
それに最近の開発はビジネスロジックは分離する思考になってるし。
610 :
NAME IS NULL:2008/10/21(火) 12:38:04 ID:zImtCADo
>>608 零細企業だけどうちは普通にあるなぁ…
特に頭の固い連中がいうのは
1.ビューはインデックスがうんたらかんたら・・・
別に最近ではいけてると思うんだけど・・・・
2.ストアドにしてアプリとは別にPG組んでもどうせ設計が変わったら両方修正が・・・
これに関しては否定はしないが、速度面では集計とかはストアドに任せたいんだけどなぁ…
マスタ管理レベルはいらないと思うけど
3.移植が・・・・
データベースとアプリのちょっとした設定程度だけの移行で済むのならSQLの方言程度だと思っているのであんま考えないかな
でも、システムの要件とか含めて結局総合的に考える必要があるから一概にこれが答えとは言えないけど
うちは1,2,3含めてパフォーマンスが少々気になっても
>>608と同じような感じになってる
ハードの質でも吸収できる部分もあるし
PS.俺的にはパフォーマンスをやっぱり重視したいところが多いけど
SQLServer2005 32bitをつかっています
パフォーマンスモニタを見ているとピーク時にはCPU100%になって
下がってきません
その割にはメモリはほとんど使っていません
4Gの壁云々の前にメモリをフルにつかってCPU負荷を下げたいのですが
>>611 メモリをあまり使わない必死処理が入ってんじゃないの
613 :
602:2008/10/21(火) 19:51:57 ID:???
みなさん、レスありがとうございます。
仕様や動作確認などが関係してたんですね。納得しました。
>>606 このツールは、「バックアップツール」とだけ書いてあるのですよ。
起動した画面もメニューは上の方に無く、ボタンだけの構成で、
誰かがVB6で作ったっぽいの感じの雰囲気のものです。
このツールを使えば、テープに記録は出来ますし、テープから、
データベースへの復旧もボタンをクリックするだけで出来ます。
(復旧はそういう場面がなかったのでまだやったことがないけれど)
614 :
NAME IS NULL:2008/10/21(火) 21:24:23 ID:Fio76aGW
すみません、初歩的な質問ですがお願いします。
SQL Server 2000 をインストールした後、リモート接続が出来る様に
するにはどのようにしたらよろしいのでしょうか。2005などの場合は
ドキュメントがすぐに見つかるのですが、2000とはメニューなどが
変わっているため、その操作が出来ませんでした。
ヒントとなる言葉でも結構ですのでお願い致します。
http://support.microsoft.com/kb/914277/ja
SQLServer2005でテーブルに入っているレコードでInsert文を作りたいのですが、
何かいい方法ありますか?
>611
プロファイラ見てDurationが長くてCPUが妙にでかい数字たたき出してるものをピックアップして重いクエリから順に直す。
インデックスが効いてないとかそういうのはメモリをひたすらキャッシュに使う方向になるので
メモリ使用量がぎりぎりまで増える傾向があるのでもっとろくでもない処理でもやってるんじゃないかな。
>614
2000はデフォルトで接続可能だったはず。
デフォルトの接続設定が厳しくなったのは2005からだよ。
>>617 別のPCから接続出来ました。アドバイスありがとうございます。
最初、エラーで接続出来なかったので、SQL Server側の設定の問題かと思い、
いろいろと調べていて、それでも分からなくて質問をしたのですが、
ご回答を元に、OSレベルの接続の部分を見直してみると、うまくいきました。
ありがとうございました。
営業所コード , 営業所 , 規模
100 , aaa , 5
101 , bbb , 7
101 , cccc , 6
621 :
608:2008/10/22(水) 09:18:05 ID:???
>>609 確かに、ビジネスロジックは分離した方が整理しやすくなりますよね。
>>610 テーブル数はどのくらいですか?
私は、1つのデータベースにおいてテーブル数が100を超えるのに、ビューや
ストアドを作ってないのを見たことがあるのですよ。
すいません、質問です。
現在SQL server 2005 Express Editionを使っているのですが
Windows Internal Databaseをアンインストールすると
SQL server 2005 Express Editionも削除されてしまうのでしょうか?
2005 スタンダードです。
以下の文の場合、全レコードが返ってきますが、コードが重複しないように
パターンの文字数の大きいものを優先して返してほしいですが、どのように書けばいいでしょうか??
SELECT * FROM テーブル名 WHERE 'C' LIKE パターン
コード、パターン、値
−−−−−−−−−−−
A01、%、 10
A01、C%、20
B01、%、 30
ORDER BY LEN(パターン) DESC
でいいんじゃね?
test
XP HomeにインストールしたSQL Serverにリモートのmanegement studioからログインすると
ログイン名がGuestになるんですがこれって仕様なんでしょうか testしてごめんなさい
>>617 2008はデフォルトでリモート接続可だった。
デフォルトでダメなのは2005だけか?
>>626 もう少し状況を詳しくw
こっちではXPHome使ってるけれど、プロファイラでトレースしてると
LoginNameの欄は
ネットワーク上のコンピュータ名\WindowsXPのログイン名
が表示されるよ。
では、逆にSQL Server 2000 でリモート接続を切るにはどうしたらよいのでしょうか?
メニューが無い為そういうこと自体が無理?
>>628 レスありがとですw
ネットワーク:workgroup
クライアント: windows2000 advanced
サーバー: xp home
SQL server: express edition
いままでずっとクライアントからサーバーのSQLServerに接続しようとしたところ以下のエラーが発生して接続できませんでした。
サーバー名\sqlexpressに接続できません
Additional information
ユーザー 'サーバー名\Guest'はログインできませんでした。(Microsoft SQL Server, Error:18456)
そしてサーバーのSQL ServerにGuestログインを作成したらすんなり接続できたのですが、ログイン名が
サーバー名\Guestに・・・ xp home のファイル共有は常にGuestアカウント経由になることと関係がある
んでしょうか
623です。
>>624 コードが重複しないように取りたいのですが。
これだとA01の行が2行返ってきてしまうので・・・
>>621 テーブルが多いからビューを作らなければならない訳ではない事ぐらい分かるよね
ストアドも同様。
ビューを作るのとストアド作るのは別問題っしょ
質問
ネットワークを通じてMS-Accessを使ってSQL Serverに接続する際、
SQL Server認証は成功しますが、これをWindows認証にすると
失敗してしまいます。
SQL Serverが入っているPCにて、SQL Serverに接続する際は、
SQL Server認証もWindows認証も成功します。
通常、こういうことが起きることは無いと思っていたので、
不思議でたまりません。これは、どのあたりの設定を
見直すとよろしいのでしょうか。
635 :
NAME IS NULL:2008/10/22(水) 20:55:45 ID:tDMckeFO
すみません、質問です。
本番sql server からバックアップしたデータベースを
ローカルのsql serverで復元したいです。
本番と復元先はデータベース名が同じです。
バックアップファイルが最新のものなので
現在ローカルにある同名のデータベースに上書きと言う形で復元したいです。
バックアップは、データベースを右クリックして
タスクからバックアップという形で行いました。
現在の状況としては、復元しようとすると「セッションが使用中なので
復元出来ない。managerの使用をお勧め」とでます。
色々調べたのですが、既存のデータベースを変えればいいとは載っていても
実際どうやればいいのかが分からない状態です。
復元のオプションでmdbとldf?ファイルが設定されていましたが
その復元先がDドラに指定されていました。
Dドラは使用していないのに何でなのでしょうか。そこが原因?
明日会社で出来ないと困るのでどなたか教えて下さい。
初心者の質問で申し訳ないのですが、よろしくお願いします。
>>634 今までは正常にログインできていたのが、急にできなくなったのですか?
あと、サーバーとクライアントはドメイン(Active Directory)に参加していますか?
それともワークグループで運用していますか?
確認方法としては、SQL Server Management Studioで[セキュリティ]−[ログイン]に
Windows認証でログインするユーザー/グループが登録されていないとか?
あとはログに失敗時のログ残っているかでしょうか。
>>634 ネットワークを通じてAccess使わずにWindows認証で接続できるか確認。
それで原因の切り分けできる。
>>635 > 現在の状況としては、復元しようとすると「セッションが使用中なので
> 復元出来ない。managerの使用をお勧め」とでます。
復元先のデータベースに誰かログインしていたと思われ。
> 復元のオプションでmdbとldf?ファイルが設定されていましたが
> その復元先がDドラに指定されていました。
> Dドラは使用していないのに何でなのでしょうか。そこが原因?
バックアップファイルの設定がそこに表示されているからで、
元のデータファイル(*.mdf)とログファイル(*.ldf)がDドライブだったからと思われ。
リストア方法だけど、[タスク]-[データの復元]までは判っているって考え良いんだよね?
それだったら、以下の手順でリストアできるはず。
0.復元先データベースを、自分自身も含めて誰も使っていないことを確認。
1.[データベースの復元]−[全般]で[復元先データベース]を選択。
2.[復元元のソース]で[デバイスから]をチェックして隣にある[…]ボタンをクリック、
[バックアップの指定]ウィンドウが開くんで、[追加]ボタンをクリックしてバックアップファイルを選択。
[OK]ボタンをクリックして[データベースの復元]ウィドウまで戻る。
3.左の[オプション]をクリック、[次のデータベースファイルに復元]の[復元先]をリストアするPCに
存在するドライブ/フォルダ名に変更。
(データファイル、ログファイルとも)
4.すでに存在するデータベースに復元するのであれば、[既存のデータベースを上書きする]をチェック。
これで[OK]ボタンをクリックすれば、復元できるはず。
# GUIの操作の説明は面倒だなー。
# T-SQLだったら、
# RESTORE FILELISTONLY FROM DISK='バックアップファイル名'
# 表示された内容でを元に、
# RESTORE DATABASE FROM DISK='バックアップファイル名'
# WITH MOVE 'mdfファイル名' TO 'MDFファイルの保存先'
# ,MOVE 'ldfファイル名' TO 'LDFファイルの保存先'
# ,REPLACE
で済むんだけど。
>>638 めっちゃくちゃ助かりました!
こんな細かく丁寧に書いてくれる神がいたとは。
本当にありがとうございました!!これで安心して寝られます。
>>639 この前?何日のレス?
俺が書き込んだのは初めてだけど
参考にしたいんでレス番教えてくれると嬉しいです。
640だけど、すみません、もう一つ質問が。
復元する時って復元先の(ローカル)sql serverに接続して
行うんですよね?
AというバックアップファイルをローカルのAというデータベースに
上書きしたいとしたら、ローカルに接続して、ローカルのAというデータベースを右クリックして
>>638に書いてくれたことを実行するってことでOKでしょうか?
それともODBCとかの接続の関係?これは全然関係無い?
>>641 ローカルに接続して、「ローカルのAというデータベース」以外で、T-SQLを実行
>>641 ODBCとか関係ない。
SQL Management Studioでログイン(当然sysadmin権限があるユーザーで)して、操作すればOK。
> 上書きしたいとしたら
それが[既存のデータベースを上書きする]をチェックする理由。
(まあ、実際はトランザクションログが残っている状態だと上書きできないからだけど)
あと、一応データベースのプロパティを確認して、データ/ログファイルの保存先を確認して
復元先を合わせたほうがいいと思う。
>>629 SQL Server ネットワークユーティリティで有効になっているプロトコルをぜんぶ削除
>629
細かいメニューは忘れたけど普通に接続ライブラリの設定からTCP/IPを削れ。
GUIで設定できるしメニューもあるし設定も普通に出来る。
2000でこの設定をいじることってあんまりないから説明されてないことが多いだけだよ。
>630
homeで使ったことないので勘だけどWindows認証にしてるならファイル共有のアカウントと同じアカウントで認証してると思うよ。
SQLServer認証の方でやれば?
>631
SELECT * FROM テーブル名 A WHERE 'C' LIKE A.パターン AND
NOT EXISTS (SELECT * FROM テーブル名 B WHERE 'C' LIKE B.パターン AND A.コード = B.コード AND LEN(A.パターン) < LEN(B.パターン))
こんな雰囲気で。試してないからちゃんと動くか判らんけど。
長さが同じだと重複する。
長さが同じものの重複を省きたいなら他に優先度のフィールドとか作るかざっくりMAXなどで片方を残すか。
648 :
629:2008/10/23(木) 07:56:00 ID:???
>>645>>646 ありがとうございます。
確かに、スタンドアロンで使う目的でSQL Server 2000 を入れることは
ありませんね。ネットワークを通じての時しか使わない。
パッケージでもたまにありますが、その時は、LANケーブル自体が接続
されていないとかですしね。
しかし、試験サーバでその操作をする必要があったので、設定のアドバイスは
助かりました。今度やってみます。
649 :
NAME IS NULL:2008/10/23(木) 16:30:16 ID:JH33FFPU
質問です。
フルテキスト検索を行っているのですが、
実際に検索をかけるとかなりの時間を要します。長いと30秒くらい。
挙動を見ていると、時間をあけてSQLを発行すると遅い。
時間をあけてるときにテーブルへの変更が無くても遅い。
2回目以降は条件を変えても早い、同じカタログの別テーブルも早い。
フルテキストインデックスは CHANGE_TRACKING AUTOで作成、
検索はcontains句を使用しています。
アドバイスいただけると幸いです。
650 :
649:2008/10/23(木) 16:35:05 ID:???
ちょっとわかりづらかったので補足。
要は、ある程度の時間をあけて検索すると遅い、
1度結果が返ってくれば2回目以降は即座に結果が返ります。
それと環境書き忘れました。
DB:SQL Server2005 Standard
OS:2003 server
対象テーブルは1万件程度、フルテキスト検索の対象カラムは8個です。
よろしくお願いします。
>650
自動終了のオプションでも入っているとか?
2回目早いのは単にキャッシュでしょ
654 :
NAME IS NULL:2008/10/24(金) 03:56:44 ID:EMvKOCzo
超初心者ですみませんけど、
無料で配布してたんで、飛びついてsql server 2008をインストールしたのはいいんですけど、
データソースの資格情報の入力の部分で、
ユーザー名、パスワードが求められるんですけど、
パスワードとか身に覚えないんですけど、
何処に行ったら取得できますか?
>>653 条件を変えても有効なキャッシュ、かぁ。
>>654 Windows認証なら適したユーザ名とパスワード
SQLサーバ認証なら設定したIDとパスワード
Windows認証ってよくわからないんだけど、
クライアントでManagementStudioなんかのログイン画面でWindows認証選ぶと
ユーザがドメインアカウントに固定されてパスワードとか入力できないんだけど、
SQLサーバはAD参加必須ってことですか?
>>655 条件変えてもと言うか、検索対象は変化ないので。
>>657 ワークグループで運用する場合、クライアントとサーバーで
ユーザー名/パスワードが同じだったらログインできる(はず)。
ユーザーが多くなると、クライアントにもサーバーにもアカウントを作成しないといけなくなるので
Active Directoryが有効になってくる。
とりあえず共有フォルダのアクセス権と同じと考えればいいと思うよ。
なんでM$のパンフレットは、分かっている人に対して分かるような
説明しかしてないんだろうな。
それまでMS-Accessしか触ったことが無く、これからSQL Serverを触って
勉強しようという意欲を持っている人向けの書き方じゃないよね。あれ。
ある程度中身を触って、そのツールや役割の把握が出来て、やっと
パンフレットに書いてあることが理解できつつあるw
みんな勉強をする大まかな手順としては、やっぱり、付属の冊子や
パンフレットは無視して、入門書を買ってそれを読んでから、
分厚い公式文書やヘルプのドキュメントを読むという手順なのかな?
>>659 レスthx
クライアントがAD参加してて、サーバが参加してないんだけど、
クライアント側でWindows認証を選ぶとユーザIDの項が【ドメイン\ユーザ】に固定される。
この状態でログインを試みると「信頼性が〜云々」エラーが出て繋げない。
まぁこれは理解できる。
このときにユーザIDを【SQLサーバ\SQLサーバ用ユーザ】とかでつなげることを期待してた。(←共有フォルダはこれでいけるし)
考えてみれば、これならSQLServer認証と変わらんか。
複数のクライアントからADO(Excel VBA)を使ってSQL Serverのデータを取得したいのですが、
ドメイン環境が無い場合は、Windows認証使えませんよね?
(同じユーザー名とパスワードを両方登録しておくという荒業は勘弁してね。)
SQL Server認証にした場合は、SQL Serverを動かしているサーバー上でGuest
アカウントを有効にするしかないのでしょうか?
どなたか、ベストプラクティスをお示しあれ〜。
SQLサーバにユーザ作ってそのアカウント使えばいいんじゃないの?
2005だとそんなことはできない、だったらごめんね。
普通に作れるね。
Guestアカウントって話はどこから出てきたんだろう?
はぁ? 技術力の無いアホが立て続けに落書きしてらぁ。
OSのセキュリティについて知識無しの中学生君かな。
>>662 1.サーバーのプロパティを、[SQL Serve 認証モードとWindows認証モード]にする。
2.[セキュリティ]−[ログイン]で、(SQL Serveri認証で)必要なユーザーを登録する。
この時、既定のデータベースや必要なアクセス権を設定する。
(例えば、読み取りしかさせたくないユーザーは[db_datareader]をチェックするとか)
だけで済むんで、Guestアカウントは全く関係しないけど。
Windows認証の時と勘違いしていないかな?
ちょい荒れ気味のようですが、質問です。
SQL Server を使ったパッケージが納品されている場合、
そのサーバでプロファイラで解析しながらクライアント
アプリを動かせば、テーブル情報が開示されたのと同じ
ような状況と見てよいのでしょうか?
ま、これをやるのはライセンス的な問題などがあるのでしょうが、
納品するパッケージにおいて、基本的にデータベースの
テーブル情報は開示しませんし、内部の動きについては
原則非公開となっています。しかし、顧客側にちょっと知っている
人がいると、実質そのパッケージのデータベースが丸見えに
なってしまうのを販売側(開発側)は受け入れるしかないのかなと
思いまして、質問しました。
668 :
bcp:2008/10/24(金) 23:18:09 ID:???
>>662 > どなたか、ベストプラクティスをお示しあれ〜。
「いちいちユーザー管理はしたくないけど、セキュリティは完璧にしたい」
と言うのがベストプラクティスと言うなら、賢い
>>665 が教えてくれるみ
たいだよ。
ド低脳すぎて教える気も起きないって言うと思うよ
>>666 レスどうもです。
カキコの内容でやってもダメだったので質問したのでした。
ローカルサーバー上では問題なくselectできるけど、リモートからは
OS(Windows2003)のセキュリティで弾かれているようだったので、
OS上のGuestアカウントを有効にして(セキュリティレベルを低下させて)
リモートからのアクセスを許可するしかないのか?と考えました。
他にセキュリティを保ったまま実現する方法があれば知りたいです。
↑補足です。
当然ながら、SQL ServerのTCP/IP接続は許可しています。
また、OSのファイアーウォールは無効状態です。
.NETで作ったアプリでは問題なくSQL Serverにアクセスできるので
Excel VBA ADOの制限とかあるのでしょうか?
>>670 Excel VBAのマクロセキュリティじゃね?高を低にしてみるとか。
Excelマクロのセキュリティレベルによってリモートアクセスの可否が
違ってくるなんて初耳だけど。
中学生の落書きですか、そうですか。
>>674 馬鹿やろう!小学生の落書きだ!
勘違いするな!!
0.154って数字を少数点2桁で表示したり
%表示させたいけど、便利なformat関数ってありませんか?
>>676 どこに表示させたいか具体的に書かないと笑っちゃって返事も出来ない
誤解が蔓延すると困るから書いておきたいんだが
ActiveDirectoryを構成していなくともWindows認証で
リモート接続は出来るんだぜ?
Windows認証とSQLServer認証の違いはID,Passwdによる認証を
OSレベルでするかDBサービスレベルでするかってことだけ。
あと忘れちゃいけないのはWindows認証でもSQLServerには
ユーザを登録しなければいけないんだぜ?
※SQLServer認証はID,Passwdを、Windows認証はIDだけを登録
それとデータベース/テーブルに対する権限の委譲も併せて
やっておかないとアクセスできないんだぜ?
>>679 理解できている人が"常識"と思い込んでるだけで
万人が認識できているわけではないのだよ、現実は。
681 :
669:2008/10/26(日) 01:00:54 ID:???
ある列の値の日ごとの合計をとりたいんですだが
指定される日付範囲が月や年の変わり目をまたぐことがあります。
一体どうすれば、、orz
やりたいことはこんな感じだけど、
SELECT
foo.Name,
DATEPART(year, foo.Date) AS Year_,
DATEPART(month, foo.Date) AS Month_,
DATEPART(day, foo.Date) AS Day_,
SUM(foo.val) AS Sum
FROM foo
WHERE (foo.Date >= @bgn) AND (foo.Date < @end) -- 日付範囲 [@bgn, @end)
GROUP BY foo.ID, foo.Name,
DATEPART(year, foo.Date) AS Year_,
DATEPART(month, foo.Date) AS Month_,
DATEPART(day, foo.Date) AS Day_
こんな長いクエリは書きたくないでつД`;)
また合計それぞれに対応する日付をdatetimeとしてスマートに得たいでつД`;)
どうも最近のT-SQLだとdateにキャストできるっぽいんだけど、使えないならこんな感じでどうだろ。
SELECT
foo.Name,
CONVERT(varchar(10), foo.Date, 111) AS Date_,
SUM(foo.val) AS Sum
FROM foo
WHERE foo.Date BETWEEN @bgn AND @end - 1 -- 日付範囲 [@bgn, @end)
GROUP BY foo.ID, foo.Name,
CONVERT(varchar(10), foo.Date, 111)
あ。varcharじゃなくてcharでいいか。
ExcelでSQL ServerにADOで接続できない件の自己レスです。
SQL Server Browserサービスを動かすか、接続文字列でポート番号を
指定すればいけそうな感じです。
自宅のテスト環境ではOKでした。明日職場で再確認予定。
マクロのセキュリティも低にしとけよ( ´,_ゝ`)
>>678の書き込みが出てきたからちょっと聞いてみたいのだが、
Windows認証については何処で学べば良いのかな?
(分野は何関係かな?OSの方?ネットワークの方?それともDB?)
ま、その環境が構築できなくて苦労してるわけじゃなくてさ、
Guestアカウントなどとの違いをはっきりとした形で理解したいので
そのあたりをしっかりとした解説を読見たいと思ってる。
自分なりに検索してみても共有フォルダの話ばっかりにたどり着いてしまって・・・
>>689 ああ、Windows Server関連の書籍だね。
それだと、認証についても詳しく解説がされているようだ。
何か見えてきたような気がする。ありがとう。
691 :
683:2008/10/26(日) 11:31:09 ID:???
>>684 ありがとうございます。ご提示のSQLで期待どおり動作することを確認しました!
datetimeへのキャストは未解決ですが、それ無しでもDate_フィールドが '2008/10/01'形式になるので
クライアントプログラムの方でそこそこスマートに対応できそうです。
※ 仮にCONVERT(datetime, foo.Date, 111) とした場合、エラーにはならないが、何ら変換してくれないっぽい、、
DATE型の表示形式はきちんと定義してないと、どんな参照がされたかで表示が揺らぐ可能性があるよ。
694 :
684:2008/10/26(日) 11:53:43 ID:???
SQL Server では、ユーザ定義DBのmdfとldfファイル、もしくはバックアップファイル
(BAKファイル)を盗まれたら(コピーされたら)、テーブルの実データ、定義、
ビュー、ストアドプロシージャなどはすべて丸見えですか?
本当は、それを盗まれたりしないようにするのがセキュリティーにおける考え方
なのでしょうが、暗号化や偽装化することは出来ないのでしょうか。
ファイル自体に細工をすることよりも、盗まれない体制を作った方がよっぽど実用的。
盗まれたらあきらめるくらいでいいと思う。
>>696 体制というと例えばどんなものでしょうか?
フリーかシェアかに関わらず、自分が管理している以外のサーバに入れたら
その時点で盗まれる可能性は十分にあるってことになりますよね。
IP公開したら自宅の住所がバレると思ってそうだな
運用してる人といっぺん話した方がいいんじゃないかな。
何か勘違いしてる。
DBやテーブルの構成はある程度ばれても良いって言う考えですか?
アプリというものは、その画面や動きを見ただけで、ソースコードまでは
見なくとも大体同じようなものが作れるから。
スレ違いといわれるかもしれませんが、質問するところがわかりませんでしたので
ここで聞いてみました。
Accessから、SQL Serverに接続する場合ですが、mdbファイルと、adpファイルの
違いは以下のような見解であってるのでしょうか?
mdbファイル
サーバのデータを取得し、一旦ローカルで保存し、操作する事が出来る。
ストアドプロシージャやビューを使わないのであれば、こちらで十分。
adpファイル
ローカルにテーブルを持つ事が出来ないので、すべてのテーブル操作は
サーバでとなる。ストアドプロシージャなどを活かして構築したい場合は
こちらが必須。
こういう基本的な事を確認しているのは、「SQL Serverならば、adpファイルにしろ」
といわれたのですが、データを操作する目的ではなく、登録したデータをもとに
帳票を作る目的であればmdbの方が、サーバやネットワークの負荷を少なく出来る
のでは、と思ったのです。その分、クライアントPCの負荷はあると思いますが。
あまりと言えばあまりに酷い…
明日先生に「こういう質問したんですが」って聞いてきなさい。
せめてヒントくらい。
>701
スレ違い。1行目しか読んでないけど。
705 :
683:2008/10/26(日) 21:29:19 ID:???
>>694 使ってるのがExpress Editionなせいかもしれませんが、date()使えないみたいです。
【バージョン】
Microsoft SQL Server 2005 - 9.00.3068.00 (Intel X86) Feb 26 2008 18:15:01 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
【現象】
Management Studio Expressで実行したところ、
datetime型で宣言した@dに'2008/10/1'をSETしたとして、
SELECT CONVERT(varchar, @d, 111); -- 結果: 2008/10/01
は成功しますが、
SELECT date(@d);
は下記エラーになります
メッセージ 195、レベル 15、状態 10、行 3
'date' は 組み込み関数名 として認識されません。
何かパッケージのインポートみたいなおまじないでも必要なんですかね…
>705
2005だからじゃね?
>>701 Access総合相談所 其の19 【桐にしとけ】
http://pc11.2ch.net/test/read.cgi/bsoft/1216293538/l50 まあ、大体あってるよ。
データをローカルにキャッシュして、再利用したり加工して使いたいならmdbを使えばいい。
キャッシュの必要がない場合はadpの方が既定でOLE DB接続なので速い。
ただ、mdbでもVBAを使えばOLE DBを使えるし、ストアドも実行できるから、
コードを書けるんならmdbを使っておけば問題ない。
あと、普通は逆でデータ取得のみより、データ操作する場合の方が
ローカルでキャッシュできない分、adpの方がサーバー負荷が大きくなるよ
(接続張りっぱなしになるから)。
>>705 date は関数じゃなくて SQL Server 2008 で導入された型だよ。
どうしても、datetime型で欲しいのなら、型変換後に再度変換とか。
convert(datetime, convert(char(8), foo.Date, 112), 112)
または、floatに変換後、小数点以下を切り捨ててから変換。
convert(datetime, floor(convert(float, foo.Date)))
もしくは、その日までの差を求めて足す。
dateadd(dd, datediff(dd, 0, foo.Date), 0)
>>709 Accessの件、レスありがとうございます。
解釈していたことは概ねあっていたのですね。安心しました。
接続やデータ取得はVBAで行っていたのですが、ストアドも実行出来るとは
知りませんでした。調べてみます。
711 :
709:2008/10/27(月) 00:22:30 ID:???
>>711 > CursorLocationや接続を正しく制御しないと、接続されたままになるのでadpの方が……
そうなんですよね。接続をきちんと制御するコードを書いていなければ、テーブルの
データ量が大きい場合、それによってネットワークの負荷が非常に大きくなる上に、
ユーザの待ち時間が長くなったりするんですよね。
だから、帳票においてはmdbで接続してローカルのテーブルにキャッシュしたらすぐに
接続を切って・・・というやり方をしてみていたのですが、このやり方でいいのかが
気になり、質問していたのです。
ストアドの件、URLまでありがとうございます。読んで勉強してみます。
713 :
683:2008/10/27(月) 03:58:04 ID:???
>>706 >2005だからじゃね?
なるほどorz
最終的に、次のようにして解決できました。
SET @grain = 24;
SELECT
foo.Name,
DATEADD(hour, DATEDIFF(hour, '2008/9/1', foo.date) / @grain, '2008/9/1'),
SUM(foo.val) AS Sum
FROM foo
WHERE (foo.Date >= @bgn) AND (foo.Date < @end) -- 日付範囲 [@bgn, @end)
GROUP BY foo.UnitID, foo.Name,
DATEDIFF(hour, '2008/9/1', foo.date) / @grain
'2008/9/1'は適当に選んだ基準日ですが、@bgnが常に0時なら@bgn置き換えても可。
@grainは、実は時間単位に集計したいという要望もあったので追加したものです。
SQLのセマンティクスはようわからんですけど、実験する限りでは、F(x)が単調増加か全単射か何かの場合
SELECT F(x) FROM foo GROUP BY x
という書き方が通るようです。
714 :
683:2008/10/27(月) 04:15:39 ID:???
ていうか709に完全な答えが書いてあったorz
回答ありがとうございました。
>>683 設計書には2chより引用って書いておけよ。
ここにいるみなさんが運用で SQL Server を選ぶ理由って何でしょうか?
GUIがすぐれているとか、Windowsとの親和性、これまで作ってきた資産を
活かすため、知識があって慣れているから、などいろいろあると思います。
SQL Server のデメリットは、バージョンアップが頻繁にあり、それに伴う
仕様変更によって互換性がなくなることや、強制的に過去のバージョンの
サポートが打ち切られてしまう事があると思います。
それであっても、みなさんがSQL Serverを使うのを選ぶ理由を聞いて
みたくて質問しました。
Oracleはサポートが適当すぎると聞いたことある。
怪しい動作の原因を問い合わせても、原因不明とか平気で回答してくるらしい。
そんな対応されたらサポート費返せって言いたくなるよな。
SQL Serverの方がバージョンアップのやり易さとか情報の開示レベル上と思う。
>>716 > SQL Server のデメリットは、バージョンアップが頻繁にあり、それに伴う
2000、2005、2008と頻繁とは思わないから
>>716 Oracleは、情報がクローズ過ぎるとかその辺がね。
今は大分値段が下がったけど、当時は価格が高過ぎというのもあった。
余談だけど、昔NiftyでやたらMSを攻撃する粘着なOracle社員もいた。しかも本名で。
あと、SQL Serverは基本的に7.0以降に関してはコアな部分は変わっていないと思われ。
あえて分けるとしたら、
・SQL Server 4.2(ほぼSybase)
・SQL Server 6.0→6.5
・SQL Server 7.0→2000→2005→2008
に分けられると思う。
SQL Server 7.0以降、バージョンアップでの問題が発生したら、
データベースの互換性レベルを下げれば、ほとんど問題はなくなるし。
(まあ、SQL Server 2008ではSQL Server 7.0の互換性レベルは無くなった訳だが)
OracleはGUIが糞だった気がするよ。
高いし、SQLServerでは標準で付いてるようなツールが別売りとかだったりするし。
wave-dashとかで悩むのも面倒だし。なんで自前で化ける文字の変換処理とか書かないといけないんだとか思ったり。
Oracleの接続ドライバが.NETのドライバとかODBCのドライバとかJDBCのドライバとかVBでのOO4OとADOとか
どれも何種類かずつ方法がある割にどれも癖があったり問題があったりで扱いが面倒だよ。
SQLServerは互換性レベルの設定でもろに過去バージョンのもそのまま動いてくれるよ。
互換性はかなり頑張って維持してると思う。
システムテーブルすらビューの形で残して互換性を維持しててびびったけど。
MSDNだけで開発環境とか一式全て揃うってのも楽でいいよ。
Oracle一筋だったけど、最近SQLServer使い出した。
機能的に特に差がなくて、安いからって理由だけだけど。
サポート契約しないとパッチも入手できんとかねぇ…
あと、メンテナンスする部署がWindowsしか使えんとかさ。
別にオラクルが好きな訳ではないが、あらぬ嫌疑をかけられたままというのはちょっとよくないかなと。
> 情報がクローズ過ぎる
OTNで公開されているマニュアルを読んだ上でクローズすぎるという意見でしょうか?
> wave-dashとかで悩む
悩む原因を作ったのはどこでしたっけ?
個人的にはしこしこチューニングしないとパフォーマンスがでないオラクルより
適当セッティングでもある程度のパフォーマンスが出るMSSQLが好みですね。
>722
入力と出力で同じ変換テーブル使ってれば問題起きないからオラクルだよ。
Oracleとの比較の話が多いけれど、MySQL や PostgreSQL 、DB2 と比較しては
どうなのでしょうか?これらはそのシステムの規模的に比較の対象外とか?
OSおよび開発言語に依存することが多いからかな?
Windows + .NET → MSSQL
Solaris + Java → Oracle
Linux + LL → MySQL PostgreSQL
みたいな?
DB2はつかったことないや。
>>722 今は公開されているけど、Oracle8の頃とかはひどかったよ。
あと
>>721にも書かれているけど、パッチの入手方法とか。
あと'(Windows版だけど)インストーラーが独特でちょっと嫌。
DB2は顧客がAS400ユーザー、もしくはAS400からのリプレースとか?
オラもMSSQLも使ったけど
何もしなくても早く動くMSSQLは便利だわ
7.0まではひどくて使えなかったけど(まぁその頃のオラクルも知らないが
オラからSQLに変えた理由はサーバーがWindows一本になったことだな
昔は無印のLinuxでもオラはサポートしてくれたけど
最近では製品版でしかサポートしないから結局高いLinuxサーバー製品を買わないといけない
だったらぜんぶMSにしてしまえ みたいな
731 :
716:2008/10/29(水) 09:07:09 ID:???
みなさん、たくさんのレスありがとうございます。
Oracle との比較の意見、凄く参考になりました。
Oracle で構築されたシステムが多いという話や、各種資格があると
給与が・・・という話を聞くと、MS SQL Server で構築をやっていて良いのかなと
ちょっと不安になったりしていたのですが、整理がついてきたように思います。
しばらくの間は SQL Server を使って勉強していこうと思います。
あと、もう一つだけ質問です。
規模の大きなシステムであると Oracle を選ぶべきという意見も聞きますが、
こちらのスレに居る方々はそれはどう思いますか?SQL Server では無理が
出てきたりしますか?
お願いします。
昔は Oracle は早い! SQL Server は遅い!
なんて良く聞いたけど、最近はどうなんでしょうね
基本 SQL Server 重い部分だけ Oracle 担当で
リンクサーバー接続なんて運用は、たまに見かけるけど
DBの性能は9割メモリで9分ディスクなんだから意味ないよ。
MSとOracleが性能比較合戦してた頃の資料はどっちも言いがかりレベルだから、
いまさら持ち出さないように。
>>731 最近は銀行系でもSQLServer使ってるとか何とか。
Oracle使いだけど、最近はSQLServerを選ぶ顧客が多い。
その背景はDB云々じゃなくて、サーバOSとしてWindowsがなんとかなるようになってきたからじゃないだろうか。
DBの機能は大差ないように思う。
OSはUNIX系でって言う客はまだまだいるけど。
あとフレームワークがSQLServerに対応してないとか言うのはあるな。
質問です。
Aの店舗ごとに、Bの最新日付のファイルIDを取りたい場合、どのようなSQL文になりますのでしょうか?
A
店舗コード
100,A店
200,B店
300,C店
B
店舗コード,ファイルID,日付
100,1,1/1
100,2,1/2
200,3,1/2
200,4,1/3
200,5,1/4
300,6,1/1
300,7,1/3
テーブル名と店舗名カラムは適当に読み替えてください。
>>736(インデント見たいときに)
select 店舗A.店舗名, ファイルID
from
店舗A
left join (
select
b1.店舗コード, ファイルID
from
店舗B b1
join (
select 店舗コード, max(日付) as 日付
from 店舗B group by 店舗コード
) b2
on (b1.店舗コード = b2.店舗コード and b1.日付 = b2.日付)
) 店舗B
on (店舗A.店舗コード = 店舗B.店舗コード)
row_number over partition ... は2005からかな。これが使えるならもっと単純になる。
>>736 735です。すごく助かりました。
2005なのですが、出来ればROW_NUMBER()も
教示戴けますでしょうか(;^_^A
>>733 横レスですが、質問です。
> DBの性能は9割メモリで9分ディスクなんだから意味ないよ。
これ、本当ですか?
その数値を出した根拠をお願いします。
>>738 MSSQL2005の機能を盛りだくさんに使うとこんな感じです。
AテーブルとのJOINは省略。
with cte_B (店舗コード, ファイルID, shop_r) as (
select 店舗コード, ファイルID,
row_number() over (partition by 店舗コード order by 日付 desc)
from testB )
select 店舗コード, ファイルID from cte_B where shop_r = 1
どちらにせよコストのかかる問い合わせなので定常的に使用するなら、
また最新の日付以外のデータが履歴以上の意味を持たないのならば
Bを現在の状態を保持するテーブルと履歴テーブルを分けるべきでしょう。
すみません、質問です。
SQL Server 2000 Developer Edition を使っているのですが、
これをインストールした後、ヘルプの情報をみても、Developer Edition の
文字はありませんよね。コントロールパネルの、プログラムの追加と削除の
ところを見ても、そういう文字は書いてありませんでした。
すでにインストールしてある SQL Server 2000 のエディションが何であるかを
確認したい場合、どこを見たら良いのでしょうか?
>>740-741 735です。ありがとうございます。
そうですね、現状処理対象が多く想定した速度が出ないので
分割するのもありですよね。検討してみますm(_ _)m
>>742 select @@version
というクエリーを実行したらわかるよ。
>>744 Devの文字が出てきました。ありがとうございます。
746 :
NAME IS NULL:2008/11/01(土) 21:41:33 ID:DIcWafAA
SQLサーバーで結果セットを取得せずに、特定の行だけ行ロックしたいのですが、
どうすればいいのでしょうか?
イメージ的にはこんな感じ
LOCK * FROM A WITH(UPDLOCK,ROWLOCK) WHERE COL1 = '005'
初心者ですが質問があります。
大量にupdateするときはやはりテーブルをロックした方がよろしいでしょうか?
またその場合どのようなロックが適切でしょうか?
>>748 仕様が分からんので何とも言えん。
例えば、
「深夜に他のユーザーが一切接続できない
かつ、操作するのがupdate掛けるセッションだけ」
などの要件が有れば、ロック掛ける必要自体が無い。
むしろ、エラー処理と処理を行う上でのROLLBACKの要否の方が重要だろ。
他のセッションがあるという前提なら、行ロックを前提に
該当トランザクションで排他ロック掛けられては困るなら、
更新ロックにするべきだろ。
カーソルの中でunion allで全ての結果を結合して
その結果をそのままinsertって可能かな?
nVarcharと varchar の使い分け方が意味不明です。
unicode対応かどうか見たいだけど・・・・orz
誰かわかりやすく教えてください。
nvarchar : 可変長の UNICODE 文字データです。
varchar : Unicode ではない可変長の文字型データです。
確か、Shift-JISに変換できないUNICODE文字をvarchar型の列にinsertすると「?」になったはず。
あと、nvarcharのサイズは文字数だけど、varcharのサイズはASCIIでの文字数(要はバイト数)。
>>753 わかりやすい!
なるほど!そういうことだったんですね。
大変勉強になりました。
ありがとうございました。
日本語OSの場合は753のとおり。
他言語OSの時はcollationを見直す必要があり。
varchar(10) に2バイト文字を突っ込むと5文字しか入らなかったような
nvarchar(10) だと2バイト文字でも10文字入る。
半角固定じゃない限りは今時 nvarchar デフォでいいんじゃないか
758 :
NAME IS NULL:2008/11/05(水) 18:20:09 ID:8CuM4UUP
復旧モード「フル」に設定してるのにトランザクションログがぶりぶり切り捨てられてる。
初回の全体バックアップの実行前だとこんな現象が発生してるんだけど、これってSQLSERVERの仕様?
データベースが全体バックアップ済みか否かって、どこ見て判断してるんだろか?
760 :
sage:2008/11/06(木) 09:58:01 ID:xzbCwz05
>>759 ありがとう!
>データベースが全体バックアップ済みか否かって、どこ見て判断してるんだろか?
こっちは解らない? msdb..backupfileを参照してるのかと思ったがどうも違うみたい。
初心者で言葉足らずかもしれませんが、
ご教示いただきたい事があり、書き込ませていただきます。
OSがWindowsServer2008のマシンにSQLServerExpressEdition(SQL Server認証)で
データベースを構築し、ADO接続しようとしたところ、
[DBNETLIB][ConnectionOpen(Connect())]SQL Server が存在しないか、
アクセスが拒否されました
というメッセージが出て接続できませんでした。
WindowsXPとSQLServerExpressEditionで構築した場合、
同じADO文(?)で接続できました。
気になっているのは、
ADO文の「Data Source=(Local)」の部分で、
WindowsServer2008では書き方が変わってしまうのか?
ということと、
WindowsServer2008にSQLServerExpressEditionをインストールした際、
ユーザ名とパスワード設定のところで
「複雑なパスワード」を要求されたため、
記号入り(アットマークを使用)のパスワードを設定したので、
それが引っかかっている可能性があるかと考えています。
ただし、エラーメッセージを読む限り、
SQLサーバの認証で蹴られてるのではなくて、
SQLサーバ自体を見つけられていないような気がするのですが・・・
長文になり、申し訳ありませんが、
ご助力のほど、よろしくお願いいたします。
サービスが起動しているのかということと
構成マネージャで TCPの通信ができるようになってるかまずは確認してみれば?
ローカルからのTCP接続ができるかどうかの確認かな。
あらごめん。すでにローカルか。
んじゃ
>>762と一緒でTCP通信可否設定の確認だね。
つか(Local)って時点でネットワークを見ないんだぜ?
766 :
よしき:2008/11/07(金) 10:36:05 ID:WjJ9IoZm
つまらない質問で申し訳ないんですが、SSMSにてクエリエディタに行数を表示させるにはどうしたらいいのでしょうか??
宜しくお願いいたします。
767 :
NAME IS NULL:2008/11/07(金) 14:26:06 ID:j3syhTYc
私もつまらない質問で申し訳ないのですが
Windows XP Home Edition(SP3)に
SQL Server 2008 Express Editionをインストールすることは
できるのでしょうか? できた場合も制限とかあるのでしょうか?
当方学習目的なもので、システム構築云々といった
だいそれた事は考えていません
タダなんだから試してみろよ
それが学習だよ
>>767 インストールは出来ますが、GUIツールなどに大きな制限があります。
コマンドを打つのに慣れているのであれば問題ありませんが、
学習目的であれば、GUIツールを使っての操作がいいでしょうし、
各種メンテ用のツールで、システムの動きを確認しながらの方が
イメージがつきやすいと思います。
Developer Edition の購入をお勧め致します。
>>762>>763>>764>>765 返信ありがとうございます。
構成マネージャで確認してみましたところ、
TCPが無効になっていましたので、有効に切り替えてみましたがだめでした。
サービスについても「SQL Server」は開始になっておりました。
あとはsaのパスワードの「@」が怪しいのかなぁと思い、
再インストールしてsaのパスワードを変更してみようと思います。
ちなみに再インストール以外でsaのパスワードって変更できるんでしょうか?
>>770 > ちなみに再インストール以外でsaのパスワードって変更できるんでしょうか?
SQL Server Management Studioで[セキュリティ]−[ログイン]でsaのプロパティを開いて
パスワードとパスワードの入力確認を入力。
>>770 ユーザー名に@が含まれるならまだわかるけど、パスワードに@はあまり関係ないと思われ。
一度、ADOの接続文字列を公開してみるとか。(パスワードの部分は消して)
>>771 そういうのを見つけ切れなかったわけだから、
ここで質問してるんだと解釈したんだけどなw
そこまで分からないのであれば、ということで
製品版を勧めたのだよ。
180日評価版とかの案内をしても制限は?とか
ぐだぐだいいそうだし。
GUIツールが見つからないなんて言ってないような。
XPに入るの?っていうことだけだよね。
つまらない質問ですが、つまらない質問するにはどうすればいいのか教えてください。
書け!
そして叩かれろ! 以上
778 :
776:2008/11/07(金) 23:29:33 ID:???
>>777 早速のご丁寧な回答、ありがとうございます。
より、つまらない質問が書けるように努力したいと思います。
> より、つまらない質問が書けるように努力したいと思います。
もう充分だ。
180日間限定の奴って期間過ぎたら自動的に使えなくなるって事でいいんだよね?
>765
tcp:(local)
がいいんじゃないかと。
>>780 そんなこと確認してないで、製品を買いに行きなさい。
開発者向けは数千円で売ってるんだっけ
2005や2008でも安価なの用意されてる?
788 :
761:2008/11/10(月) 18:35:13 ID:???
>>773 パスワードから「@」を外してみてもだめでした・・・
ADO接続文字列
Provider=SQLOLEDB.1;
Password=******;
Persist Security Info=True;
User ID=sa;
Initial Catalog=******;
Data Source=(local);
Use Procedure for Prepare=1;
Auto Translate=True;
Packet Size=4096;
Use Encryption for Data=False;
Tag with column collation when possible=False
としておりますが、如何でしょうか?
>>788 SQLServer2005や2008のExress版は標準では名前付インスタンスになるのだけど
その辺は大丈夫?
>>767 学習目的なの?
評価目的なら体験版やダウンロードセンターからダウンロードできる
VHDイメージ(英語版だけど)を使えば良いね。
>>790 学習目的だといっている人間に対して、学習目的なの?と改めて質問をした上で
評価目的のものを勧めるのってなんでなの?
ExpressEdition使われると気にくわないの?
>>788 釣りじゃないよね?
ウィザードで普通にNext>Next>でインストールすると
loalhost\SQLExpress
だよ。
793 :
792:2008/11/10(月) 22:10:09 ID:???
間違い。
localhost\SQLExpress
だよ
>>788 > Data Source=(local);
他にも書かれているけど、ExpressEditionだったらデフォルトのインスタンス名はSQLExpressだから、
Data Source=.\SQLExpress
(もしくは"Data Source=localhost\SQLExpress")
で繋がると思われ。
あとProviderだけど、SQL Server 2005だったらSQL Native Client(SQLNCLI)の方が良さそうだけど。
796 :
なめ IS なる:2008/11/12(水) 10:13:29 ID:GMZxs0Yi
構文エラーになってしまいます。.付近に不適切な構文があります。
↓
CREATE UNIQUE INDEX DEVDB.D1I ON DEVDB.D1
( COMPOSITE_TYPE DESC , COMPOSITE_KEY DESC ) ;
どなたか教えて下さい m(_ _)m
>>796 手元にないから確認はしてないが思いつくことを少々。
DEVDBは名前からスキーマではなくDB名と思えるので、
DEVDB.D1 は DEVDB..D1 が正しい。スキーマ名であってればそのままで。
インデックスはテーブルのDBとスキーマに常に従属するので、
DEVDB.D1I の DEVDB. は不要。
798 :
NAME IS NULL:2008/11/12(水) 18:25:13 ID:MucFGzZ5
詰まってしまい、どうしても分からないことがあるので、
質問させてください。
Microsoft SQL Server 2005を使ってストアドを作っています。
動的にSQL文を作成して実行することを目的として、それはできるように
なったのですが、動的にUPDATE文を作成するとにNULLをセットして更新することが
できなくて困っています。これは可能のでしょうか?
***************
DECLARE @tbName VARCHAR(50)
DECLARE @vAC1 VARCHAR(50)
DECLARE @vSql VARCHAR(500)
SET @tbName = 'TEST01'
SET @vAC8 = 'aaaa'
SET @vSql = ' Update ' + @tbName + ' SET AC1='+''''+@vAC1+'''' +
' WHERE (ID01 = 11111) '
execute(@vSql)
***************
これを実行すると、TEST01テーブルにある列ID01の値が「11111」に一致する行の列AC1に
文字列「aaaa」で更新する、という動的SQL文はできるのですが、変数@vAC1に「NULL」を
セットして列AC1をNULLで更新したいのですが、このようなことは可能でしょうか?
可能な場合はどのような記述をすると動的にNULLで更新を行えるようになるのでしょうか?
よろしくお願いします。
単純に
SET @vAC8 = NULL
として実行しただけでは、ストアド実行ではエラーはでないものの、テーブルへの更新は
されませんでした。
799 :
なめ IS なる:2008/11/12(水) 18:46:55 ID:BeyoDU5S
(T_T) ありがとうございます!
実行したところテーブル作成を確認致しました。感謝です。
ALL 権限は推奨されません。←このワーニングが出ましたが、これは無視してもよいでしょうか?
>>798 select 'foo' + NULL + 'bar'
select 'foo ' + 'NULL' + ' bar'
とかやってみると納得できるかも
NULLは値じゃない
ヌルヌル
SET @vAC8 ='''+ null + '''
と書けば上手く行くかもしれない
質問です。
SQL構文の長さにおいてはどのくらいまでという限界が設定されているのでしょうか?
以下のような感じで長いSQL文をVBAで自動生成して実行しようとしたら
エラーが出て、実行出来ませんでした。(WHERE 以下を削除するときちんと実行
出来る状況です)
SELECT * FROM tblname WHERE (A = 1) OR (A = 2) OR (A = 3) OR (A = 4) ・・・・
WHERE以下が異常に長いという、SQL文です。
異常なほど長すぎるとエラーが出るので、別の方法を考えるべきだということは
分かりますし、現在は別な方法で対処していますが、どういうところが限界なのかが
良く分からなくて質問してみました。SQL Server などに設定があるのか、それとも
別なところに限度が設定されているのか、などが気になっています。
よろしくお願いします。
806 :
なめ IS なる:2008/11/13(木) 10:40:43 ID:p7L5VuAO
恐れ入ります。
CRTTBLで、指定したスキーマがないか、使用する権限がありません!
と怒られています。
スキーマは存在するので権限をMANAGEMENT STUDIO EXPRESSの画面から
該当するスキーマに与えても改善されません。
どうすればよいでしょうか?
807 :
なめ IS なる:2008/11/13(木) 10:46:25 ID:p7L5VuAO
↑
ごめんなさい、データベースを指定していませんでした。m(_ _)m
808 :
798:2008/11/13(木) 11:41:19 ID:6iPQ+/Aa
>>803 ありがとうございます。
参考にして設定時にNULLをセットして更新文の方をそれに合せ以下のようにしたところ、
文字列、NULLの両方に対応した動的な更新文を作成することができました。
ありがとうございます。
**************
DECLARE @vAC1 VARCHAR(50)
DECLARE @tbName VARCHAR(50)
DECLARE @vSql VARCHAR(max)
SET @tbName ='TEST01'
SET @vAC1 = 'null' -- NULL値テスト
SET @vAC1 = '''aaaa''' -- 文字データテスト
-- 文字列のnull変数設定成功版
SET @vSql = ' Update ' + @tbName + ' SET AC1='+@vAC1+
' WHERE (ID01 = 11111) '
execute(@vSql)
**************
日付型でも同じように考えて同様にNULL、年月日の設定ができる
ようになりました。動的に全てこなすというのが初めてだったので
本当にありがとうございます。
809 :
NAME IS NULL:2008/11/14(金) 00:19:11 ID:NswyuBr8
>>719 > 余談だけど、昔NiftyでやたらMSを攻撃する粘着なOracle社員もいた。しかも本名で。
池田?
ログまだ持ってるよ
捏造してまでMSに圧力かけられたって自演してたやつね
>804
かなり長いクエリは実行してるけど長さが原因で動かなかったことはないんだけどなぁ。
動的にクエリを作ってるとクエリの長さよりもパラメータ数の上限が2100個にぶつかる。
無制限にパラメータを渡してくるような状況だと一時テーブル作ってサブクエリとかにする。面倒だけど。
>>809 そう、池田○一w
まあ、あの当時のMSは色々あったからね。電脳曼陀羅の件とか。
でもあの粘着さは傍から見ていても異常だった。
812 :
NAME IS NULL:2008/11/14(金) 09:59:55 ID:iMptzZfL
IE上からGOOGLEを使用して、 ”データベース アプローチ” を検索すると
何故かエラーで落とされるのですが仕様ですか?
>>812 それはIEの問題だと思われる。
こちらの環境では、IE6とかだと、javascriptなどがうまく
処理できずエラーが出たり、異常終了することがあった。
これ以上のことはスレ違いなので、DB板以外の、
PC初心者やブラウザ関連の方へどうぞ
815 :
804:2008/11/14(金) 13:43:16 ID:???
>>814 君んとこのIEもおかしいよw
うちのIE6は文句言わずに処理してくれるぞw
817 :
NAME IS NULL:2008/11/14(金) 21:24:33 ID:B/+QOJJ/
>>719 >>809 オラクルもアンチ扇動が過ぎて、すっかりネガティブ企業のイメージついちゃったし
そのためオラクル製品もそういう目で見るようになる
自業自得だな
そういうのはいいから
820 :
NAME IS NULL:2008/11/16(日) 03:07:38 ID:YPc0B7k/
データベースミラーリングでご質問ですが、
アプリ(ASP.NET)から実行したトランザクションが実行中に
フェイルオーバが発生した場合、
そのトランザクションが切り替えのため、ロールバックされた事を
アプリ側で判定したいと思います。
それには、その旨のリターンコードをハンドリングするのでしょうか?。
「Failover Partner」接続句でセッションは自動的に切り替わるようですが、
トランザクションの再実行は別途仕込が必要な気がするのですが・・。
例外が飛んだら無条件に1回リトライ、からやってみれば。
まずは試してみろ。話はそれからだ。
そんな糞稀なことを捕まえるのか…・
大変だな…・
俺ならそういうのを補足するとか断るな
どうしてもならなんとかはするけど
レプリケーションが上手くできないのですが、
非ドメイン下では簡単にはできないのでしょうか?
ちょっと相談があったのでみんなに聞いてみる
SQL Server2005
Oracle9i
この2つのDBでレプリケーションを構築しようとしたときに、
相互更新可能なレプリケーションは、SQL Serverの標準でついている
機能で可能でしょうか?
また、MicrsofのMSDN以外に異種間レプリケーションの情報などが
ありませんでしょうか
SQLServer2005 Standard
エージェントにて外部アプリケーションを呼び出して終了待ちしたいのですが、可能でしょうか?
可能であれば、どのような呼び出し構文になりますでしょうか?
トランザクションログがいっぱいになったというエラーが出たので
トランザクションログのバックアップをしようとしたのですが
途中でディスクの空きが無くなって失敗してしまいます。
こういう場合どうしたらよいでしょうか?
>>826 トランザクションログを切り捨ててもいいのなら、
BACKUP LOG データベース名 WITH TRUNCATE_ONLY
GO
DBCC SHRINKDATABASE('データベース名')
GO
トランザクションログを切り捨てた後は、念のためにフルバックアップしておく事を推奨。
>>825 ジョブのステップ追加で、[種類]を[オペレーティング システム(CmdExec)]にすれば、
外部アプリケーションを呼び出せるけど、応答待ちしないで戻ってくるの?
sqlcmd の -p オプションについて教えてください。
-p 付きで実行すると最後に、クロック タイム (ミリ秒)が表示されますが、
以下の2つの場合では 2) の方が圧倒的に早いです。
1) sqlcmd ... -Q "select * from hoge"
2) sqlcmd ... -Q "select * from hoge" > result.txt
コンソール出力などsqlcmd自身の処理も「クロックタイム」に含まれてしまっていると
思うのですが、sqlの実行時間のみを表示させるにはどうしたらいいでしょうか?
>>830 全く同じクエリーなら、クエリープラン諸々がキャッシュされていると思われ。
(そうでなくても、色々なオブジェクトがキャッシュされるし)
実行時間を見るのなら、SQL Server Profilerが妥当と思う。
サーバー、もしくはクライアントでSQL Server Profileを起動しておいて、
[ファイル]−[新しいトレース]で、とりあえず使用するテンプレートは標準を選択。
クエリーの実行時間はDurationという列を参照。
デバッグ中で、データの追加削除を繰り返してたので、ログが膨れ上がっています。
本番前にいったん、すべてクリアしたいと思うのですが、データベース作成直後の
クリーンな状態にするにはどうしたらいいのでしょうか?
834 :
NAME IS NULL:2008/11/21(金) 10:17:27 ID:wKzxvEHB
SQL SERVER 2005 で
C#のプログラムからトランザクションをかけてデータを更新したいと思っています。
その時、出来ればトリガが動くような構造にしたいのですが、
そのトリガは出来ればC#からトランザクションをかけてその中で動作してほしいのですがそういうことって出来ますか?
要はSQLを投げたときにトリガは動いてほしいけどロールバックした時にはそのトリガの動作は元に戻したいという都合のいい要件なのですが・・・・
トリガは使わないほうがいいね
>>835 ありがとうございます。
なるほど
トリガは使わずに手動でやった方がよさそうですか・・・・
それともうひとつ疑問というか、使い方がわからないので教えてほしいのですが
データの楽観的更新を行うのに今まで timestamp の列を使用していました。
このヘルプを読んでいると timestampはrowversionのシノニムであることが記述されているのですが
sql server2005のtimestamp列は行ごとに必ず一意になるものと考えていいのでしょうか?
(いわゆる 行単位でデータを持ちそれが自動でインクリメントされる)
実は今までtatimestamp列はテーブル内で一意になり 8byteの枠を超えた行数のテーブルは一意にならないのではないかと思っていたのですが・・・・
いや信じるなよw
>>837 え〜と・・・つられた?w
まぁ、この動作が出来ないのならトリガはあきらめてPGからトランザクション内でチョイチョイとしようとは思うのですがいろいろPG内のチェック等が面倒くさくて出来ればトリガに任せたいのです
SQL投げる回数も増えますし
ストアド内から1トランザクション内でロールバックできるように処理できればそちらでもいいのですが・・・・
>>838 普通はトランザクションを開始しても、
トリガは動くし、当然、トリガの内容も含めてロールバックされると思うんだけど。
どんな手順で処理してる?
あと、timestamp の値は、timestamp 列のあるテーブルに Insert, Update される度にカウントされる、
データベースのカウンタ。データベース毎に一つで、列とかテーブル単位のカウンタじゃないよ。
VB Express 2008を入れたところSQL2008EXがインストールされました。
これですとマネジメントスタジオが備わっていないので、
マネジメントスタジオがあるアドバンスを入れたところ
SqlServerConfigurationManagerに二つのサービスが出るようになってしまいました。
片方を削除したいのですが、どうすればよいでしょうか?
当然のことながら「サーバーへの接続」のサーバー名には"私のPC名¥express"と"私のPC名¥express0"の
二つがプルダウンに出てきてしまいます。
アドベンチャーワークスのサンプルを入れるときも上記サーバー名のどちらに入れるか聞かれます。
自己解決しました。
普通にアプリケーションのインストールから削除操作を行えばできました。
片方を生かして削除ができました。
解決しててよかった。
SQL2005ですが、Agentのジョブに実行時間のTimeOutを設定することは、できないですか?
実行時間5分のジョブを1h毎に実行するようにスケジュールしているのですが、たまにネットワークのエラーなどで何時間も実行中状態になったままになるのです。
例えば30分でTimeOutしてそのジョブは失敗で終わって次のスケジュールで走ってもらいたいのですが、Agentジョブ自体にはそのような設定が見つかりません。
会社の仕事を持ち帰って家でやらざるを得ないことがあるので家のPCにもSqlServer2000が入っています。
最近SqlServer2005を使う仕事が増えてきたので家のPCにもSqlServer2005Expressを入れようと思って
いるのですが共存って出来るのでしょうか?(している方はおられますか?)
つこうた
2005のバージョン違いは共存できたが2000とは知らない。
2000使わないなら2005に乗り換えたら?
>>846 「共存可能」ということでよいのでしょうか?
>>847 2000も使います。今でも2000の方が仕事が多いので。。。
>845
名前付きのインスタンスで共存させろ。
VirtualPCを使えばいいじゃない
もう1台買う
>>846は2000のライセンスについて気にしているんじゃ
>>851 別途OSのライセンスが必要になるじゃないか。
そもそも開発用ならMSDNでライセンス持ってるだろ?
>>855 > 英語版でいいならMSがiso配ってるよ。
ライセンスを?
ライセンスとイメージファイルの区別がついてない厨房でしたか、それは失礼。
>>855 別にエスパーじゃないけど。普通MSDE使うかなって思ったから。
>>858 もちろん使用にあたっての制限つきであることも理解してるんだよね
859は頭悪いの?
ライセンスぐらいよめよ
使えないイメージファイルを配布してるわきゃねーだろ
用途によっては使えないことぐらいみんな知ってるよ
みんなもう2008を本番で使ってますか?
うちは2005なんですけどデータ圧縮とか使いたいな〜と思って
年末の休みにいれかえ予定なんですけど
ちなみにデータベースのサイズは2Gちょい
鯖はWin2003R2 E6700 4G
アップグレード版ってないかのお・・・。
>864
データ圧縮ってエンタープライズ以上じゃないと使えなかったと思う。
スタンダードで使えたら2008を使いたいなと思って残念だった記憶が。
50GB以上くらいのDBでバックアップ取るときに圧縮できると随分楽になるんだよなぁと思ってたんだけど残念だ。
でも2008で使いたくなるような機能って圧縮くらいなんだよなぁ。
最近ようやく2000から2005に移行できたよ。
2008に移行できるのはいつになるんだろうなぁ…
>>866 multiple insert とか merge 文とかGROUPING SETは使ってみたい。
圧縮が必要なレベルの案件がないなぁ。
リソースガバナーもEnterprise Edition以上だし。
そうそう。SQL Server 2008でPowerShellがサポートされるけど、何か役に立つのかな?
Exchange Serverはともかく、SQL ServerはT-SQLでなんとかなっちゃうし。
圧縮なんてLTO側でするから必要ない
教えてください。
データベースの勉強がしたくて、SQL Server Express 2008のインストールを試みたのですが、
インストールが中断してしまって、エラーメッセージも何も出ません。
>>871 ディスクをフォーマットしてOSから入れ直す。
.NETフレームワークを全部消してから入れてみるとか。
顧客から定期的にデータを送ってもらうのですが、データベース容量が1GBを超えるようになり
やりとりが大変です。
1回フルバックアップを送ってもらってその後は差分バックアップだけ送ってもらうということは
出来るのでしょうか?
ちなみにSqlServer2005エンタープライズを使っています。
できる
>>875 超即レスありがとうございます。
フルバックアップ後に差分バックアップをとってもフルバックアップのファイルに追記される感じで
1つのファイルになってしまいます。
別ファイルにする方法がわからないのですが。。。
>>867 multi insertは便利だ!と思ったけどミドルウェアからパラメタで渡すのどうするか
とか考えたら頭痛いですね
ユーザー定義テーブル型で構造体配列を渡すことも今回からできるみたいなので
それ使うといいんでしょうけどちょっと躊躇しますねぇ
>>869 PowerShellは何に使うのか意味不明ですね
878 :
NAME IS NULL:2008/12/04(木) 12:58:38 ID:50d5E/qs
2005(Ver9.00.3233.00)で
住所 like '%ー%' (長音)で検索すると'々'までヒットします。
逆に
住所 like '%々%' で検索すると'ー'(長音)までヒットします。
これバグ?
>877
multi insertは使える場面が微妙な気がする。
大量のinsert文を並べて大量のパラメータを渡して複数行まとめてinsertにすると
呼び出し回数が格段に減るのでそこそこパフォーマンスは上がるので
multi insertならもっとパフォーマンスが良くなりそうなんだけど、
パラメータ数の上限の2100に引っかかるのであまり無茶なことは出来ないし
.NETならSqlBulkCopyクラスの使い勝手とパフォーマンスにはどうやってもかないそうにない。
2000の評価版ってもう落とせないの?
なんでいまさら2000を評価する必要があるの?w
そこに評価版があるからだ。
>>881 大量のパラメーターを渡すよりもユーザー定義テーブルをパラメーターとして
渡せばいっきに渡せる
.NETからだとデータセットなりクラス、構造体配列をまとめて渡せる
ただそういうのはループしながらパラメーター化してInsert発行するのが普通で
既存アプリを直してまでパフォーマンス稼ぐ必要あるかどうかといわれると微妙
ユーザー定義テーブル型はメンテがめんどうだしね
1000行とかじゃそんな変わらないだろうし大量にやるなら>881のいうように
他の方法あるしな
886 :
NAME IS NULL:2008/12/08(月) 15:53:42 ID:JuIy9Atn
すみません。msdn等で調べていたのですが、どうしてもわからないため
質問させていただきます。
有識者の方、よろしければご回答お願いいたします。
現在、SSISでパッケージ作成しており、SQL実行タスクで
SELECT 'TEST_TBL' AS NAME
を実行し、それを変数[TBL_NAME]に単一行で結果セット(変数の型はString)
しています。
パラメーターマッピングはしていません。
この変数[TBL_NAME]をデータフロー内の[OLE DBソース]の[テーブル名または
ビュー名の変数]で使用したいのですが、[TBL_NAME]を指定するとエラーが
起こってしまいます。
どのように設定すれば[テーブル名またはビュー名の変数]に変数を指定できる
のでしょうか?
初歩的な質問で申し訳ありませんがよろしくお願いいたします。
2005 SP3 が年内に出るって話し合ったが
結局でないのけ
>>886 動的SQLでググレばなんとかなるんじゃないの?
890 :
NAME IS NULL:2008/12/09(火) 00:21:42 ID:Eo7pggoY
初歩的な質問で申し訳ありません。
SQL SERVER 2005 DEVELOPER EDITIONのMANAGEMENT STUDIOにて、あるDB
のみアタッチすると、サーバーの「管理」の下にメンテナンスプランが
表示されません(消えてしまいます)
DB自体はきちんとアタッチされており、中を確認することもできます。
何が原因なのでしょうか?アドバイスよろしくお願いいたします。
SQL2000鯖でも見てるんじゃねぇのか
SQL で質問です。
毎時間辺りのアクセス数を調べたいのですが、
アクセスログテーブル
日付(int型)|時間(int型)
20081211|090000
20081211|090123
20081211|101258
20081211|150511
20081212|223014
のようにログが格納されていて、
現在
--9時台検索
select count (*) from アクセスログ
where 日付 = 20081211 and 時間 between 090000 and 095959
--10時台検索
select count (*) from アクセスログ
where 日付 = 20081211 and 時間 between 100000 and 105959
のようにクエリを作成しています。
クエリアナライザに時間帯毎のクエリを24個貼り付けて、操作上は
1発で実行出来るのですが、1個のクエリにまとめる事は出来ますでしょうか?
恐れ入りますが、ご教授お願いします。
intならこんな感じで。
select count (*) from アクセスログ
where 日付 = 20081211
group by floor(時間/10000)
>>893 ありがとうございます!出来ました!
こんなにすっきりした文で出来るなんてビックリしました。
floor 関数知らなかったので調べてみます!
>>893 すいません、このSQLだと、アクセスログが無かった時間帯(深夜3、4時等)の行が非表示になってしまいました。
0件の場合でも0と表示させる事は、可能ですか?
度々申し訳ありません。
>>892 ちょっと待て!
INTで090000はありえないだろ!!
>>896 失礼しました。
読みやすくする為に、全て6桁で表記してしまいました。
ああ、うん。
(見栄えのために0パディングしてるという前提で、)intなら…
という風に書いてたんだけどいらないかと思って消したんだ。
0件の場合に0と出すのは、、、PostgreSQLならgenerate_seriesって関数で連番作れるので
それと結合すればいいんだけど、SQLServerには無いっぽいので、簡単にはいかないかも。
>895
その結果にunionでcount(*)が0件のレコードを24行追加してsumでもしたら?
>>899 そうするならアクセスログテーブルとUNION ALLした方が。
902 :
NAME IS NULL:2008/12/13(土) 22:59:10 ID:koWcQKgo
SQL SERVER 2005 において、以下のようなメンテナンスプランを組んだの
ですが、うまくいきません。
原因等お分かりになりましたら、アドバイスお願いします。
・サブプラン1→データベースバックアップタスク
あるフォルダに対し、毎日決まった時間にバックアップファイル作成
・サブプラン2→メンテナンスクリーンアップタスク
バックアップファイル作成フォルダに対し、毎日決まった時間に、
拡張子(bak)のバックアップファイルを検索し、4週間経過したファイルを削除
→サブプラン1はきちんと実行され、バックアップファイルが作成
されるものの、サブプラン2が全く実行されず、バックアップファイル
が溜まりっぱなしになってしまう。
※履歴を確認してもサブプラン2は全く実行されていません。
>>898 すいません、ありがとうございました。ネットで調べてCASE式を組み合わせて
無事0件の時は0で表示出来るようになりました。
更に複数日付でも一括して取れるようになりました。
以下 クエリです。
select
sum (case when 日付 = 20081211 then 1 else 0 end)as '1211',
sum (case when 日付 = 20081212 then 1 else 0 end)as '1212',
sum (case when 日付 = 20081213 then 1 else 0 end)as '1213'
from アクセスログ
group by floor(時間/10000)
3日とも3時台にアクセスが無かったら?
>>904 別にこの3日以外でも、レコードが有りさえすればいいんでない?
それでも心配なら(つか心配だ)19000101とかで全時間帯のダミーを作っておくとか。
>>719にも書いてありますが、
純粋にSQL Server 7.0→2008に移行できるんでしょうか?
SQL Server 7.0→2005に移行する為の資料というかはあるんですけど。
調査不足だったら申し訳ないです。
ストアドの結果を利用してUPDATEしたいのですが、可能でしょうか?
INSERTなら↓みたく出来るのですが・・・
INSERT INTO hoge
EXEC foo_sp @param = 1;
update table
set clmn = fnc(prm)
とかならできる
>906
それぞれ2つ前のバージョンまでしか互換性レベルが使えないので7→2008は無理っぽいような気がする。
一度DBを2005でアタッチして互換性レベル変えてデタッチして2008でアタッチとかすれば移せると思うよ。
911 :
906:2008/12/16(火) 10:02:12 ID:???
>>909 返信有り難う御座います。
やっぱり直接のバージョンアップは無理そうですね。
という事は2005と2008を両方購入しなければならないっぽのか。
うーん。SQL Serverも結構値段がはるし、困ったものです。
>>911 データベースサイズが4GB以下だったら、2005 Express Editionをかますという手もあるような気がする。
申し訳ございません。ご指定のページが見つかりませんでした。
質問です。
SQLServerで、ページ番号からテーブル等のオブジェクト名を
取得する方法はありますか?
>>915 自己解決しました。
DBCC PAGEで見れました。
例えば下記のようなデータがあったとします。
ID|No|DATA
1 | 1 | A
1 | 2 | B
1 | 3 | C
2 | 1 | A
2 | 2 | B
3 | 1 | A
3 | 2 | C
4 | 1 | B
4 | 2 | C
このデータにおいてDATA列に対して下記のような条件で検索を行うクエリを作成したいのです。
@DATAにAとBを持つID
ADATAにAとCを持つID
BDATAにAとBとC持つID
それぞれ期待する結果は
@ 1と2
A 1と3
B 1のみ
となります。
このDATAに持っている条件は複数指定できるようにしております。(AとBとCと・・・Zというのも可)
なかなかいいクエリが作成できなくて困っております。
現在、この検索動作を満たすために、
いったんDISTINCTでIDの一覧を取得しておき、
取得したID一覧と検索条件の2重ループでカウントを取得するクエリを投げ、
結果が0件となった時点で検索結果からはずし、
最後まで1件(同じIDに対して複数の同じDATAはないため)だった場合は結果に含める
ということで行っております。
VB.NET風に書くと
' ArrayIDにはDISTINCTにより取得した全IDが、
' ArrayDATAにはユーザーが検索画面で入力された条件が入っているものとします。
Dim ArrayResultID As Array ' 検索結果のIDが入る配列
Array.Copy(ArrayID, ArrayResultID) ' 検索結果にいったん全部のIDをコピー
For Each id In ArrayID
For Each data In ArrayDATA
command.CommandText = "SELECT COUNT(*) FROM TABLE WHERE ID = " & id & " AND DATA = " & data
cnt = command.ExecuteScaler()
If cnt = 0 Then
ArrayResultID.Remove(id) ' 0件だった場合はそのIDを検索結果から除外する
Exit For ' 現在のIDでのDATAループから抜け、次のIDでのDATAループに移る
End If
Next
Next
If ArrayResultID.Count = 0 Then
MessageBox.Show("指定した条件でのIDはありませんでした。")
Else
' リストビューに結果を表示
End If
といった感じとなります。
IDの数およびユーザーが入力した条件の数により、その分クエリを投げる回数が増えてしまい
結果を返すまでの時間がものすごくかかってしまっているのが現状です。
もし、このような結果を1回の問い合わせ(または数回の問い合わせで)返すクエリがあるようでしたら
ご教授のほどよろしくお願いします。
>>918 DATAでフィルタかけてIDでグループ化した件数がフィルタデータの数と一致すれば出力
というやり方でいけないの?
>>919 ありがとうございます。
その方法でやりましたところ、期待する動作を1回の問い合わせと件数チェックにて行えることができました。
SQLServerのフェールオーバークラスターはActive/Passive構成ですが
Active/Active構成でロードバランスとかやれる製品はありますか?
>>920 もしかして件数チェックってプログラムでやってる?
もしそうなら、HAVING句使えばいいよ。
SELECT ID
FROM TABLE
WHERE DATA=A AND DATA=B
GROUP BY ID
HAVING COUNT(*) = 2
925 :
920:2008/12/17(水) 11:45:03 ID:???
>>923 おお、教えてくださりありがとうございます。
これで1回の問い合わせだけでできるようになりました。
あるファイルに完全バックアップをとったあとで同じファイルに差分バックアップを追加すると
完全バックアップのFILE番号は1、差分バックアップのFILE番号は2になると思うのですが、
このファイルから差分バックアップの分だけを削除することはできないのでしょうか?
できるとしたら何というコマンドを使えばいいのでしょうか?
(SqlServer2000と2005のどちらでも結構です。)
テーブルにクラスタ化インデックスを追加するとどっかのテーブルにインデックス情報が
作られるんですよね?その内容を見たいんですけどどうやったら見れますかね?
datetime型をnverchar型に変換する際に、convert関数で
yyyy/MM/dd HH:mm:ssの書式にする方法を教えて下さいm(._.)m
ヘルプでconvertで載ってると思うが。
第二引数に112だかなんだかを指定するんだったかな。
忘れた。調べろ。
111と8をくっつける、かな
ACCESSのFormat関数みたいにわかりやすくして欲しいよな。
111とかだと直感的ではない。
確かに。毎回調べてる。
933 :
NAME IS NULL:2008/12/19(金) 22:38:00 ID:i+V3kjbR
>>933 そんな説明はさんざん見飽きてる人が多いと思うが。。。
本番環境に SP3 入れちまったんだが、今度は大丈夫だよな!?
前科があるだけに・・・
早すぎじゃね?
テスト環境に導入してしばらく様子見るのが普通だと思ってた。
938 :
928:2008/12/21(日) 00:41:06 ID:???
default:怠慢・欠席・不参加・不履行
マ板的には怠慢、つまり何もしていない(=初期値)が意味的には一番近いんだろうか?
年末に本番環境の2005を2008に入れ替えます
いいよね?
人柱が増えるおかげで Service Pack がでたら
またかなりよくなりそうだな
SQL Server 2008 です。
Table1 と Table2 が同じ構造だとして、
Table1 の全件を Table2 に移したいと思っています。
insert into Table2 select * from Table1;
だとエラーになってしまうのですが、どう書いたらいいでしょうか?
なんのエラーになるの?
945 :
NAME IS NULL:2008/12/24(水) 09:52:26 ID:dzxhWigS
サーバマシンが不安定なためOSと共に2005の再インストールを計画中なのですが
既存のmaster、msdb、model、ユーザDBのファイルを
再インストール後にアタッチで復元しようと思います。
OS再インストール前にこれらのDBを意図的にデタッチする必要はあるでしょうか?
インスタンスを停止すれば勝手にデタッチするのでしたら愚問になりますが
そのあたりの仕組みを理解していないものですいません。
「エラーになる」しか書けないような奴に仕事させんなよ…
既にtable2があるってオチじゃないのか?
すでにデータが入っていてキー重複という線もあるぜ
>>943 Table1にフィールドが3つ(fld1、fld2、fld3)あるとして、とりあえず↓のどれかでうまくいくかやってみて。
あとどんなエラーメッセージが出るかも書いて。
insert into Table2 (fld1, fld2, fld3) select * from Table1;
insert into Table2 select fld1, fld2, fld3 from Table1;
insert into Table2 (fld1, fld2, fld3) select fld1, fld2, fld3 from Table1;
どうせ同じ構造じゃないってオチだろ
951 :
943:2008/12/25(木) 02:33:11 ID:???
手元に動かせる環境がないので、正確には分かりませんが、文法エラーです。
皆さんならすぐに分かると思ったのですが。
Table1 と Table2 は同じ構造で、キーは重複しません。
Oracle だとあの書き方で通ります。
>>949 ありがとうございます。やってみます。
文法的には間違ってない。
原因はいろいろ考えられるけど想像であれこれ言うよりエラーを貼れとしか。
>>951 その文法エラーを示すメッセージを貼ってくださいよ。
こりゃだめだw
955 :
943:2008/12/26(金) 00:39:35 ID:???
>>952 ありがとうございます。文法的には間違ってないですか?
SSMAで変換かけてもエラーになったのでてっきりこの文法はないのかと。
今度もう一度試してみます。
何だ、釣りか。
957 :
sage:2008/12/26(金) 11:08:24 ID:CVA6mREA
顧客向けシステムのDB用に2005StandardのユーザCALを購入したのですが
Windowsのどこで設定するのかご存じの方、お教えいただけると幸いです。
販売元サポートに聞いたら「設定するとこはないですよ」て言われたんだけど
社内で「嘘だろ!」と怒られてしまって。
焦ってたり。情報が見つからなかったりで。
紳士協定です
2000 までは入力するところあったんだっけ。
まぁ実際にCAL買ってなくても数字入れればその数で使えたと思うが
設定なんて無制限w
>>959 2000はあるな。俺なんか99とかしてるがww
962 :
957:2008/12/26(金) 18:36:38 ID:???
分からないまま、納品てことになりそうです。
レスをくれた方々、ありがとうございました(*-人-*)
>>958 紳士協定ww
2008のExpressダウンロードしてインストールしようとしたんだけど、全然成功しない。
事前のチェックとかは全て終わって、インストールは始まるんだけど途中でエラーが出てしまう。
そのエラーを見ても、何を改善すればいいのかサッパリわからない。
みんなは2008なんの問題もなくインストールできた?
昔の2000や2005はごく普通に出来たんだけど、2008はマシン変えてもどれも出来ないんだよね。
3台PCがあって、1台がServer、後は全部XPなんだけどどれも成功しない。
仮想環境で新規に作った環境でも成功しない。
これインストールできるのか?と思う程成功しない。
2008からは散々事前チェックとかが入ってるから、それがOKってなってればインストールできそうなもんなんだけど何故に・・・
詳細はエラーログを見ろと言われてみてみても、そのエラーログが長すぎて一体どれが原因なのかがサッパリで。
一応見てわかる分には、MSXML 6.0 Parser -- インストールに失敗しました
というのだけ明らかに失敗とわかるログがあったけど、でも何故失敗するかがわからない。
>>963 2008を入れたけど…。
相当時間が掛かった覚えがある(現在は2005Expressに戻した)
Core2Quad+メモリ6GBで一時間くらいかかんなかったっけ。
インストール途中でエラー出て止まってるようなので、そんなに時間はかからなかった。
事前の設定とか色々を除いて、最後のインストールだけでいうと数分でエラーでて止まるぐらい。
スペック的にはよく似たぐらいかな。
なんでなのかなあ・・・
ファイルがぶっ壊れてるのかも。
もっかいダウソしてみれば?
>>966 それだけ別にインストールしてみたけど、無理でした。
というか現在、インストール自体受け付けなく・・・
>>967 ダウンロードしなおしたけど、上記理由によりもっと根本的におかしな状態になってしまって。
インストーラ実行後、一番最初の環境チェック?みたいなのが終わって
そこから本来は次のチェックが始まるはずなんだけど、今それ以降反応がなくなってプロセスが進まない状態に。
windowsインストーラのクリーンアップツールがあっただろ
それつかってみれば
>>969 おおおおおおお!
それを使ってからインストールしてみたら、成功しました!
どうもありがとうございます。
そんなもんがあるのか。
知らなきゃ永久にインストールできねーな。
知識は力とはこのことだね。
SQL Server Express Edition (with Advanced Services)の 2005 と 2008 を
同居させることってできるんでしょうか?
974 :
972:2009/01/01(木) 13:26:15 ID:???
>>973 ありがとうございます。リンクを参考に別名を指定してインストールしたところ、
- ルール "SQL Server 2005 Express Tools" は失敗しました。
- SQL Server 2005 Express Tools がインストールされています。
- 続行するには、SQL Server 2005 Express Tools を削除してください。
とエラーが表示されましたが、以下のサイトなんかも参考にして、
SQL Server Management Studio Expressをアンインストールしてからインストールすると、
無事インストールできました。
ttp://devadjust.exblog.jp/8565032/ 一応、Management Studio Expressから、2005、2008のそれぞれのインスタンスに
ログインできてるので、大丈夫だと思うんですが、もう少し動作確認してみます。
2005以降はツールはバージョン違いがあると入れられなくて共存しなくなったよね。
でも2005と2008が共存しないとなると2005のDeveloperを使ってて2008のExpressを試そうとすると困りそうな気がするけど。
>>975 共存できてるよ?
まさにその2005Devと2008Expressの状態で。
2005には2005のSSMSで、2008には2008のSSMSでログインできてる。
>>972 イタタタタタタタタタタタタタタタタタタタタタタ
SQL Server 2005/2008 Express は
外部公開のWebサーバで使っても問題ないんでしょうか?
Standard以上のプロセッサライセンスが必要なんでしょうか?
デッドロックから抜け出せません。
原因が分からず、何かアドバイスをいただけないでしょうか?
レコードが15万件ほどのテーブル1があります。
主キーは列A,B,C。
インデックスは主キーに対応したクラスタインデックスのみ。
他に列C,D,Eでも一意で、これを条件に更新を行います。
以下のUPDATE文が10個ほどの並列プロセスで流れている
のですが、数百回に一度デッドロックが発生します。
条件のDとEの値は最低どちらかは異なり、確かに一意の
レコードに対して更新をかけています。
UPDATE テーブル1 SET F = '1'
WHERE C+D+E IN
(SELECT TOP1 C+D+E FROM テーブル1
WHERE D = '値' AND E = '値'
ORDER BY C)
SQL Server Profilerでトレースしたところ、上記のUPDATE文
のみによって引き起こされているようです。
DeadLock Graphを見るとKEYではなくPAGEに対して更新ロック(U)
を取り合う様が見れるのですが、ひどくぐちゃぐちゃです。
試しに条件文のSELECTのみWITH (ROWLOCK,UPDLOCK)でデバッグ
してみたのですが、大量のPAGEロック(IU)と一つのKEYロック(U)が取得されます。
C,D,Eに一意の非クラスタ化インデックスを貼ると、すっきりするのですが
PAGE(IU)とKEY(U)に2つずつロックされます。(どうして一つにならない?)
ところで、UPDATE文の中のSELECT文は何ロックを取得するのでしょうか?
更新ロック(U)、それとも共有ロック(S)を取得してからの排他ロック(X)?
長くてすいません。
よろしくお願いします。
>>979 >WHERE C+D+E IN (以下略
計算や文字列接続をするとINDEXは効かなくなる。
動かしていないけど、多分こんな感じ。
UPDATE テーブル1 SET F = '1'
WHERE D = '値' AND E = '値'
AND C IN
(SELECT TOP1 TBL.C FROM テーブル1 AS TBL
WHERE TBL.D = テーブル1.D AND TBL.E = テーブル1.E
ORDER BY C)
あと、UNIQUEINDEXはD,E,Cの順で。
>>980 本日試してみたところ、非常に高速で、
デッドロックは故意におこせないのですが、
そのテスト用アプリで生じていたページロックが
解消されました。
これで解決するか分かりませんが、しばらく様子を
見てみたいと思います。
ありがとうございました!
あーごめん俺がロックしてた
SQLServer2005で、メンテナンスプランを使って毎日1回バックアップをとろうとしています
(1つのファイルにバックアップセットを追加していきたいと思っています)。
バックアップを取る際に、最近10日分だけ残して、11日前のバックアップセットは削除したいのですが、
それにはどのようにすればいいでしょうか?
「バックアップセットの有効期限」に10日を設定するだけでは駄目なのでしょうか?
984 :
NAME IS NULL:2009/01/08(木) 15:23:55 ID:VXlkEjyg
SQLServer2005とSQLServer2008って同一PCで同時に稼動させることは出来ますか?
デキル