Microsoft SQL Server 総合スレ 6at DB
Microsoft SQL Server 総合スレ 6 - 暇つぶし2ch500:NAME IS NULL
08/10/04 19:44:41
ソートしてrow_numberつけて

501:NAME IS NULL
08/10/05 18:37:02
ご存知の方がいたら教えてください。
「MS SQL Server 2005 Express Edition」+「vb.net2005」を使用して、小規模システム構築を考えています。
(端末2、3台のクラサバシステムです)

MSのサイトで、Express Editionのメモリ使用量の制限で1GBとなっているのを見ました。
これは、OSも含めたメモリ使用量になるのでしょうか?
それとも、DB単独でのメモリ使用量になるのでしょうか?

WindowsXPにインストールしようと思っているのですが、
搭載メモリを1GBか2GBどちらにしたほうが良いかと疑問に思いました。


502:NAME IS NULL
08/10/05 19:34:38
制限4GBじゃなかったか?

503:NAME IS NULL
08/10/05 19:37:30
>>501
俺なら2GB乗せる

>>502
よく読め

504:NAME IS NULL
08/10/05 20:15:49
>>503
DB要領と勘違いしてたお^^

505:bcp
08/10/05 21:43:01
>>503 の言う通り、2GB 載せるべき。
評価用に Windows 2003 R2 + SQL Server 2005 Express Edition + 4GB
で運用してるけど、SQL Server だけで 1GB 食ってる。

506:501
08/10/07 01:30:01
皆さんありがとうございます。
SQL Server単独で1GB食うなら、OS部などを考えると搭載メモリは2GBがよさそうですね。



507:NAME IS NULL
08/10/07 06:05:10
おれなら4GB載せるけどな。

508:NAME IS NULL
08/10/07 11:26:39 rO9cgVQf
.NET2.0でSQL Server 6.5に接続したいんだが、System.Data.SqlClientって
7.0以降しか対応してないのね...orz

6.5に接続可能なプロバイダってないの?
教えてエ(ry

509:NAME IS NULL
08/10/07 12:09:22
System.Data.Odbc

510:NAME IS NULL
08/10/07 13:45:15
>>509
やっぱODBC経由しかないのかorz

ネイティブに6.5に対応したプロバイダもなさそうなので
ODBCを使うことにしますた。㌧

511:NAME IS NULL
08/10/07 18:08:57
SqlClientでもOdbcでもIDbファミリだから手順は一緒だよ。

512:NAME IS NULL
08/10/07 18:24:26
6.5は古すぎてもう忘れてしまったが、
OleDBプロバイダが使えるようならそっちの方がOdbcより親和性が高いと思う。

513:NAME IS NULL
08/10/07 18:41:49
OleDBプロバイダのサポートは7からだったようです

514:NAME IS NULL
08/10/08 03:33:48
失礼します。
bcpでデータをコピーする際、データベースにログインした状態で実行するのではなく、
普通にコマンドプロンプトで実行するのはなぜでしょうか?
1>bcp .........略.......
2>go
と最初勘違いしてやってしまいました。

515:NAME IS NULL
08/10/08 07:51:55
・バッチ書くとき楽だから。
・DB上でパースしたくないから。

516:514
08/10/08 14:20:57
>515
なるほど。たしかにバッチファイル作るとなると、そっちでないと不便ですね。
ありがとうございます。

517:NAME IS NULL
08/10/08 15:52:27
SQLCMDのT-SQLから使えるコマンドとしては
bluk insert や insert ... select * from openrowset(BULK ..) 
があり、bcpと違いロード専用。
ロードするデータはサーバー、正確にはサーバープロセスから
アクセスできるところに置く必要がある。

518:NAME IS NULL
08/10/08 21:27:40
>>501
XPをDB鯖にするのはライセンス違反だ。

519:NAME IS NULL
08/10/10 00:02:22
シーケンス使えないから糞


520:NAME IS NULL
08/10/10 13:45:19
ちょっとくだらない質問ですがお願いします。
たとえばSQL SERVER 2005で
出来ないとは思うのですが
たとえばVB.NETからSQLを発行するときにテーブルを返すタイプのストアドプロシージャは呼び出せるのでしょうか?

例:
SELECT * FROM 「1テーブルを返すストアド」 WHERE条件

それだったらストアドにパラメータを使えという話になるのですが、ちょっと気になったもので…

521:NAME IS NULL
08/10/10 14:31:39
>>520
関数じゃダメなのか?

522:NAME IS NULL
08/10/10 16:34:51
>>521
あぁっ・・・確かにおっしゃるとおりです orz


523:NAME IS NULL
08/10/10 16:52:07
SQLServer2005の全文検索はつかえないけど
SQLServer2008の全文検索はどうですか?

おとしたらisoでDVDにやけっていわれて試せてない・・・


524:NAME IS NULL
08/10/10 17:23:25
>>523
デーモンツールでも使って入れたら?

525:NAME IS NULL
08/10/10 22:19:08
>>523
2005は何で使えないんですか?え?

526:NAME IS NULL
08/10/11 00:12:01
SQL Server 2008 Express with Advanced Servicesで
ManagmentStudioからフルテキストインデックスって作れる?

なんか、うちの環境だとTransact-SQLからは作れるんだけど、
ManagmentStudioだとデータベースの中に「ストレージ」が無いし、
[フルテキスト インデックス] ダイアログ ボックスでも追加ボタンが押せなくなってる。

527:NAME IS NULL
08/10/11 01:14:17
便所の壁で仕事に関する相談かぁ

随分安っぽい仕事だな。
お客様が知ったらどんな気分だろうな。

528:NAME IS NULL
08/10/11 08:15:27
そういやこの間、この板でウチのヤツっぽい書き込み見たな。
多分、客が知っても「特定される情報がなきゃおk」で終了になるだろうけど。

529:NAME IS NULL
08/10/11 10:49:01 QblW9WIu
金もださず、時間もかけず、自ら調べようともしないで、

便所の壁に書いとけば、名無しのさんがベストな答えを出してくれるから仕事も楽々

こんな奴らに仕事を発注した会社が真っ当な賃金支払う筈ないよな

自分達の価値を貶めてる馬鹿の集いですね

530:NAME IS NULL
08/10/11 20:37:55
Windows2003 Small Business Server でSQL Server 2000 EnterPriseEditionがインストールできないのはなぜでせう

531:NAME IS NULL
08/10/11 22:20:10
>>530

1.福田のせい

2.小泉のせい

3.竹中のせい

ですね。

532:NAME IS NULL
08/10/11 23:11:37
>>531
違うよ

・麻生のせい

だよ。

533:NAME IS NULL
08/10/11 23:39:03
>>532
チッ

534:NAME IS NULL
08/10/12 02:46:22
あっそぅ

535:NAME IS NULL
08/10/12 19:14:49
>>518
501ではないが
どどどど、どのライセンスに抵触しますか?(滝汗

SQL Server 2005 Expressのライセンス条項で明示的に禁止されてる中にはOSの制限はなかった。
とはいえ、許可されてる範囲がいまいち明示されてないので断言できず、、


536:NAME IS NULL
08/10/12 19:29:22
SQL Server 2005 Expressには制限はないがOSに制限される。
XPはサーバーとして使用してはいけないが、ピア接続など一時的なものはかまわない。
その2~3台のクライアントがあるシステムがどちらに含まれるかという部分にかかっている。
定常的にクラサバとして使用するならピア接続の範囲を超えている可能性がある。

537:535
08/10/12 20:08:23
>>536
なるほどこれか
URLリンク(itpro.nikkeibp.co.jp)

なお、マイクロソフトOS別利用許諾契約まとめ(っぽいもの)↓
URLリンク(www.geocities.jp)

538:NAME IS NULL
08/10/13 03:17:04
確かバックエンドとして使っても駄目なんだよな、.NetのWebアプリから使われるとかも。
でも当然DB鯖自体は外に出ないので内部通報者でもいない限りばれっこない。
ライセンスが馬鹿げてるんだからしょうがない。

539:NAME IS NULL
08/10/13 04:01:31
>>538
> 確かバックエンドとして使っても駄目なんだよな、.NetのWebアプリから使われるとかも。
Xpの制限、接続の種類別本数制限だから、バックエンドとしては問題ない。

ただ必要ライセンス数は減じない。


540:NAME IS NULL
08/10/13 05:13:33
アパッチェとかじゃ.NETサーバーできんの?

541:NAME IS NULL
08/10/13 05:55:06
>>540
 遊びなら
URLリンク(sourceforge.net)
URLリンク(anmar.eu.org)
このあたりから調べれば

実用ならわからん


542:NAME IS NULL
08/10/13 07:06:18
英語だけどなんとか調べてみるわ

543:NAME IS NULL
08/10/14 16:39:33
.net framework 2.0 + winアプリ + sql server 2005 Enterprise
の環境で実現したいことは
データベースの該当3テーブルに悲観的なロックをかけて他からのアクセスを完全に防いだうえで処理したいと考えています。

恐らくトランザクションの開始時に
BegginTransaction(分離レベル:恐らくSerializable?)
というようにしてロックレベルを指定するような気がするのですが、確信が持てないのと
このままで普通に処理していくと指定したテーブルのみロックをかけるような事が出来ないような気がします。

何らかの情報等あれば頂けないでしょうか?
説明不足の部分や、自分自身 トランザクションとロックの使い分けと違いが微妙な部分があるのですがよろしくお願いします。


544:NAME IS NULL
08/10/15 01:13:15
カラム名を英語で作成しているのですが、
カラム名と日本語カラム名の対応テーブルを
使用して上手く表示させるにはどうすればよろしいでしょうか?

545:NAME IS NULL
08/10/15 02:06:29
シノニムのことかい?

SELECT tbl.ENGLISH_NAME 日本語名 FROM tbl

546:NAME IS NULL
08/10/15 04:48:35
SQL Serverで行ってみようはまだ買えるんかい

547:NAME IS NULL
08/10/15 14:16:36
>>403
URLリンク(sqlserverbuilds.blogspot.com)

548:544
08/10/15 23:08:13
>>545
すみません。説明が分かりづらいと言うか、テーブル構造が悪いのですけど

TableA
ID|列A|列B
---------------
1|10 |20


TableB
列名|名前
---------------
AAA|あああ

とあった場合、ID=1で抽出すると

AAA|10
BBB|20

の結果を得たいのですが可能でしょうか?

549:NAME IS NULL
08/10/15 23:26:01
>543
トランザクションを開始した後にまず
WITH(XLOCK, TBLLOCK)
とでもしたクエリを流せ。

550:NAME IS NULL
08/10/16 00:25:44
>>548
SQLの前に説明の仕方を勉強汁

551:NAME IS NULL
08/10/16 01:19:28
>>548
inner joint を使えばいいと思うけど、得たい結果のテーブルの説明が無いので何とも言えない。

どっちかって言うとこっち向き。

SQL質疑応答スレ 7問目
スレリンク(db板)

552:NAME IS NULL
08/10/16 01:21:39
>>548
以前のプロジェクトで同じようなケースあったが
…スマン忘れたww

553:NAME IS NULL
08/10/16 01:36:27
>>548
無理だろ、、、どこにも紐付いてないだろ、、、

554:492
08/10/16 17:12:50
>>548
ちょっと待て、
> BBB|20
はどっから出てきた。
というか、TableBにID列はないのか?

>>544>>548の関連も不明だし。

あと、TableAは正規化する余地があると思うぞ。


555:NAME IS NULL
08/10/16 17:31:44
いかん、名前欄を消し忘れた(笑)。

まあ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列がないなら、結合するためのキーがないからどうしようもない。


556:NAME IS NULL
08/10/16 21:06:23
>>555
お前さんがちょっと面倒見がよくてよく回答してる奴だってことはわかった

557:NAME IS NULL
08/10/16 21:54:47
わざと、聞いてるんじゃないの、答えられない馬鹿を釣る為に。



558:NAME IS NULL
08/10/17 01:38:51
疑いだしたら匿名掲示板はNO RECORDです

559:544
08/10/17 10:28:08
すみません、訂正して再質問させてください。
釣りでは無く本当に困っているのでどうか助けてください。

<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>の全て取得したい。
②各テーブルは最新の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
08/10/17 10:32:11
>>555
Viewを使っての(見かけ上)別レコードにする方法試してみます。
ただ、TableAが200列とかあるので遅くなりそうな・・・。
構造は変えられないので正規化できないですし。

連投すみません。

561:NAME IS NULL
08/10/17 13:36:10
CLRってマルチスレッド使える?

562:NAME IS NULL
08/10/17 14:54:34
先物一回死んで・・

563:NAME IS NULL
08/10/17 14:55:27
誤爆

564:NAME IS NULL
08/10/17 20:21:41 YYMduugc

どなたか分かる方がいましたら教えてください。

SQL Server 2005 EnterpriseEditionを使用しています。
ManagementStudioで作成したデータベースのプロパティを開きました。
そのダイアログ内に
・「ANSI 警告有効」
・「算術アボート有効」
・「ANSI NULL 有効」
などTRUE/FALSEで設定できる項目があるのですが、
どう設定を変えても設定が反映されていないように思います。

何かご存知でしたらお願いします。


565:NAME IS NULL
08/10/17 22:12:12 YYMduugc

追記です。

>どう設定を変えても設定が反映されていないように思います。

GUI上では値は変わっているのですが、
その後、Javaでクエリを発行しても、
その設定が有効になっていないような結果になってしまう
ということです。


566:NAME IS NULL
08/10/17 22:51:42
SQL Serverへの接続時オプション?

567:NAME IS NULL
08/10/17 22:54:17
>>565
SQLCMDではどうですか?
OLEDB/JDBC/ODBCなどの場合は接続時に
自動的にSET ANSI_NULL ON などのコマンドが発行されて特定の状態に上書きされるはず。


568:NAME IS NULL
08/10/17 23:52:36 nUyHAdFv

>>566
返信ありがとうございます。
SQL Server全体の設定(サーバのプロパティ)ではなくて、
データベースの設定(データベースのプロパティ)だったと思います。

>>567
返信ありがとうございます。
なるほど~。
やはりGUI(ManagementStudio)だけではできないですか。


569:bcp
08/10/18 09:24:25
>>568
> なるほど~。

何がなるほどなんだか。

>>568 は、Management Studio の事なんか書いてないだろ。

Java でできないのは、JDBC とかの影響だから、直接 SQLCMDで試してみろって
言うだけのことだよ。

別に、Management Studio からクエリ発行して試すのでもいいと思うけど、
よくわからんのならまずは「言われた通り」やってみなよ。

570:NAME IS NULL
08/10/18 20:41:44
以下の手順で、SQLサーバを丸ごと移行できるのか確認したくて質問しました。

ある、SQL Server 2000 Developer Edition が動いているマシンにて、
SQLサーバを止めて、以下のデータのコピーをとる。
C:\Program Files\Microsoft SQL Server\MSSQL\Data
次に別のマシンに、SQL Server 2000 Standard Edition をインストールする。
そして、SQLサーバを止めて、同様の場所にあるDataフォルダの中身を
ごっそりと入れ替える。そしてSQLサーバを起動する。

これ以外に、何か設定ファイルを保存しておき、移す必要はあるのでしょうか?
私の方で行っている範囲では、この作業で問題無く動いてはいますが、
見落としがありそうな気がしていて、不安です。
非常に初歩的な質問ですが、よろしくお願いします。

571:NAME IS NULL
08/10/18 21:57:41
>570
普通はデタッチしてアタッチし直す。

572:NAME IS NULL
08/10/18 23:23:37 1KkMfcNq
>>569

職場でしかManagementStudioを使えないので、
月曜にやろうと思います。
家にあればいいんですけどね。



573:NAME IS NULL
08/10/19 00:13:01
Webでよくある、複数条件での検索指定の場合のセオリーってあります?
単純に条件 IN(@条件文字列)だと効率悪いですかね

574:NAME IS NULL
08/10/19 00:14:19
補足です。

複数条件 と言うのは、 Googleの検索条件でスペース区切りで指定する場合などです

575:NAME IS NULL
08/10/19 01:12:53
>>573
SQLでのINはパフォーマンスに大きく作用する。多用すべきではないと言われている。

ぶっちゃけパフォーマンスを気にしなければ行けないのは、全レコード(行数)が1万のオーダーを超えてから。

576:NAME IS NULL
08/10/19 01:37:12
>>546
2008年3月初版の本がもう手に入らんのか、、


577:NAME IS NULL
08/10/19 02:03:10
>>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文にパフォーマンス上の差異はない(実行計画が同じになる)。


578:NAME IS NULL
08/10/19 02:15:26
exists

579:NAME IS NULL
08/10/19 02:21:45
>exists
mjk


580:NAME IS NULL
08/10/19 03:42:11
>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
08/10/19 03:46:03
訂正:
誤: (1) SELECT * FROM foo WHERE x NOT IN (SELECT y FROM bar)
正: (1) SELECT * FROM foo WHERE x IN (SELECT y FROM bar)

582:NAME IS NULL
08/10/19 09:42:59
>>571
ありがとうございます。調べてみます。

583:NAME IS NULL
08/10/19 12:15:41
すいません、質問です。

SQL Server では「管理」のところでシステムのログを見たり、現在どのユーザが
接続しているかを確認する機能はありますが、どのマシンがどんなSQLコードを
実行したかを見る機能はあるのでしょうか。
もしそれが無いとすると、その履歴を吸い出すためのツールはあるのでしょうか。
保守的な意味合いで、実際にテーブルを開いてチェックする以外の方法で、
具体的にどのテーブルのどのデータが操作されているのかを随時チェックしたいのです。

584:NAME IS NULL
08/10/19 12:34:13
>>583
なんとかってツールがデフォで入ってるだろ
スマンが名前は度忘れした…

585:NAME IS NULL
08/10/19 12:37:35
>>584
Enterprise Manager、クエリアナライザ、このあたりでしょうか?

586:NAME IS NULL
08/10/19 12:47:03
SQL Server Profiler

587:NAME IS NULL
08/10/19 12:48:03
つか2000かよ。知らね。

588:NAME IS NULL
08/10/19 17:42:40
>>586
それだ!

589:NAME IS NULL
08/10/19 18:58:13
2000でもプロファイラはありました。英語がカタカナ表記になっているだけのようです。
調べてみると、どうやらそのツールを使うようです。
TSQL の SQL:BatchCompleted をトレースするイベントクラスとして設定していると、
DBにアクセスしてきたSELECT文が拾えるところまで確認出来ました。
ツールをある程度使ってみての質問なのですが、トレースした後、その結果に
フィルターをかけて「TextData」が「SELECT ~」のみを表示とか出来なさそうですが、
ユーザDBに対してのSQL文のSELECTやUPDATE文のみを抽出する良い
方法ってないのでしょうか。

590:NAME IS NULL
08/10/19 19:37:12
トレースプロパティのフィルタにて、ApplicationName の項目を工夫するくらいしかないのかなぁ。
あと、このトレース結果を保存する際、トレースファイルとしては保存出来るが、CSV形式ファイルに
出力とか一発で出来ないみたいだね。
一度データベースに保存してそれからCSV変換となりそうだぎゃ。
解析するまでの過程が面倒だ。

591:577
08/10/19 20:13:01
>(ADO.NETでWHERE句を本気で実行時に動的に書き換えたいなら、データアダプタをサブクラス化でもする他ない。)
スマヌ、知ったかこいた。もはや573が知りたがってることとは遊離してるのは明らかかもしれんが訂正する。
正解はデータアダプタの改造でもサブクラス化でもなくて、↓これ(テーブルアダプタの拡張)。
URLリンク(www.atmarkit.co.jp)

もちろん上記方法によらず自力で平にSQLを書いてSqlCommand.CommandTextにセットして実行する手はいつでも使えるわけだが、
その場合データのバインドやパラメータのエスケープを自作ルーチンで賄うことになり、
個人的には特に後者がセキュリティー上のリスクを高めるので問題だと思う。


592:NAME IS NULL
08/10/19 20:31:54
> ADO.NETだと @条件文字列="A B C D" の場合、IN('A B C D') とエスケープされてしまうわけだが。
パラメータの中のシングルコーテーションをクエリの一部として解釈されるならパラメータにする意味が全くないだろ。
スペースで区切った文字列でもあくまでスペースが含まれている文字列でしかない。
CommandTextをパラメータの数に応じて動的に作るだけだよ。渡すパラメータも動的に追加する。
死ぬほどパラメータが多いときやパラメータ数が予測できないときはお勧めしない。
パラメータ数の上限に引っかかる。2100個だけど上限なしに指定出来るようなときは引っかかる。
INでクエリ以外で固定のパラメータをたくさん入れると
時々とんでもない実行プランになることがあるので動作速度も予測できない。

パラメータとして渡したいものを一時テーブルに突っ込んでそれをサブクエリにするとかが堅いけどちょっと面倒。
一時テーブルに突っ込む過程でパラメータ数が多いと工夫しないとそれなりに時間がかかってしまうという欠点もある。

あと、文字列をそのままパラメータ以外で突っ込むのは論外。
Unicodeとかいろんな文字コード経由とかもあってどんなに頑張っても気づかない穴が発生する。
ちゃんとパラメータで渡せるようになんとすること。

593:577
08/10/19 20:32:01
>パラメータのエスケープを自作ルーチンで賄うことになり、
>個人的には特に後者がセキュリティー上のリスクを高めるので問題だと思う。
重ねてスマン、良く考えたら573に書いてあるような "IN (@検索条件)" みたいなWhere句の論理構造自体を書き換える場合でも、
パラメータのエスケープを自作ルーチンで賄わずに済む方法はあるな。これはテーブルアダプタの拡張とは独立の話だった;
語りたがりな初心者の戯言として忘れてくだされorz


594:577
08/10/19 21:10:18
>>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的にもよさげ?


595:NAME IS NULL
08/10/19 21:25:12
>594
パラメータで渡すってのはそもそもエスケープとかするのとは関係ない、
パラメータ部分はあくまで変数でクエリの意味には影響しない部分。
シングルコーテーションやいろいろ記号を入れようが文字コード外の値を入れようが
あくまでそういう値の文字列変数とフィールドの値を比較といった感じで扱うだけ。
これはいろいろエスケープするのでは絶対に越えられない壁。

そんな感じのクエリを動的にパラメータの数だけ増やせるように作ればいいよ。
パラメータの数が多くなければそんなに問題が起きるようなこともないし。

596:NAME IS NULL
08/10/19 21:59:43
パラメータを利用したSQL文ではSQLインジェクションは発生しないとされる(URLリンク(www.atmarkit.co.jp))。
これが可能であるためには、例えば
 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持ってる人だれか調べれ

597:NAME IS NULL
08/10/19 22:09:25
答えとしては、これか。
URLリンク(itpro.nikkeibp.co.jp)
パラメータはSQL本体とは別に送られるのであって、エスケープでしのいでるんではない。
ていうか、文字列途中の[']を勝手に['']にエスケープしたらイカン。検索が致命的に働かなくなる。


598:570
08/10/20 11:14:38
>>571のアドバイスを元に調べてみて、やってみました。
今まで、移行が出来なかったDBもアタッチを使うことで出来ました。
ありがとうございます。

念のため確認したいのが、デタッチしてファイルのコピーをするのと、
SQL Server を停止してファイルのコピーをするのは同じことですよね?
デタッチそのものに何か特殊な処理があるのでしょうか?

599:570
08/10/20 13:32:54
調べてみたところ、サービスを停止してのコピーは、良くないようですね。
以下のページの一番下に書いてありました。
URLリンク(www.sqlpassj.org)
> データベースサービスの停止は、原則的には、クリーンシャットダウン扱いではない。
自己解決しました。

600:NAME IS NULL
08/10/20 17:49:31 Fvc0cWYg
質問です。

・本社にSQL Server 2005
・本社と支店をVPNで接続
・支店クライクライアントPCはサーバPC名の名前解決済み

という環境で、支店から本社サーバPCのデータベースAAAに、
ODBC接続を設定しようとすると、規定のデータベースを変更するのところが、
masterとかNorthwindなどの初期のものしか表示されません。
本社ネットワークからODBC接続を作成しようとAAAが表示されています。

何が原因でしょうか?
よろしくお願いします。


601:NAME IS NULL
08/10/20 19:16:26
>>600
真っ先に思い浮かぶのは、AAAへのログインが成功しているかどうかでしょ。
何か特別にパスワードなどを設定しているかどうか。

602:NAME IS NULL
08/10/20 19:58:39
すみません、質問です。

あるベンダさんがSQL Server 2kでシステムを入れたのですが、それには
データベースを毎日深夜に自動的にDATにバックアップするツールが
ついてました。ベンダさんは、「これで時間設定すると便利ですよ」と
紹介をしていたのですが、これって、そういうツールをいれなくても
EnterpriseManagerで出来ますよね。
どうしてツールを入れる必要があったのかが疑問で聞いてみたくなりました。
(ベンダさんは、内部仕様についてはなかなか教えてくれません。設計仕様だとか
これがサポートの形だとかそういうぼかす言い方しかしませんので)

バックアップツールの機能は、指定した時間にDATやHDDなど指定したところに
データベースの完全バックアップを行うのみです。

603:NAME IS NULL
08/10/20 20:24:34
>>603
正直、NTBACKUP.EXEは使いたくない(笑)

多分、バックアップするツールってArcServeとかBackupExeとかだと思うけど、
テープへのバックアップだったら、そっちを使ったほうが良い。

昔、自分もWindows標準のバックアップツールを使っていたけど、
バージョンによって仕様(コマンドラインのオプションとか)が変わるんで、
自分のところもテープを使う場合にはツールを使ってバックアップするようにした。
※Windows Server 2008になって、またバックアップのコマンドが変わったし。



604:bcp
08/10/20 21:02:31
※ そもそも素の 2008 では、テープへのバックアップはできなくなったよ。

605:NAME IS NULL
08/10/20 21:23:26
標準ツールを使うバッチファイルをタスクスケジューラに登録しただけなんでないかな

606:NAME IS NULL
08/10/21 03:21:48
>>602
できれば、そのツールが何か教えてもらえませんか?
(JP1だったら日立確定。まあ、JP1ではテープに出力昨日は無いけど)


607:NAME IS NULL
08/10/21 09:18:21 N1IgYAGM
>>601
レスありがとうございます。
パスワードとかは特に設定はしていないですね。
でも、SQL Serverの設定でしょうね。
もう少し調べてみます。
ありがとうございました。

608:NAME IS NULL
08/10/21 09:49:09 N94vUEPB
ここにいらっしゃるみなさんの環境についての質問です。

SQL Server でデータベースを作る際、ビューやストアドプロシージャを
全く作らずにテーブルの作成のみで、後はクライアントのアプリの方で
直接テーブルのデータを操作するという設計をすることは普通に
あるのでしょうか?
これはその設計方針次第といってしまえばそうなるのでしょうが、
製品自体が頻繁に仕様変更のバージョンアップがあり、それによって
旧バージョンとの互換性が無くなる部分が多いとか、他のデータベースへの
移植の可能性があるなどの状況を考えると、多少パフォーマンスを
悪くしても、そういうテーブルのみといった作り方の方が良いのでは
と思います。

パッケージにおいて、サーバは PostgreSQL か SQL Server かを選べるタイプのを
見ると、これは SQL Server はテーブルのみじゃないのかなと思えてしまいますが。

609:NAME IS NULL
08/10/21 12:36:23
>>608
小規模な開発以外はありえない。
それに最近の開発はビジネスロジックは分離する思考になってるし。

610:NAME IS NULL
08/10/21 12:38:04 zImtCADo
>>608
零細企業だけどうちは普通にあるなぁ…
特に頭の固い連中がいうのは

1.ビューはインデックスがうんたらかんたら・・・
 別に最近ではいけてると思うんだけど・・・・

2.ストアドにしてアプリとは別にPG組んでもどうせ設計が変わったら両方修正が・・・
 これに関しては否定はしないが、速度面では集計とかはストアドに任せたいんだけどなぁ…
 マスタ管理レベルはいらないと思うけど

3.移植が・・・・
 データベースとアプリのちょっとした設定程度だけの移行で済むのならSQLの方言程度だと思っているのであんま考えないかな

でも、システムの要件とか含めて結局総合的に考える必要があるから一概にこれが答えとは言えないけど
うちは1,2,3含めてパフォーマンスが少々気になっても>>608と同じような感じになってる
ハードの質でも吸収できる部分もあるし

PS.俺的にはパフォーマンスをやっぱり重視したいところが多いけど

611:NAME IS NULL
08/10/21 14:13:06
SQLServer2005 32bitをつかっています
パフォーマンスモニタを見ているとピーク時にはCPU100%になって
下がってきません
その割にはメモリはほとんど使っていません
4Gの壁云々の前にメモリをフルにつかってCPU負荷を下げたいのですが


612:NAME IS NULL
08/10/21 15:02:39
>>611
メモリをあまり使わない必死処理が入ってんじゃないの

613:602
08/10/21 19:51:57
みなさん、レスありがとうございます。

仕様や動作確認などが関係してたんですね。納得しました。

>>606
このツールは、「バックアップツール」とだけ書いてあるのですよ。
起動した画面もメニューは上の方に無く、ボタンだけの構成で、
誰かがVB6で作ったっぽいの感じの雰囲気のものです。
このツールを使えば、テープに記録は出来ますし、テープから、
データベースへの復旧もボタンをクリックするだけで出来ます。
(復旧はそういう場面がなかったのでまだやったことがないけれど)

614:NAME IS NULL
08/10/21 21:24:23 Fio76aGW
すみません、初歩的な質問ですがお願いします。

SQL Server 2000 をインストールした後、リモート接続が出来る様に
するにはどのようにしたらよろしいのでしょうか。2005などの場合は
ドキュメントがすぐに見つかるのですが、2000とはメニューなどが
変わっているため、その操作が出来ませんでした。
ヒントとなる言葉でも結構ですのでお願い致します。
URLリンク(support.microsoft.com)

615:NAME IS NULL
08/10/22 00:18:34
SQLServer2005でテーブルに入っているレコードでInsert文を作りたいのですが、
何かいい方法ありますか?


616:NAME IS NULL
08/10/22 00:31:17
>611
プロファイラ見てDurationが長くてCPUが妙にでかい数字たたき出してるものをピックアップして重いクエリから順に直す。
インデックスが効いてないとかそういうのはメモリをひたすらキャッシュに使う方向になるので
メモリ使用量がぎりぎりまで増える傾向があるのでもっとろくでもない処理でもやってるんじゃないかな。

617:NAME IS NULL
08/10/22 00:33:10
>614
2000はデフォルトで接続可能だったはず。
デフォルトの接続設定が厳しくなったのは2005からだよ。

618:NAME IS NULL
08/10/22 01:22:49
>>617
別のPCから接続出来ました。アドバイスありがとうございます。

最初、エラーで接続出来なかったので、SQL Server側の設定の問題かと思い、
いろいろと調べていて、それでも分からなくて質問をしたのですが、
ご回答を元に、OSレベルの接続の部分を見直してみると、うまくいきました。
ありがとうございました。

619:NAME IS NULL
08/10/22 01:23:27
営業所コード , 営業所 , 規模
100 , aaa , 5
101 , bbb , 7
101 , cccc , 6


620:NAME IS NULL
08/10/22 04:01:15
>>615
insert ~ select ~

621:608
08/10/22 09:18:05
>>609
確かに、ビジネスロジックは分離した方が整理しやすくなりますよね。


>>610
テーブル数はどのくらいですか?
私は、1つのデータベースにおいてテーブル数が100を超えるのに、ビューや
ストアドを作ってないのを見たことがあるのですよ。

622:NAME IS NULL
08/10/22 10:14:48
すいません、質問です。

現在SQL server 2005 Express Editionを使っているのですが
Windows Internal Databaseをアンインストールすると
SQL server 2005 Express Editionも削除されてしまうのでしょうか?




623:NAME IS NULL
08/10/22 11:25:22
2005 スタンダードです。

以下の文の場合、全レコードが返ってきますが、コードが重複しないように
パターンの文字数の大きいものを優先して返してほしいですが、どのように書けばいいでしょうか??

SELECT * FROM テーブル名 WHERE 'C' LIKE パターン

コード、パターン、値
-----------
A01、%、 10
A01、C%、20
B01、%、 30

624:NAME IS NULL
08/10/22 14:58:49
ORDER BY LEN(パターン) DESC
でいいんじゃね?

625:NAME IS NULL
08/10/22 15:07:52
test

626:NAME IS NULL
08/10/22 15:14:55
XP HomeにインストールしたSQL Serverにリモートのmanegement studioからログインすると
ログイン名がGuestになるんですがこれって仕様なんでしょうか testしてごめんなさい

627:NAME IS NULL
08/10/22 15:28:31
>>617
2008はデフォルトでリモート接続可だった。
デフォルトでダメなのは2005だけか?

628:NAME IS NULL
08/10/22 16:32:14
>>626
もう少し状況を詳しくw

こっちではXPHome使ってるけれど、プロファイラでトレースしてると
LoginNameの欄は
ネットワーク上のコンピュータ名\WindowsXPのログイン名
が表示されるよ。

629:NAME IS NULL
08/10/22 16:35:58
では、逆にSQL Server 2000 でリモート接続を切るにはどうしたらよいのでしょうか?
メニューが無い為そういうこと自体が無理?

630:NAME IS NULL
08/10/22 16:58:03
>>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アカウント経由になることと関係がある
んでしょうか


631:NAME IS NULL
08/10/22 19:01:23
623です。

>>624
コードが重複しないように取りたいのですが。
これだとA01の行が2行返ってきてしまうので・・・

632:NAME IS NULL
08/10/22 19:19:03
>>621
テーブルが多いからビューを作らなければならない訳ではない事ぐらい分かるよね
ストアドも同様。

633:NAME IS NULL
08/10/22 19:29:05
ビューを作るのとストアド作るのは別問題っしょ

634:NAME IS NULL
08/10/22 20:28:34
質問

ネットワークを通じてMS-Accessを使ってSQL Serverに接続する際、
SQL Server認証は成功しますが、これをWindows認証にすると
失敗してしまいます。

SQL Serverが入っているPCにて、SQL Serverに接続する際は、
SQL Server認証もWindows認証も成功します。

通常、こういうことが起きることは無いと思っていたので、
不思議でたまりません。これは、どのあたりの設定を
見直すとよろしいのでしょうか。

635:NAME IS NULL
08/10/22 20:55:45 tDMckeFO
すみません、質問です。
本番sql server からバックアップしたデータベースを
ローカルのsql serverで復元したいです。

本番と復元先はデータベース名が同じです。
バックアップファイルが最新のものなので
現在ローカルにある同名のデータベースに上書きと言う形で復元したいです。
バックアップは、データベースを右クリックして
タスクからバックアップという形で行いました。
現在の状況としては、復元しようとすると「セッションが使用中なので
復元出来ない。managerの使用をお勧め」とでます。
色々調べたのですが、既存のデータベースを変えればいいとは載っていても
実際どうやればいいのかが分からない状態です。
復元のオプションでmdbとldf?ファイルが設定されていましたが
その復元先がDドラに指定されていました。
Dドラは使用していないのに何でなのでしょうか。そこが原因?
明日会社で出来ないと困るのでどなたか教えて下さい。
初心者の質問で申し訳ないのですが、よろしくお願いします。




636:NAME IS NULL
08/10/22 21:06:00
>>634
今までは正常にログインできていたのが、急にできなくなったのですか?

あと、サーバーとクライアントはドメイン(Active Directory)に参加していますか?
それともワークグループで運用していますか?

確認方法としては、SQL Server Management Studioで[セキュリティ]-[ログイン]に
Windows認証でログインするユーザー/グループが登録されていないとか?

あとはログに失敗時のログ残っているかでしょうか。


637:NAME IS NULL
08/10/22 21:12:16
>>634
ネットワークを通じてAccess使わずにWindows認証で接続できるか確認。
それで原因の切り分けできる。

638:NAME IS NULL
08/10/22 21:33:29
>>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
で済むんだけど。


639:NAME IS NULL
08/10/22 21:50:46
>>635
この前も言っただろ。

640:NAME IS NULL
08/10/22 22:08:30
>>638
めっちゃくちゃ助かりました!
こんな細かく丁寧に書いてくれる神がいたとは。
本当にありがとうございました!!これで安心して寝られます。

>>639
この前?何日のレス?
俺が書き込んだのは初めてだけど
参考にしたいんでレス番教えてくれると嬉しいです。

641:NAME IS NULL
08/10/22 22:16:57
640だけど、すみません、もう一つ質問が。

復元する時って復元先の(ローカル)sql serverに接続して
行うんですよね?
AというバックアップファイルをローカルのAというデータベースに
上書きしたいとしたら、ローカルに接続して、ローカルのAというデータベースを右クリックして
>>638に書いてくれたことを実行するってことでOKでしょうか?
それともODBCとかの接続の関係?これは全然関係無い?



642:NAME IS NULL
08/10/22 23:22:25
>>641
ローカルに接続して、「ローカルのAというデータベース」以外で、T-SQLを実行


643:NAME IS NULL
08/10/22 23:27:18
>>641
ODBCとか関係ない。
SQL Management Studioでログイン(当然sysadmin権限があるユーザーで)して、操作すればOK。

> 上書きしたいとしたら
それが[既存のデータベースを上書きする]をチェックする理由。
(まあ、実際はトランザクションログが残っている状態だと上書きできないからだけど)

あと、一応データベースのプロパティを確認して、データ/ログファイルの保存先を確認して
復元先を合わせたほうがいいと思う。


644:NAME IS NULL
08/10/22 23:55:19
>>631
SELECT TOP 1 なんちゃらかんちゃら ORDER BY >>624

645:NAME IS NULL
08/10/23 00:06:20
>>629
SQL Server ネットワークユーティリティで有効になっているプロトコルをぜんぶ削除

646:NAME IS NULL
08/10/23 00:14:02
>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などで片方を残すか。

647:NAME IS NULL
08/10/23 00:40:12
>>642
>>643

なるほど。分かりました。ありがとうございます!
明日頑張ります。

648:629
08/10/23 07:56:00
>>645>>646
ありがとうございます。
確かに、スタンドアロンで使う目的でSQL Server 2000 を入れることは
ありませんね。ネットワークを通じての時しか使わない。
パッケージでもたまにありますが、その時は、LANケーブル自体が接続
されていないとかですしね。

しかし、試験サーバでその操作をする必要があったので、設定のアドバイスは
助かりました。今度やってみます。

649:NAME IS NULL
08/10/23 16:30:16 JH33FFPU
質問です。
フルテキスト検索を行っているのですが、
実際に検索をかけるとかなりの時間を要します。長いと30秒くらい。

挙動を見ていると、時間をあけてSQLを発行すると遅い。
時間をあけてるときにテーブルへの変更が無くても遅い。
2回目以降は条件を変えても早い、同じカタログの別テーブルも早い。

フルテキストインデックスは CHANGE_TRACKING AUTOで作成、
検索はcontains句を使用しています。
アドバイスいただけると幸いです。

650:649
08/10/23 16:35:05
ちょっとわかりづらかったので補足。

要は、ある程度の時間をあけて検索すると遅い、
1度結果が返ってくれば2回目以降は即座に結果が返ります。

それと環境書き忘れました。

DB:SQL Server2005 Standard
OS:2003 server

対象テーブルは1万件程度、フルテキスト検索の対象カラムは8個です。
よろしくお願いします。

651:NAME IS NULL
08/10/24 00:52:40
>650
自動終了のオプションでも入っているとか?

652:NAME IS NULL
08/10/24 01:40:17
>>650
HDDが寝てるとか?

653:NAME IS NULL
08/10/24 02:40:08
2回目早いのは単にキャッシュでしょ


654:NAME IS NULL
08/10/24 03:56:44 EMvKOCzo
超初心者ですみませんけど、
無料で配布してたんで、飛びついてsql server 2008をインストールしたのはいいんですけど、
データソースの資格情報の入力の部分で、
ユーザー名、パスワードが求められるんですけど、
パスワードとか身に覚えないんですけど、
何処に行ったら取得できますか?

655:NAME IS NULL
08/10/24 04:02:43
>>653
条件を変えても有効なキャッシュ、かぁ。

656:NAME IS NULL
08/10/24 04:04:07
>>654
Windows認証なら適したユーザ名とパスワード
SQLサーバ認証なら設定したIDとパスワード

657:NAME IS NULL
08/10/24 09:32:05
Windows認証ってよくわからないんだけど、
クライアントでManagementStudioなんかのログイン画面でWindows認証選ぶと
ユーザがドメインアカウントに固定されてパスワードとか入力できないんだけど、
SQLサーバはAD参加必須ってことですか?

658:NAME IS NULL
08/10/24 12:11:35
>>655
条件変えてもと言うか、検索対象は変化ないので。

659:NAME IS NULL
08/10/24 13:56:13
>>657
ワークグループで運用する場合、クライアントとサーバーで
ユーザー名/パスワードが同じだったらログインできる(はず)。

ユーザーが多くなると、クライアントにもサーバーにもアカウントを作成しないといけなくなるので
Active Directoryが有効になってくる。

とりあえず共有フォルダのアクセス権と同じと考えればいいと思うよ。


660:NAME IS NULL
08/10/24 15:21:34
なんでM$のパンフレットは、分かっている人に対して分かるような
説明しかしてないんだろうな。
それまでMS-Accessしか触ったことが無く、これからSQL Serverを触って
勉強しようという意欲を持っている人向けの書き方じゃないよね。あれ。
ある程度中身を触って、そのツールや役割の把握が出来て、やっと
パンフレットに書いてあることが理解できつつあるw

みんな勉強をする大まかな手順としては、やっぱり、付属の冊子や
パンフレットは無視して、入門書を買ってそれを読んでから、
分厚い公式文書やヘルプのドキュメントを読むという手順なのかな?

661:NAME IS NULL
08/10/24 19:05:16
>>659
レスthx

クライアントがAD参加してて、サーバが参加してないんだけど、
クライアント側でWindows認証を選ぶとユーザIDの項が【ドメイン\ユーザ】に固定される。
この状態でログインを試みると「信頼性が~云々」エラーが出て繋げない。
まぁこれは理解できる。
このときにユーザIDを【SQLサーバ\SQLサーバ用ユーザ】とかでつなげることを期待してた。(←共有フォルダはこれでいけるし)
考えてみれば、これならSQLServer認証と変わらんか。

662:NAME IS NULL
08/10/24 19:34:23
複数のクライアントからADO(Excel VBA)を使ってSQL Serverのデータを取得したいのですが、
ドメイン環境が無い場合は、Windows認証使えませんよね?
(同じユーザー名とパスワードを両方登録しておくという荒業は勘弁してね。)
SQL Server認証にした場合は、SQL Serverを動かしているサーバー上でGuest
アカウントを有効にするしかないのでしょうか?
どなたか、ベストプラクティスをお示しあれ~。

663:NAME IS NULL
08/10/24 21:46:52
SQLサーバにユーザ作ってそのアカウント使えばいいんじゃないの?
2005だとそんなことはできない、だったらごめんね。

664:NAME IS NULL
08/10/24 21:48:43
普通に作れるね。
Guestアカウントって話はどこから出てきたんだろう?

665:NAME IS NULL
08/10/24 22:07:50
はぁ? 技術力の無いアホが立て続けに落書きしてらぁ。
OSのセキュリティについて知識無しの中学生君かな。

666:NAME IS NULL
08/10/24 23:12:07
>>662
1.サーバーのプロパティを、[SQL Serve 認証モードとWindows認証モード]にする。
2.[セキュリティ]-[ログイン]で、(SQL Serveri認証で)必要なユーザーを登録する。
  この時、既定のデータベースや必要なアクセス権を設定する。
  (例えば、読み取りしかさせたくないユーザーは[db_datareader]をチェックするとか)

だけで済むんで、Guestアカウントは全く関係しないけど。
Windows認証の時と勘違いしていないかな?


667:NAME IS NULL
08/10/24 23:17:47
ちょい荒れ気味のようですが、質問です。

SQL Server を使ったパッケージが納品されている場合、
そのサーバでプロファイラで解析しながらクライアント
アプリを動かせば、テーブル情報が開示されたのと同じ
ような状況と見てよいのでしょうか?

ま、これをやるのはライセンス的な問題などがあるのでしょうが、
納品するパッケージにおいて、基本的にデータベースの
テーブル情報は開示しませんし、内部の動きについては
原則非公開となっています。しかし、顧客側にちょっと知っている
人がいると、実質そのパッケージのデータベースが丸見えに
なってしまうのを販売側(開発側)は受け入れるしかないのかなと
思いまして、質問しました。

668:bcp
08/10/24 23:18:09
>>662
> どなたか、ベストプラクティスをお示しあれ~。

「いちいちユーザー管理はしたくないけど、セキュリティは完璧にしたい」
と言うのがベストプラクティスと言うなら、賢い >>665 が教えてくれるみ
たいだよ。

669:NAME IS NULL
08/10/25 03:07:52
ド低脳すぎて教える気も起きないって言うと思うよ

670:NAME IS NULL
08/10/25 09:40:24
>>666
レスどうもです。
カキコの内容でやってもダメだったので質問したのでした。
ローカルサーバー上では問題なくselectできるけど、リモートからは
OS(Windows2003)のセキュリティで弾かれているようだったので、
OS上のGuestアカウントを有効にして(セキュリティレベルを低下させて)
リモートからのアクセスを許可するしかないのか?と考えました。
他にセキュリティを保ったまま実現する方法があれば知りたいです。

671:NAME IS NULL
08/10/25 09:45:32
↑補足です。
当然ながら、SQL ServerのTCP/IP接続は許可しています。
また、OSのファイアーウォールは無効状態です。
.NETで作ったアプリでは問題なくSQL Serverにアクセスできるので
Excel VBA ADOの制限とかあるのでしょうか?

672:NAME IS NULL
08/10/25 10:37:56
>>670
Excel VBAのマクロセキュリティじゃね?高を低にしてみるとか。

673:NAME IS NULL
08/10/25 11:18:27
>>669
言い訳はいらんよ。

674:NAME IS NULL
08/10/25 12:15:31
Excelマクロのセキュリティレベルによってリモートアクセスの可否が
違ってくるなんて初耳だけど。
中学生の落書きですか、そうですか。

675:NAME IS NULL
08/10/25 15:11:25
>>674
馬鹿やろう!小学生の落書きだ!
勘違いするな!!

676:NAME IS NULL
08/10/25 19:11:45
0.154って数字を少数点2桁で表示したり
%表示させたいけど、便利なformat関数ってありませんか?

677:NAME IS NULL
08/10/25 19:16:07
>>676
どこに表示させたいか具体的に書かないと笑っちゃって返事も出来ない

678:NAME IS NULL
08/10/26 00:20:09
誤解が蔓延すると困るから書いておきたいんだが
ActiveDirectoryを構成していなくともWindows認証で
リモート接続は出来るんだぜ?

Windows認証とSQLServer認証の違いはID,Passwdによる認証を
OSレベルでするかDBサービスレベルでするかってことだけ。

あと忘れちゃいけないのはWindows認証でもSQLServerには
ユーザを登録しなければいけないんだぜ?
※SQLServer認証はID,Passwdを、Windows認証はIDだけを登録

それとデータベース/テーブルに対する権限の委譲も併せて
やっておかないとアクセスできないんだぜ?

679:NAME IS NULL
08/10/26 00:27:59
>>678
そんな常識をなぜ今頃・・・。

680:NAME IS NULL
08/10/26 00:43:12
>>679
理解できている人が"常識"と思い込んでるだけで
万人が認識できているわけではないのだよ、現実は。

681:669
08/10/26 01:00:54
>>673
おちついて。俺は彼じゃない。
恥ずかしながらいうと>>664だ。

682:NAME IS NULL
08/10/26 01:47:43
>>676
STR や CONVERT 関数。または、Format を呼び出すCLR関数を配置して使えば良いよ。
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)
select str(0.154, 10, 2) -- 小数点2桁
select convert(decimal(10,2), 0.154)
select str(0.154 * 100, 10, 2) + '%' -- %

683:NAME IS NULL
08/10/26 03:11:18
ある列の値の日ごとの合計をとりたいんですだが
指定される日付範囲が月や年の変わり目をまたぐことがあります。
一体どうすれば、、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としてスマートに得たいでつД`;)

684:NAME IS NULL
08/10/26 04:39:48
どうも最近の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)

685:NAME IS NULL
08/10/26 04:40:47
あ。varcharじゃなくてcharでいいか。

686:NAME IS NULL
08/10/26 10:00:04
ExcelでSQL ServerにADOで接続できない件の自己レスです。
SQL Server Browserサービスを動かすか、接続文字列でポート番号を
指定すればいけそうな感じです。
自宅のテスト環境ではOKでした。明日職場で再確認予定。

687:NAME IS NULL
08/10/26 10:25:50
マクロのセキュリティも低にしとけよ( ´,_ゝ`)

688:NAME IS NULL
08/10/26 10:47:01
>>678の書き込みが出てきたからちょっと聞いてみたいのだが、
Windows認証については何処で学べば良いのかな?
(分野は何関係かな?OSの方?ネットワークの方?それともDB?)

ま、その環境が構築できなくて苦労してるわけじゃなくてさ、
Guestアカウントなどとの違いをはっきりとした形で理解したいので
そのあたりをしっかりとした解説を読見たいと思ってる。
自分なりに検索してみても共有フォルダの話ばっかりにたどり着いてしまって・・・

689:NAME IS NULL
08/10/26 10:54:13
>>688
ほんとにちゃんと学びたいのならこの本を読む。絶版だけど。
URLリンク(ec.nikkeibp.co.jp)

690:NAME IS NULL
08/10/26 10:58:22
>>689
ああ、Windows Server関連の書籍だね。
それだと、認証についても詳しく解説がされているようだ。
何か見えてきたような気がする。ありがとう。

691:683
08/10/26 11:31:09
>>684
ありがとうございます。ご提示のSQLで期待どおり動作することを確認しました!

datetimeへのキャストは未解決ですが、それ無しでもDate_フィールドが '2008/10/01'形式になるので
クライアントプログラムの方でそこそこスマートに対応できそうです。

※ 仮にCONVERT(datetime, foo.Date, 111) とした場合、エラーにはならないが、何ら変換してくれないっぽい、、


692:NAME IS NULL
08/10/26 11:41:32
>>687
また小学生のクソガキが落書きかよ。

693:NAME IS NULL
08/10/26 11:42:10
DATE型の表示形式はきちんと定義してないと、どんな参照がされたかで表示が揺らぐ可能性があるよ。

694:684
08/10/26 11:53:43
>>691
> 仮にCONVERT(datetime, foo.Date, 111) とした場合
これは思いつかなかったw
確かにフォーマットとして日付しかないものをdatetime型で受け取れば時間切り捨てられそうだもんねw

キャスト云々は2008でdate型が実装されたっぽいことからです。
URLリンク(technet.microsoft.com)

>>693
フォーマット指定してても表記が揺れることがあるの?

695:NAME IS NULL
08/10/26 15:48:33
SQL Server では、ユーザ定義DBのmdfとldfファイル、もしくはバックアップファイル
(BAKファイル)を盗まれたら(コピーされたら)、テーブルの実データ、定義、
ビュー、ストアドプロシージャなどはすべて丸見えですか?
本当は、それを盗まれたりしないようにするのがセキュリティーにおける考え方
なのでしょうが、暗号化や偽装化することは出来ないのでしょうか。

696:NAME IS NULL
08/10/26 15:58:31
ファイル自体に細工をすることよりも、盗まれない体制を作った方がよっぽど実用的。

盗まれたらあきらめるくらいでいいと思う。

697:NAME IS NULL
08/10/26 17:12:54
>>696
体制というと例えばどんなものでしょうか?

フリーかシェアかに関わらず、自分が管理している以外のサーバに入れたら
その時点で盗まれる可能性は十分にあるってことになりますよね。

698:NAME IS NULL
08/10/26 17:54:06
IP公開したら自宅の住所がバレると思ってそうだな

699:NAME IS NULL
08/10/26 18:32:11
運用してる人といっぺん話した方がいいんじゃないかな。
何か勘違いしてる。

700:NAME IS NULL
08/10/26 19:40:32
DBやテーブルの構成はある程度ばれても良いって言う考えですか?
アプリというものは、その画面や動きを見ただけで、ソースコードまでは
見なくとも大体同じようなものが作れるから。

701:NAME IS NULL
08/10/26 20:13:38
スレ違いといわれるかもしれませんが、質問するところがわかりませんでしたので
ここで聞いてみました。
Accessから、SQL Serverに接続する場合ですが、mdbファイルと、adpファイルの
違いは以下のような見解であってるのでしょうか?

mdbファイル
サーバのデータを取得し、一旦ローカルで保存し、操作する事が出来る。
ストアドプロシージャやビューを使わないのであれば、こちらで十分。

adpファイル
ローカルにテーブルを持つ事が出来ないので、すべてのテーブル操作は
サーバでとなる。ストアドプロシージャなどを活かして構築したい場合は
こちらが必須。


こういう基本的な事を確認しているのは、「SQL Serverならば、adpファイルにしろ」
といわれたのですが、データを操作する目的ではなく、登録したデータをもとに
帳票を作る目的であればmdbの方が、サーバやネットワークの負荷を少なく出来る
のでは、と思ったのです。その分、クライアントPCの負荷はあると思いますが。

702:NAME IS NULL
08/10/26 20:15:56
あまりと言えばあまりに酷い…
明日先生に「こういう質問したんですが」って聞いてきなさい。

703:NAME IS NULL
08/10/26 20:19:38
せめてヒントくらい。

704:NAME IS NULL
08/10/26 20:32:34
>701
スレ違い。1行目しか読んでないけど。

705:683
08/10/26 21:29:19
>>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' は 組み込み関数名 として認識されません。

何かパッケージのインポートみたいなおまじないでも必要なんですかね…

706:NAME IS NULL
08/10/26 21:36:14
>705
2005だからじゃね?

707:NAME IS NULL
08/10/26 23:31:48
>>704
誘導頼みます。

708:NAME IS NULL
08/10/26 23:37:28
>707
この辺でいいんじゃないかな。
スレリンク(river板)

709:NAME IS NULL
08/10/26 23:40:02
>>701
Access総合相談所 其の19 【桐にしとけ】
スレリンク(bsoft板)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)

710:NAME IS NULL
08/10/26 23:56:10
>>709
Accessの件、レスありがとうございます。
解釈していたことは概ねあっていたのですね。安心しました。
接続やデータ取得はVBAで行っていたのですが、ストアドも実行出来るとは
知りませんでした。調べてみます。

711:709
08/10/27 00:22:30
>>709 訂正
× ローカルでキャッシュできない分、adpの方が……
○ CursorLocationや接続を正しく制御しないと、接続されたままになるのでadpの方が……

ついでに >>710
ADO で SQL Server のストアド プロシージャの値を取得する方法
URLリンク(support.microsoft.com)
まあ、頑張ってくださいな。

712:NAME IS NULL
08/10/27 00:32:47
>>711
> CursorLocationや接続を正しく制御しないと、接続されたままになるのでadpの方が……
そうなんですよね。接続をきちんと制御するコードを書いていなければ、テーブルの
データ量が大きい場合、それによってネットワークの負荷が非常に大きくなる上に、
ユーザの待ち時間が長くなったりするんですよね。
だから、帳票においてはmdbで接続してローカルのテーブルにキャッシュしたらすぐに
接続を切って・・・というやり方をしてみていたのですが、このやり方でいいのかが
気になり、質問していたのです。

ストアドの件、URLまでありがとうございます。読んで勉強してみます。

713:683
08/10/27 03:58:04
>>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
08/10/27 04:15:39
ていうか709に完全な答えが書いてあったorz
回答ありがとうございました。

715:NAME IS NULL
08/10/27 16:52:35
>>683
設計書には2chより引用って書いておけよ。

716:NAME IS NULL
08/10/27 19:38:23
ここにいるみなさんが運用で SQL Server を選ぶ理由って何でしょうか?
GUIがすぐれているとか、Windowsとの親和性、これまで作ってきた資産を
活かすため、知識があって慣れているから、などいろいろあると思います。

SQL Server のデメリットは、バージョンアップが頻繁にあり、それに伴う
仕様変更によって互換性がなくなることや、強制的に過去のバージョンの
サポートが打ち切られてしまう事があると思います。
それであっても、みなさんがSQL Serverを使うのを選ぶ理由を聞いて
みたくて質問しました。

717:NAME IS NULL
08/10/27 19:56:50
Oracleはサポートが適当すぎると聞いたことある。
怪しい動作の原因を問い合わせても、原因不明とか平気で回答してくるらしい。
そんな対応されたらサポート費返せって言いたくなるよな。
SQL Serverの方がバージョンアップのやり易さとか情報の開示レベル上と思う。

718:NAME IS NULL
08/10/27 21:14:10
>>716
> SQL Server のデメリットは、バージョンアップが頻繁にあり、それに伴う
2000、2005、2008と頻繁とは思わないから


719:NAME IS NULL
08/10/27 21:39:56
>>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の互換性レベルは無くなった訳だが)


720:NAME IS NULL
08/10/27 23:41:05
OracleはGUIが糞だった気がするよ。
高いし、SQLServerでは標準で付いてるようなツールが別売りとかだったりするし。
wave-dashとかで悩むのも面倒だし。なんで自前で化ける文字の変換処理とか書かないといけないんだとか思ったり。
Oracleの接続ドライバが.NETのドライバとかODBCのドライバとかJDBCのドライバとかVBでのOO4OとADOとか
どれも何種類かずつ方法がある割にどれも癖があったり問題があったりで扱いが面倒だよ。

SQLServerは互換性レベルの設定でもろに過去バージョンのもそのまま動いてくれるよ。
互換性はかなり頑張って維持してると思う。
システムテーブルすらビューの形で残して互換性を維持しててびびったけど。
MSDNだけで開発環境とか一式全て揃うってのも楽でいいよ。

721:NAME IS NULL
08/10/28 00:21:46
Oracle一筋だったけど、最近SQLServer使い出した。
機能的に特に差がなくて、安いからって理由だけだけど。
サポート契約しないとパッチも入手できんとかねぇ…
あと、メンテナンスする部署がWindowsしか使えんとかさ。

722:NAME IS NULL
08/10/28 00:54:05
別にオラクルが好きな訳ではないが、あらぬ嫌疑をかけられたままというのはちょっとよくないかなと。

> 情報がクローズ過ぎる
OTNで公開されているマニュアルを読んだ上でクローズすぎるという意見でしょうか?

> wave-dashとかで悩む
悩む原因を作ったのはどこでしたっけ?

723:NAME IS NULL
08/10/28 00:56:31
個人的にはしこしこチューニングしないとパフォーマンスがでないオラクルより
適当セッティングでもある程度のパフォーマンスが出るMSSQLが好みですね。

724:NAME IS NULL
08/10/28 01:07:03
>722
入力と出力で同じ変換テーブル使ってれば問題起きないからオラクルだよ。

725:NAME IS NULL
08/10/28 02:04:25
Oracleとの比較の話が多いけれど、MySQL や PostgreSQL 、DB2 と比較しては
どうなのでしょうか?これらはそのシステムの規模的に比較の対象外とか?

726:NAME IS NULL
08/10/28 02:15:19
OSおよび開発言語に依存することが多いからかな?
Windows + .NET → MSSQL
Solaris + Java → Oracle
Linux + LL → MySQL PostgreSQL
みたいな?
DB2はつかったことないや。

727:NAME IS NULL
08/10/28 06:33:34
>>722
今は公開されているけど、Oracle8の頃とかはひどかったよ。
あと>>721にも書かれているけど、パッチの入手方法とか。

あと'(Windows版だけど)インストーラーが独特でちょっと嫌。


728:NAME IS NULL
08/10/28 06:36:23
DB2は顧客がAS400ユーザー、もしくはAS400からのリプレースとか?


729:NAME IS NULL
08/10/28 10:47:04
オラもMSSQLも使ったけど
何もしなくても早く動くMSSQLは便利だわ
7.0まではひどくて使えなかったけど(まぁその頃のオラクルも知らないが

オラからSQLに変えた理由はサーバーがWindows一本になったことだな
昔は無印のLinuxでもオラはサポートしてくれたけど
最近では製品版でしかサポートしないから結局高いLinuxサーバー製品を買わないといけない
だったらぜんぶMSにしてしまえ みたいな

730:NAME IS NULL
08/10/29 07:45:18
SQL Server 2005 SP3 Beta
URLリンク(www.microsoft.com)

731:716
08/10/29 09:07:09
みなさん、たくさんのレスありがとうございます。
Oracle との比較の意見、凄く参考になりました。
Oracle で構築されたシステムが多いという話や、各種資格があると
給与が・・・という話を聞くと、MS SQL Server で構築をやっていて良いのかなと
ちょっと不安になったりしていたのですが、整理がついてきたように思います。
しばらくの間は SQL Server を使って勉強していこうと思います。

あと、もう一つだけ質問です。
規模の大きなシステムであると Oracle を選ぶべきという意見も聞きますが、
こちらのスレに居る方々はそれはどう思いますか?SQL Server では無理が
出てきたりしますか?
お願いします。

732:NAME IS NULL
08/10/29 09:20:47
昔は Oracle は早い! SQL Server は遅い!
なんて良く聞いたけど、最近はどうなんでしょうね

基本 SQL Server 重い部分だけ Oracle 担当で
リンクサーバー接続なんて運用は、たまに見かけるけど

733:NAME IS NULL
08/10/29 11:03:06
DBの性能は9割メモリで9分ディスクなんだから意味ないよ。
MSとOracleが性能比較合戦してた頃の資料はどっちも言いがかりレベルだから、
いまさら持ち出さないように。

734:NAME IS NULL
08/10/29 14:54:01
>>731
最近は銀行系でもSQLServer使ってるとか何とか。

Oracle使いだけど、最近はSQLServerを選ぶ顧客が多い。
その背景はDB云々じゃなくて、サーバOSとしてWindowsがなんとかなるようになってきたからじゃないだろうか。
DBの機能は大差ないように思う。
OSはUNIX系でって言う客はまだまだいるけど。
あとフレームワークがSQLServerに対応してないとか言うのはあるな。

735:NAME IS NULL
08/10/30 00:25:11
質問です。
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:NAME IS NULL
08/10/30 03:25:46
テーブル名と店舗名カラムは適当に読み替えてください。
>>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.店舗コード)

737:NAME IS NULL
08/10/30 07:50:38
row_number over partition ... は2005からかな。これが使えるならもっと単純になる。



738:NAME IS NULL
08/10/30 12:36:01
>>736
735です。すごく助かりました。
2005なのですが、出来ればROW_NUMBER()も
教示戴けますでしょうか(;^_^A

739:NAME IS NULL
08/10/30 13:02:37
>>733
横レスですが、質問です。

> DBの性能は9割メモリで9分ディスクなんだから意味ないよ。
これ、本当ですか?
その数値を出した根拠をお願いします。

740:NAME IS NULL
08/10/30 14:39:39
>>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


741:NAME IS NULL
08/10/30 14:52:36
どちらにせよコストのかかる問い合わせなので定常的に使用するなら、
また最新の日付以外のデータが履歴以上の意味を持たないのならば
Bを現在の状態を保持するテーブルと履歴テーブルを分けるべきでしょう。


742:NAME IS NULL
08/10/30 21:47:57
すみません、質問です。

SQL Server 2000 Developer Edition を使っているのですが、
これをインストールした後、ヘルプの情報をみても、Developer Edition の
文字はありませんよね。コントロールパネルの、プログラムの追加と削除の
ところを見ても、そういう文字は書いてありませんでした。

すでにインストールしてある SQL Server 2000 のエディションが何であるかを
確認したい場合、どこを見たら良いのでしょうか?

743:NAME IS NULL
08/10/30 22:24:06
>>740-741
735です。ありがとうございます。
そうですね、現状処理対象が多く想定した速度が出ないので
分割するのもありですよね。検討してみますm(_ _)m


744:NAME IS NULL
08/10/30 23:13:24
>>742
select @@version
というクエリーを実行したらわかるよ。


745:NAME IS NULL
08/10/31 00:04:28
>>744
Devの文字が出てきました。ありがとうございます。

746:NAME IS NULL
08/11/01 21:41:33 DIcWafAA
SQLサーバーで結果セットを取得せずに、特定の行だけ行ロックしたいのですが、
どうすればいいのでしょうか?

イメージ的にはこんな感じ
LOCK * FROM A WITH(UPDLOCK,ROWLOCK) WHERE COL1 = '005'



747:NAME IS NULL
08/11/01 23:09:35
>>746
素直にSELECTで行ロック汁

748:NAME IS NULL
08/11/02 01:12:37
初心者ですが質問があります。
大量にupdateするときはやはりテーブルをロックした方がよろしいでしょうか?
またその場合どのようなロックが適切でしょうか?

749:NAME IS NULL
08/11/02 07:26:22
>>748
仕様が分からんので何とも言えん。
例えば、
「深夜に他のユーザーが一切接続できない
 かつ、操作するのがupdate掛けるセッションだけ」
などの要件が有れば、ロック掛ける必要自体が無い。
むしろ、エラー処理と処理を行う上でのROLLBACKの要否の方が重要だろ。

他のセッションがあるという前提なら、行ロックを前提に
該当トランザクションで排他ロック掛けられては困るなら、
更新ロックにするべきだろ。


750:NAME IS NULL
08/11/02 17:56:59
カーソルの中でunion allで全ての結果を結合して
その結果をそのままinsertって可能かな?

751:NAME IS NULL
08/11/02 19:48:12
>>750
テライミフ
日本語でOK。

752:NAME IS NULL
08/11/04 21:55:44
nVarcharと varchar の使い分け方が意味不明です。

unicode対応かどうか見たいだけど・・・・orz
誰かわかりやすく教えてください。


753:NAME IS NULL
08/11/04 22:12:57
nvarchar : 可変長の UNICODE 文字データです。
varchar : Unicode ではない可変長の文字型データです。

確か、Shift-JISに変換できないUNICODE文字をvarchar型の列にinsertすると「?」になったはず。
あと、nvarcharのサイズは文字数だけど、varcharのサイズはASCIIでの文字数(要はバイト数)。

754:NAME IS NULL
08/11/04 22:17:44
>>753
わかりやすい!
なるほど!そういうことだったんですね。
大変勉強になりました。
ありがとうございました。


755:NAME IS NULL
08/11/05 00:06:54
日本語OSの場合は753のとおり。
他言語OSの時はcollationを見直す必要があり。

756:NAME IS NULL
08/11/05 06:32:45
varchar(10) に2バイト文字を突っ込むと5文字しか入らなかったような
nvarchar(10) だと2バイト文字でも10文字入る。

半角固定じゃない限りは今時 nvarchar デフォでいいんじゃないか

757:NAME IS NULL
08/11/05 18:00:13
>>755-756
ありがとうございます。
参考にさせてもらいます!


758:NAME IS NULL
08/11/05 18:20:09 8CuM4UUP
復旧モード「フル」に設定してるのにトランザクションログがぶりぶり切り捨てられてる。
初回の全体バックアップの実行前だとこんな現象が発生してるんだけど、これってSQLSERVERの仕様?

データベースが全体バックアップ済みか否かって、どこ見て判断してるんだろか?

759:NAME IS NULL
08/11/05 22:20:09
>>758
仕様。中程にある「重要」を読め。
URLリンク(msdn.microsoft.com)

760:sage
08/11/06 09:58:01 xzbCwz05
>>759
ありがとう!

>データベースが全体バックアップ済みか否かって、どこ見て判断してるんだろか?
こっちは解らない? msdb..backupfileを参照してるのかと思ったがどうも違うみたい。


761:NAME IS NULL
08/11/06 11:00:34
初心者で言葉足らずかもしれませんが、
ご教示いただきたい事があり、書き込ませていただきます。

OSがWindowsServer2008のマシンにSQLServerExpressEdition(SQL Server認証)で
データベースを構築し、ADO接続しようとしたところ、

[DBNETLIB][ConnectionOpen(Connect())]SQL Server が存在しないか、
アクセスが拒否されました

というメッセージが出て接続できませんでした。

WindowsXPとSQLServerExpressEditionで構築した場合、
同じADO文(?)で接続できました。

気になっているのは、
ADO文の「Data Source=(Local)」の部分で、
WindowsServer2008では書き方が変わってしまうのか?
ということと、
WindowsServer2008にSQLServerExpressEditionをインストールした際、
ユーザ名とパスワード設定のところで
「複雑なパスワード」を要求されたため、
記号入り(アットマークを使用)のパスワードを設定したので、
それが引っかかっている可能性があるかと考えています。

ただし、エラーメッセージを読む限り、
SQLサーバの認証で蹴られてるのではなくて、
SQLサーバ自体を見つけられていないような気がするのですが・・・

長文になり、申し訳ありませんが、
ご助力のほど、よろしくお願いいたします。

762:NAME IS NULL
08/11/06 13:18:04
サービスが起動しているのかということと
構成マネージャで TCPの通信ができるようになってるかまずは確認してみれば?


763:NAME IS NULL
08/11/06 21:12:45
ローカルからのTCP接続ができるかどうかの確認かな。

764:NAME IS NULL
08/11/06 21:13:45
あらごめん。すでにローカルか。
んじゃ>>762と一緒でTCP通信可否設定の確認だね。

765:NAME IS NULL
08/11/06 23:27:54
つか(Local)って時点でネットワークを見ないんだぜ?

766:よしき
08/11/07 10:36:05 WjJ9IoZm
つまらない質問で申し訳ないんですが、SSMSにてクエリエディタに行数を表示させるにはどうしたらいいのでしょうか??
宜しくお願いいたします。

767:NAME IS NULL
08/11/07 14:26:06 j3syhTYc
私もつまらない質問で申し訳ないのですが

Windows XP Home Edition(SP3)に
SQL Server 2008 Express Editionをインストールすることは
できるのでしょうか? できた場合も制限とかあるのでしょうか?

当方学習目的なもので、システム構築云々といった
だいそれた事は考えていません

768:NAME IS NULL
08/11/07 16:22:19
タダなんだから試してみろよ
それが学習だよ

769:NAME IS NULL
08/11/07 16:56:47
>>767
インストールは出来ますが、GUIツールなどに大きな制限があります。
コマンドを打つのに慣れているのであれば問題ありませんが、
学習目的であれば、GUIツールを使っての操作がいいでしょうし、
各種メンテ用のツールで、システムの動きを確認しながらの方が
イメージがつきやすいと思います。
Developer Edition の購入をお勧め致します。

770:NAME IS NULL
08/11/07 17:02:05
>>762>>763>>764>>765
返信ありがとうございます。

構成マネージャで確認してみましたところ、
TCPが無効になっていましたので、有効に切り替えてみましたがだめでした。

サービスについても「SQL Server」は開始になっておりました。

あとはsaのパスワードの「@」が怪しいのかなぁと思い、
再インストールしてsaのパスワードを変更してみようと思います。

ちなみに再インストール以外でsaのパスワードって変更できるんでしょうか?

771:NAME IS NULL
08/11/07 17:21:51
>>767
>>769
SQL Server 2008 Express EditionもGUIツールあるよ。

SQL Server Management Studio Express
URLリンク(msdn.microsoft.com)


772:NAME IS NULL
08/11/07 17:26:18
>>770
> ちなみに再インストール以外でsaのパスワードって変更できるんでしょうか?

SQL Server Management Studioで[セキュリティ]-[ログイン]でsaのプロパティを開いて
パスワードとパスワードの入力確認を入力。


773:NAME IS NULL
08/11/07 17:32:15
>>770
ユーザー名に@が含まれるならまだわかるけど、パスワードに@はあまり関係ないと思われ。
一度、ADOの接続文字列を公開してみるとか。(パスワードの部分は消して)


774:NAME IS NULL
08/11/07 17:54:33
>>771
そういうのを見つけ切れなかったわけだから、
ここで質問してるんだと解釈したんだけどなw
そこまで分からないのであれば、ということで
製品版を勧めたのだよ。
180日評価版とかの案内をしても制限は?とか
ぐだぐだいいそうだし。

775:NAME IS NULL
08/11/07 20:29:12
GUIツールが見つからないなんて言ってないような。
XPに入るの?っていうことだけだよね。

776:NAME IS NULL
08/11/07 23:15:04
つまらない質問ですが、つまらない質問するにはどうすればいいのか教えてください。

777:NAME IS NULL
08/11/07 23:21:58
書け!
そして叩かれろ! 以上

778:776
08/11/07 23:29:33
>>777
早速のご丁寧な回答、ありがとうございます。

より、つまらない質問が書けるように努力したいと思います。


779:NAME IS NULL
08/11/08 00:02:55
> より、つまらない質問が書けるように努力したいと思います。

もう充分だ。

780:NAME IS NULL
08/11/08 01:03:30
180日間限定の奴って期間過ぎたら自動的に使えなくなるって事でいいんだよね?

781:NAME IS NULL
08/11/08 01:54:22
>765
tcp:(local)
がいいんじゃないかと。

782:NAME IS NULL
08/11/08 08:15:19
SQL Server 2005 Service Pack 3 - CTP - 日本語
URLリンク(www.microsoft.com)

783:NAME IS NULL
08/11/08 08:15:47
>>780
そんなこと確認してないで、製品を買いに行きなさい。

784:NAME IS NULL
08/11/08 13:31:14
開発者向けは数千円で売ってるんだっけ
2005や2008でも安価なの用意されてる?

785:NAME IS NULL
08/11/08 14:45:11
まったくいつまで常駐してるんだ。
URLリンク(kakaku.com)
URLリンク(kakaku.com)

786:NAME IS NULL
08/11/08 17:11:08
>>784
売ってる。
尼でも買える。

787:NAME IS NULL
08/11/08 22:41:49
VS2008でドラッグ&ドロップで作成したDBアプリ(下記URL紹介のようなもの)に
アプリケーションロールを割り当てるにはどうすればよいのでしょうか?
MSDNには、「アプリケーションが、このアプリケーションのみに対して既知である
パスワードを使用して、sp_setapprole ストアド プロシージャを実行します。」
とありますが、どこにこの情報を記述すればよいのでしょうか?

【第4回 ドラッグ&ドロップで作るWindowsデータベース・アプリケーション】
URLリンク(www.atmarkit.co.jp)


788:761
08/11/10 18:35:13
>>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

としておりますが、如何でしょうか?



789:NAME IS NULL
08/11/10 19:21:40
>>788
SQLServer2005や2008のExress版は標準では名前付インスタンスになるのだけど
その辺は大丈夫?


790:NAME IS NULL
08/11/10 21:50:31
>>767

学習目的なの?
評価目的なら体験版やダウンロードセンターからダウンロードできる
VHDイメージ(英語版だけど)を使えば良いね。

791:NAME IS NULL
08/11/10 21:56:45
>>790
学習目的だといっている人間に対して、学習目的なの?と改めて質問をした上で
評価目的のものを勧めるのってなんでなの?
ExpressEdition使われると気にくわないの?

792:NAME IS NULL
08/11/10 22:08:06
>>788
釣りじゃないよね?

ウィザードで普通にNext>Next>でインストールすると
loalhost\SQLExpress
だよ。

793:792
08/11/10 22:10:09
間違い。
localhost\SQLExpress
だよ

794:NAME IS NULL
08/11/11 02:48:17
>>788
> Data Source=(local);

他にも書かれているけど、ExpressEditionだったらデフォルトのインスタンス名はSQLExpressだから、
Data Source=.\SQLExpress
(もしくは"Data Source=localhost\SQLExpress")
で繋がると思われ。

あとProviderだけど、SQL Server 2005だったらSQL Native Client(SQLNCLI)の方が良さそうだけど。



795:NAME IS NULL
08/11/11 18:10:05
>>789>>792>>794

インスタンス名の意味を理解してませんでした・・・
いまちょっと確認できる環境でないのですが、
後で試してみます!!!

796:なめ IS なる
08/11/12 10:13:29 GMZxs0Yi
構文エラーになってしまいます。.付近に不適切な構文があります。

CREATE UNIQUE INDEX DEVDB.D1I ON DEVDB.D1
( COMPOSITE_TYPE DESC , COMPOSITE_KEY DESC ) ;
どなたか教えて下さい m(_ _)m

797:NAME IS NULL
08/11/12 13:33:40
>>796
手元にないから確認はしてないが思いつくことを少々。

DEVDBは名前からスキーマではなくDB名と思えるので、
DEVDB.D1 は DEVDB..D1 が正しい。スキーマ名であってればそのままで。
インデックスはテーブルのDBとスキーマに常に従属するので、
DEVDB.D1I の DEVDB. は不要。



798:NAME IS NULL
08/11/12 18:25:13 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 なる
08/11/12 18:46:55 BeyoDU5S
(T_T) ありがとうございます!
実行したところテーブル作成を確認致しました。感謝です。
ALL 権限は推奨されません。←このワーニングが出ましたが、これは無視してもよいでしょうか? 

800:NAME IS NULL
08/11/12 19:08:37
>>798
select 'foo' + NULL + 'bar'
select 'foo ' + 'NULL' + ' bar'
とかやってみると納得できるかも

801:NAME IS NULL
08/11/12 22:03:36
NULLは値じゃない


802:NAME IS NULL
08/11/12 23:34:18
ヌルヌル

803:NAME IS NULL
08/11/12 23:46:28
SET @vAC8 ='''+ null + '''
と書けば上手く行くかもしれない

804:NAME IS NULL
08/11/13 08:21:17
質問です。
SQL構文の長さにおいてはどのくらいまでという限界が設定されているのでしょうか?
以下のような感じで長いSQL文をVBAで自動生成して実行しようとしたら
エラーが出て、実行出来ませんでした。(WHERE 以下を削除するときちんと実行
出来る状況です)

SELECT * FROM tblname WHERE (A = 1) OR (A = 2) OR (A = 3) OR (A = 4) ・・・・
WHERE以下が異常に長いという、SQL文です。

異常なほど長すぎるとエラーが出るので、別の方法を考えるべきだということは
分かりますし、現在は別な方法で対処していますが、どういうところが限界なのかが
良く分からなくて質問してみました。SQL Server などに設定があるのか、それとも
別なところに限度が設定されているのか、などが気になっています。
よろしくお願いします。

805:NAME IS NULL
08/11/13 09:09:45
なんてエラーが出るのよ?
最大容量はこれじゃね?
URLリンク(msdn.microsoft.com)

806:なめ IS なる
08/11/13 10:40:43 p7L5VuAO
恐れ入ります。
CRTTBLで、指定したスキーマがないか、使用する権限がありません!
と怒られています。
スキーマは存在するので権限をMANAGEMENT STUDIO EXPRESSの画面から
該当するスキーマに与えても改善されません。
どうすればよいでしょうか?


807:なめ IS なる
08/11/13 10:46:25 p7L5VuAO

ごめんなさい、データベースを指定していませんでした。m(_ _)m

808:798
08/11/13 11:41:19 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
08/11/14 00:19:11 NswyuBr8
>>719
> 余談だけど、昔NiftyでやたらMSを攻撃する粘着なOracle社員もいた。しかも本名で。
池田?
ログまだ持ってるよ
捏造してまでMSに圧力かけられたって自演してたやつね

810:NAME IS NULL
08/11/14 01:01:32
>804
かなり長いクエリは実行してるけど長さが原因で動かなかったことはないんだけどなぁ。
動的にクエリを作ってるとクエリの長さよりもパラメータ数の上限が2100個にぶつかる。

無制限にパラメータを渡してくるような状況だと一時テーブル作ってサブクエリとかにする。面倒だけど。

811:NAME IS NULL
08/11/14 01:32:33
>>809
そう、池田○一w
まあ、あの当時のMSは色々あったからね。電脳曼陀羅の件とか。
でもあの粘着さは傍から見ていても異常だった。


812:NAME IS NULL
08/11/14 09:59:55 iMptzZfL
IE上からGOOGLEを使用して、 ”データベース アプローチ” を検索すると
何故かエラーで落とされるのですが仕様ですか?

813:NAME IS NULL
08/11/14 10:35:50
>>812
環境書けば?
なんともないぞ

814:NAME IS NULL
08/11/14 10:51:16
>>812
それはIEの問題だと思われる。
こちらの環境では、IE6とかだと、javascriptなどがうまく
処理できずエラーが出たり、異常終了することがあった。
これ以上のことはスレ違いなので、DB板以外の、
PC初心者やブラウザ関連の方へどうぞ

815:804
08/11/14 13:43:16
>>805>>810
レスありがとうございます。
パラメータの上限が関係しているようでした。

816:NAME IS NULL
08/11/14 14:28:28
>>814
君んとこのIEもおかしいよw
うちのIE6は文句言わずに処理してくれるぞw

817:NAME IS NULL
08/11/14 21:24:33 B/+QOJJ/
>>719
>>809
オラクルもアンチ扇動が過ぎて、すっかりネガティブ企業のイメージついちゃったし
そのためオラクル製品もそういう目で見るようになる
自業自得だな


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch