SQL Server テーブル名の変更
- このフォーラムに新しいトピックを立てることはできません
- このフォーラムではゲスト投稿が禁止されています
- depth:
- 0
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
Pervasievの実データの名前の変更は
FileRename関数(旧 IOREN関数)でよく行っていました。
SQL Serverの場合はこの関数では無理だと思うのですが
uniPaaSのプログラムから
名前の変更を行う方法はありますでしょうか?
今はその方法はわからないので
アクション DbCopy('1'DS,'','変更後の名前')
アクション DbDel('1'DS,'')
でやろうと考えています。
(データのコピーが発生するので無駄もありますが
SQL Serverのスクリプトで行う方法もまだ知らない
というのもあるし、uniPaaSのプログラムから実現
したいし・・・)
FileRename関数(旧 IOREN関数)でよく行っていました。
SQL Serverの場合はこの関数では無理だと思うのですが
uniPaaSのプログラムから
名前の変更を行う方法はありますでしょうか?
今はその方法はわからないので
アクション DbCopy('1'DS,'','変更後の名前')
アクション DbDel('1'DS,'')
でやろうと考えています。
(データのコピーが発生するので無駄もありますが
SQL Serverのスクリプトで行う方法もまだ知らない
というのもあるし、uniPaaSのプログラムから実現
したいし・・・)
投票数:0
平均点:0.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
nkmt さん、こんにちは。
関数一覧を見る限り、それしかなさそうですね。SQL にも対応と
書いてありますし。
関数一覧を見る限り、それしかなさそうですね。SQL にも対応と
書いてありますし。
投票数:1
平均点:10.00
Kurogane
投稿数: 50
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
テーブルのコピーは、レコード件数が多いとディスク容量が増加します。
もし件数が多く、埋め込みSQLでも良ければ、下記のスクリプトでいけます。
sp_rename '(スキーマ).旧テーブル名','新テーブル名'
スキーマがdboのままでしたら、テーブル名のみで良いです。
件数が大したことないようでしたら、uniPaaSの関数でも良いかと思います。
もし件数が多く、埋め込みSQLでも良ければ、下記のスクリプトでいけます。
sp_rename '(スキーマ).旧テーブル名','新テーブル名'
スキーマがdboのままでしたら、テーブル名のみで良いです。
件数が大したことないようでしたら、uniPaaSの関数でも良いかと思います。
投票数:1
平均点:10.00
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
Tandaさん Kuroganeさん レス有難うございます。
Magicのタスクで、タスク環境 → SQLコマンドと操作しました。
SQLコマンドという画面が表示され
データベース選択を行い
SQLコマンド欄に
sp_rename '旧テーブル名','新テーブル名'
と記述しました。
するとデータビューに
Q=SQLコマンド と表示されました。
バッチ、照会、終了条件=Yes&後置き にして実行したら
SQL Server上のテーブル名が変更されました。
やり方に問題無いでしょうか?
大変助かりました。有難うございました。
Magicのタスクで、タスク環境 → SQLコマンドと操作しました。
SQLコマンドという画面が表示され
データベース選択を行い
SQLコマンド欄に
sp_rename '旧テーブル名','新テーブル名'
と記述しました。
するとデータビューに
Q=SQLコマンド と表示されました。
バッチ、照会、終了条件=Yes&後置き にして実行したら
SQL Server上のテーブル名が変更されました。
やり方に問題無いでしょうか?
大変助かりました。有難うございました。
投票数:0
平均点:0.00
Kurogane
投稿数: 50
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
その流れで問題ありません。
結果セットを返すSQL文(select文)でしたら、メインテーブルが
あるタスクと同様に(終了条件=No&前置き)
結果セットを返さないSQL文(今回)でしたら、メインテーブルが
ないタスクと同様に(終了条件=Yes&後置き)
埋め込みSQLは集計や単純な一括更新等で用いると、桁違いの速
度を見せますので、チューンアップでは重宝しますね。
結果セットを返すSQL文(select文)でしたら、メインテーブルが
あるタスクと同様に(終了条件=No&前置き)
結果セットを返さないSQL文(今回)でしたら、メインテーブルが
ないタスクと同様に(終了条件=Yes&後置き)
埋め込みSQLは集計や単純な一括更新等で用いると、桁違いの速
度を見せますので、チューンアップでは重宝しますね。
投票数:1
平均点:10.00
Kurogane
投稿数: 50
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
補足として、旧と新のテーブル名を動的としたいのでしたら、
SQL文を下記のようにして、
sp_rename ':1',':2'
下部の「入力パラメータ」の1行目に旧テーブル名を、2行目に
新テーブル名を変数なり式なりで定義すればOKです。
SQL文を下記のようにして、
sp_rename ':1',':2'
下部の「入力パラメータ」の1行目に旧テーブル名を、2行目に
新テーブル名を変数なり式なりで定義すればOKです。
投票数:1
平均点:10.00
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
kurogane様
引き続きのご回答誠にありがとうございました。
引き続きのご回答誠にありがとうございました。
投票数:1
平均点:10.00
Tanda
投稿数: 2151
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
nkmt さん、ついに埋め込み SQL にまで進出ですね。
おめでとうございます。
おめでとうございます。
投票数:0
平均点:0.00
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
おはようございます。
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分位でした。
今回、売上伝票に伝票番号とは別に「手書き用出荷案内番号」
という項目があったのですが、その項目のみを使った
インデックスを「重複可」で定義していました。
位置付けや照会モードでの上から入力のインクリメンタルサーチ?
って呼ぶのか知りませんが、激しく遅かったです。
手書き出荷案内番号+伝票番号で「重複不可」に変えたら
劇的に早く位置付くようになりました。
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
pu_mahalo
居住地: 大阪
投稿数: 775
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
こんにちは Puです
私なら で聞いて下さい
現在使用しているテーブル 仮に 得意先M_TBL としましょう
それと 同じ内容で 新しく 得意先M2_TBL を作ります
1回のクエリーで テーブル(Indexも)もデータも作成されます
(サーバーで動作するので かなり高速です)
それでは
select * into 得意先M2_TBL from 得意先M_TBL
上記クエリーで 全て作成してくれます
ただし 既にテーブルがある場合はエラーになりますので
ご注意を
私なら で聞いて下さい
現在使用しているテーブル 仮に 得意先M_TBL としましょう
それと 同じ内容で 新しく 得意先M2_TBL を作ります
1回のクエリーで テーブル(Indexも)もデータも作成されます
(サーバーで動作するので かなり高速です)
それでは
select * into 得意先M2_TBL from 得意先M_TBL
上記クエリーで 全て作成してくれます
ただし 既にテーブルがある場合はエラーになりますので
ご注意を
投票数:1
平均点:10.00
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
Puさん いつも有難うございます。
Magic上でデータリポジトリを
コピー元を使って、新しいレイアウトを作りました。
コピー先の項目数を減らしてみました。
SQL Management Studio で
教えて頂いた SQL文を真似て入力し
!実行 ボタンを押してみました。
Magicからの登録リンクでは5〜6分はかかった部分が
今回のSQL文だと30秒、2回目の実験では13秒で終わりました。
凄いですね。
レイアウトが違っていても項目名で複写してくれるのですね。
有難うございました。大変参考になりました。
とここまで書いておかしい事に気が付きました。
Magicのデータ定義は全く生かされていないという事に。
当然ですよね、Management Studioでコピーしただけなので。
でもMagic側からは新しいレイアウトかのような扱いが
出来る訳ですね....。
Magic上でデータリポジトリを
コピー元を使って、新しいレイアウトを作りました。
コピー先の項目数を減らしてみました。
SQL Management Studio で
教えて頂いた SQL文を真似て入力し
!実行 ボタンを押してみました。
Magicからの登録リンクでは5〜6分はかかった部分が
今回のSQL文だと30秒、2回目の実験では13秒で終わりました。
凄いですね。
レイアウトが違っていても項目名で複写してくれるのですね。
有難うございました。大変参考になりました。
とここまで書いておかしい事に気が付きました。
Magicのデータ定義は全く生かされていないという事に。
当然ですよね、Management Studioでコピーしただけなので。
でもMagic側からは新しいレイアウトかのような扱いが
出来る訳ですね....。
投票数:0
平均点:0.00
Kurogane
投稿数: 50
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
補足として、単一タスク内でテーブルの有無チェック、削除、
リネームを行なう方法を。
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はシステムが予め用意
してくれているストアドプロシージャ(プログラム)ですので、
シングルコーテーションを付けて文字列の扱いとなります。
リネームを行なう方法を。
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
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
Kuroganeさん ご回答有難うございます。
drop前に存在確認をしている訳ですね。
勉強になります。
私の今迄の知識の範囲内だとdropタスクに入る前に
DBEXIST関数でチェックしようかな???と思ってました。
(あるいはこのメッセージが出ても大丈夫ですからと
説明しようかな・・・とか。^^;)
まだまだSQL Serveがらみでわからない所も出てくると思いますが
よろしくお願い申し上げます。
drop前に存在確認をしている訳ですね。
勉強になります。
私の今迄の知識の範囲内だとdropタスクに入る前に
DBEXIST関数でチェックしようかな???と思ってました。
(あるいはこのメッセージが出ても大丈夫ですからと
説明しようかな・・・とか。^^;)
まだまだSQL Serveがらみでわからない所も出てくると思いますが
よろしくお願い申し上げます。
投票数:0
平均点:0.00
pu_mahalo
居住地: 大阪
投稿数: 775
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
こんにちは Puです
間違った事を書いてましたので
訂正させていただきます
埋め込みSQLなどで 下記のクエリーを実行した場合
select * into 得意先M2_TBL from 得意先M_TBL
定義はcreateされますが
制約は反映されませんので(index等)後から定義しなくては
なりません
方法としては
Magicから定義取得した後 magicからkeyを作成するか
もしくは ManagementStudioのテーブルを右クリック
==>テーブルをスクリプト化==>createで 元のテーブル情報の
create スクリプトを参照して index の所を抜粋して
copyしたテーブルで実行する
でわ〜で〜
間違った事を書いてましたので
訂正させていただきます
埋め込みSQLなどで 下記のクエリーを実行した場合
select * into 得意先M2_TBL from 得意先M_TBL
定義はcreateされますが
制約は反映されませんので(index等)後から定義しなくては
なりません
方法としては
Magicから定義取得した後 magicからkeyを作成するか
もしくは ManagementStudioのテーブルを右クリック
==>テーブルをスクリプト化==>createで 元のテーブル情報の
create スクリプトを参照して index の所を抜粋して
copyしたテーブルで実行する
でわ〜で〜
投票数:0
平均点:0.00
nkmt
投稿数: 1668
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
Puさん こんにちは。
レス有難うございます。
なんとなく理解出来ました。
select * into 得意先M2_TBL from 得意先M_TBL
をManagement Studioで実行したら
データ件数はイコールでしたが、
Management Studioで見た時のインデックス領域が極端に
小さくて不思議に思いました。^^
レス有難うございます。
なんとなく理解出来ました。
select * into 得意先M2_TBL from 得意先M_TBL
をManagement Studioで実行したら
データ件数はイコールでしたが、
Management Studioで見た時のインデックス領域が極端に
小さくて不思議に思いました。^^
投票数:0
平均点:0.00
pu_mahalo
居住地: 大阪
投稿数: 775
![長老 長老](../../uploads/rank3dbf8eb1a72e7.gif)
nkmtさん こんにちは Puです
定義があって データだけcopyするなら
insert into が良いですね
magicで1件データをinsertして
truncate して
その後 埋込SQLで
定義があって データだけcopyするなら
insert into が良いですね
magicで1件データをinsertして
truncate して
その後 埋込SQLで
投票数:1
平均点:10.00
Kurogane
投稿数: 50
![常連 常連](../../uploads/rank3dbf8e9e7d88d.gif)
弊社では一時テーブルも速度が必要な場合はSQLにてテーブルを
定義するのですが、手順として下記のように行なっています。
1.uniPaaSのテーブルリポジトリにテーブルを定義
2.プログラムでテーブルを利用する前にテーブルをオープンする
だけのタスクをコール(データビューで"D=宣言"のみ)
3.別タスクにて埋め込みSQL等でテーブルに登録
4.テーブルを使い終わったらDbDelで削除(DROP TABLEでも可)
Pervasiveやメモリだと遅いけど、ストアドプロシージャ化する
ほどのものではない、というケースで用いてます。
定義するのですが、手順として下記のように行なっています。
1.uniPaaSのテーブルリポジトリにテーブルを定義
2.プログラムでテーブルを利用する前にテーブルをオープンする
だけのタスクをコール(データビューで"D=宣言"のみ)
3.別タスクにて埋め込みSQL等でテーブルに登録
4.テーブルを使い終わったらDbDelで削除(DROP TABLEでも可)
Pervasiveやメモリだと遅いけど、ストアドプロシージャ化する
ほどのものではない、というケースで用いてます。
投票数:1
平均点:10.00