ホーム   フォーラム   FAQ
 
メインメニュー
ログイン
ユーザー名:

パスワード:


パスワード紛失

SQL Server テーブル名の変更

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 .3 .4 .5 .6 .7 .8 .9 .10 .11 .12 | 投稿日時 2012-3-12 23:54 | 最終変更
nkmt  長老   投稿数: 1668
Pervasievの実データの名前の変更は
FileRename関数(旧 IOREN関数)でよく行っていました。

SQL Serverの場合はこの関数では無理だと思うのですが
uniPaaSのプログラムから
名前の変更を行う方法はありますでしょうか?


今はその方法はわからないので
アクション DbCopy('1'DS,'','変更後の名前')
アクション DbDel('1'DS,'')
でやろうと考えています。
(データのコピーが発生するので無駄もありますが
 SQL Serverのスクリプトで行う方法もまだ知らない
 というのもあるし、uniPaaSのプログラムから実現
 したいし・・・)
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-13 13:08
Tanda  長老   投稿数: 2151
nkmt さん、こんにちは。

関数一覧を見る限り、それしかなさそうですね。SQL にも対応と
書いてありますし。
投票数:1 平均点:10.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-13 14:22
Kurogane  常連   投稿数: 50
テーブルのコピーは、レコード件数が多いとディスク容量が増加します。
もし件数が多く、埋め込みSQLでも良ければ、下記のスクリプトでいけます。

sp_rename '(スキーマ).旧テーブル名','新テーブル名'

スキーマがdboのままでしたら、テーブル名のみで良いです。


件数が大したことないようでしたら、uniPaaSの関数でも良いかと思います。
投票数:1 平均点:10.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-13 15:45
nkmt  長老   投稿数: 1668
Tandaさん Kuroganeさん レス有難うございます。

Magicのタスクで、タスク環境 → SQLコマンドと操作しました。

SQLコマンドという画面が表示され
データベース選択を行い
SQLコマンド欄に
sp_rename '旧テーブル名','新テーブル名'
と記述しました。

するとデータビューに
Q=SQLコマンド と表示されました。

バッチ、照会、終了条件=Yes&後置き にして実行したら
SQL Server上のテーブル名が変更されました。

やり方に問題無いでしょうか?

大変助かりました。有難うございました。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-13 15:54
Kurogane  常連   投稿数: 50
その流れで問題ありません。

結果セットを返すSQL文(select文)でしたら、メインテーブルが
あるタスクと同様に(終了条件=No&前置き)
結果セットを返さないSQL文(今回)でしたら、メインテーブルが
ないタスクと同様に(終了条件=Yes&後置き)

埋め込みSQLは集計や単純な一括更新等で用いると、桁違いの速
度を見せますので、チューンアップでは重宝しますね。
投票数:1 平均点:10.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-13 15:59
Kurogane  常連   投稿数: 50
補足として、旧と新のテーブル名を動的としたいのでしたら、
SQL文を下記のようにして、

sp_rename ':1',':2'

下部の「入力パラメータ」の1行目に旧テーブル名を、2行目に
新テーブル名を変数なり式なりで定義すればOKです。
投票数:1 平均点:10.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012-3-13 16:14
nkmt  長老   投稿数: 1668
kurogane様
引き続きのご回答誠にありがとうございました。
投票数:1 平均点:10.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-13 16:35
Tanda  長老   投稿数: 2151
nkmt さん、ついに埋め込み SQL にまで進出ですね。

おめでとうございます。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012-3-15 10:33 | 最終変更
nkmt  長老   投稿数: 1668
おはようございます。
Kuroganeさん Tandaさん レス有難うございます。

リネームを行う前に、
リネーム後の名前と同じテーブルが存在しているといけないので
リネームを行うタスクの前に、
DROP TABLE :1
:1・・・式で DBNAME('100'Dsource,1)
を実行しました。

次のタスクで
 sp_rename ':1',':2'
を実行する事にしました。

DROPでは :1 を '' で囲わなくてよくて
sp_rename では '' で囲うのですね。

今の所成功です。

その後、何をするかというと
リネームした旧テーブルから
最新レイアウトの新テーブルへの登録リンクです。
(今回の場合、インデックスが変わるだけです。)

30万件とか100万件とかあります。

もっと洗練したやり方もあるのでしょうね。


旧レイアウトから新レイアウトへのコピータスクですが
バッチ、修正、終了条件=No、後置
メインソース=旧レイアウトデータ
 (全カラムを定義)

登録リンク=新本物レイアウトデータ
 (全カラムを定義)

レコード後処理
 ブロック WHILE LOOPCOUNTER()<=項目数
  VarSet('FY'VAR+LoopCounter()-1,
    VarCurr('DW'VAR+LoopCounter()-1))
 ブロック 終了

項目数 54個で34万件をCore2 DUOのスタンドアロンPCで
7分位でした。

今回、売上伝票に伝票番号とは別に「手書き用出荷案内番号」
という項目があったのですが、その項目のみを使った
インデックスを「重複可」で定義していました。

位置付けや照会モードでの上から入力のインクリメンタルサーチ?
って呼ぶのか知りませんが、激しく遅かったです。

手書き出荷案内番号+伝票番号で「重複不可」に変えたら
劇的に早く位置付くようになりました。
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012-3-15 11:19
pu_mahalo  長老 居住地: 大阪  投稿数: 775
こんにちは Puです

私なら で聞いて下さい

現在使用しているテーブル 仮に 得意先M_TBL としましょう
それと 同じ内容で 新しく 得意先M2_TBL を作ります

1回のクエリーで テーブル(Indexも)もデータも作成されます
(サーバーで動作するので かなり高速です)

それでは
select * into 得意先M2_TBL from 得意先M_TBL

上記クエリーで 全て作成してくれます
ただし 既にテーブルがある場合はエラーになりますので
ご注意を
投票数:1 平均点:10.00
depth:
3
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-15 11:50 | 最終変更
nkmt  長老   投稿数: 1668
Puさん いつも有難うございます。

Magic上でデータリポジトリを
コピー元を使って、新しいレイアウトを作りました。

コピー先の項目数を減らしてみました。

SQL Management Studio で
教えて頂いた SQL文を真似て入力し
!実行 ボタンを押してみました。

Magicからの登録リンクでは5〜6分はかかった部分が
今回のSQL文だと30秒、2回目の実験では13秒で終わりました。
凄いですね。

レイアウトが違っていても項目名で複写してくれるのですね。

有難うございました。大変参考になりました。

とここまで書いておかしい事に気が付きました。
Magicのデータ定義は全く生かされていないという事に。
当然ですよね、Management Studioでコピーしただけなので。

でもMagic側からは新しいレイアウトかのような扱いが
出来る訳ですね....。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-15 14:34
Kurogane  常連   投稿数: 50
補足として、単一タスク内でテーブルの有無チェック、削除、
リネームを行なう方法を。

if exists (select * from sysobjects where id = object_id(N'[:2]') and objectproperty(id, N'IsUserTable') = 1)
begin
drop table :2
end

sp_rename ':1',':2'


drop tableはSQLの構文ですが、sp_renameはシステムが予め用意
してくれているストアドプロシージャ(プログラム)ですので、
シングルコーテーションを付けて文字列の扱いとなります。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-15 15:22
nkmt  長老   投稿数: 1668
Kuroganeさん ご回答有難うございます。
drop前に存在確認をしている訳ですね。
勉強になります。
私の今迄の知識の範囲内だとdropタスクに入る前に
DBEXIST関数でチェックしようかな???と思ってました。
(あるいはこのメッセージが出ても大丈夫ですからと
 説明しようかな・・・とか。^^;)
まだまだSQL Serveがらみでわからない所も出てくると思いますが
よろしくお願い申し上げます。
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2012-3-16 9:39
pu_mahalo  長老 居住地: 大阪  投稿数: 775
こんにちは Puです

間違った事を書いてましたので
訂正させていただきます

埋め込みSQLなどで 下記のクエリーを実行した場合
select * into 得意先M2_TBL from 得意先M_TBL
定義はcreateされますが
制約は反映されませんので(index等)後から定義しなくては
なりません

方法としては
Magicから定義取得した後 magicからkeyを作成するか
もしくは ManagementStudioのテーブルを右クリック
==>テーブルをスクリプト化==>createで 元のテーブル情報の
create スクリプトを参照して index の所を抜粋して
copyしたテーブルで実行する


でわ〜で〜
投票数:0 平均点:0.00
depth:
2
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-16 13:09
nkmt  長老   投稿数: 1668
Puさん こんにちは。
レス有難うございます。
なんとなく理解出来ました。

select * into 得意先M2_TBL from 得意先M_TBL
をManagement Studioで実行したら
データ件数はイコールでしたが、
Management Studioで見た時のインデックス領域が極端に
小さくて不思議に思いました。^^
投票数:0 平均点:0.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-16 13:57
pu_mahalo  長老 居住地: 大阪  投稿数: 775
nkmtさん こんにちは Puです

定義があって データだけcopyするなら
insert into が良いですね

magicで1件データをinsertして
truncate して
その後 埋込SQLで
投票数:1 平均点:10.00
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2012-3-16 16:09
Kurogane  常連   投稿数: 50
弊社では一時テーブルも速度が必要な場合はSQLにてテーブルを
定義するのですが、手順として下記のように行なっています。

1.uniPaaSのテーブルリポジトリにテーブルを定義
2.プログラムでテーブルを利用する前にテーブルをオープンする
  だけのタスクをコール(データビューで"D=宣言"のみ)
3.別タスクにて埋め込みSQL等でテーブルに登録
4.テーブルを使い終わったらDbDelで削除(DROP TABLEでも可)

Pervasiveやメモリだと遅いけど、ストアドプロシージャ化する
ほどのものではない、というケースで用いてます。
投票数:1 平均点:10.00

  条件検索へ


Copyright (C) Magic Software Japan K.K. All Rights Reserved.
個人情報保護方針 会員規約